基础 · 02

奇异值分解

任何矩阵都能拆成旋转、缩放、再旋转三步。SVD 是低秩近似、图像压缩、推荐系统背后共同的数学引擎。

12 min read

SVD 定义

线性代数那篇我们看到:对称矩阵可以用特征分解拆成「旋转→缩放→旋转回来」。但大多数实际矩阵不是方阵,也不对称——特征分解不存在。

奇异值分解(Singular Value Decomposition, SVD) 解决了这个问题:对任意 m×nm \times n 矩阵 AA,都存在分解:

A=UΣVA = U \Sigma V^\top

其中:

  • UUm×mm \times m 正交矩阵(UU=IU^\top U = I),列向量叫左奇异向量
  • Σ\Sigmam×nm \times n 对角矩阵,对角元素 σ1σ2σr>0\sigma_1 \geq \sigma_2 \geq \cdots \geq \sigma_r > 0奇异值r=rank(A)r = \text{rank}(A))。
  • VVn×nn \times n 正交矩阵(VV=IV^\top V = I),列向量叫右奇异向量

直觉上,SVD 把一个复杂的线性变换精确分解成三个简单操作的组合:

U旋转2Σ缩放V旋转1\underbrace{U}_{\text{旋转}_2} \cdot \underbrace{\Sigma}_{\text{缩放}} \cdot \underbrace{V^\top}_{\text{旋转}_1}

和特征分解的关系:AAA^\top A 的特征向量就是 VVAAAA^\top 的特征向量就是 UU,奇异值是对应特征值的平方根。

几何解释:旋转→缩放→旋转

以 2D 为例。一个 2×22 \times 2 矩阵 AA 把单位圆变成椭圆。SVD 告诉我们这个变形永远可以拆成三步:

  1. VV^\top(第一次旋转):把输入空间旋转到一组特殊的正交方向上。
  2. Σ\Sigma(缩放):沿这些方向分别拉伸 σ1\sigma_1 倍和 σ2\sigma_2 倍。圆变成了椭圆。
  3. UU(第二次旋转):把椭圆旋转到最终位置。

σ1\sigma_1 是椭圆的长半轴长度,σ2\sigma_2 是短半轴长度。它们量化了矩阵在每个主方向上的「作用强度」。

试试下面的演示——点击步骤按钮逐步观察单位圆如何被分解成三步变形:

分解步骤

单位圆(原始空间)

奇异值

σ₁ = 2.558
σ₂ = 0.977

预设矩阵 A

矩阵 A

[
2.001.000.501.50
]
SVD 将任意矩阵分解为三步: Vᵀ 旋转 → Σ 缩放 → U 旋转。 点击步骤按钮逐步观察单位圆的变形。

这个几何图景的关键洞察:无论矩阵多么复杂,它的本质动作只有旋转和缩放。奇异值告诉你缩放了多少,奇异向量告诉你沿哪个方向。

紧 SVD 与截断 SVD

完整 SVD 保留了所有奇异值。但实际中很多矩阵的奇异值迅速衰减——前几个很大,后面几乎为零。这意味着矩阵的大部分「能量」集中在少数方向上。

紧奇异值分解:只保留 rr 个非零奇异值(r=rank(A)r = \text{rank}(A)):

A=UrΣrVrA = U_r \Sigma_r V_r^\top

其中 UrU_rm×rm \times rΣr\Sigma_rr×rr \times rVrV_rn×rn \times r。这是精确表示,没有信息损失,只是去掉了零空间的部分。

截断奇异值分解:只保留前 kk 个最大的奇异值(k<rk < r):

Ak=UkΣkVk=i=1kσiuiviA_k = U_k \Sigma_k V_k^\top = \sum_{i=1}^{k} \sigma_i \mathbf{u}_i \mathbf{v}_i^\top

这就有损了——AkAA_k \neq A。但信息丢失量是可控的:被丢弃的奇异值越小,近似越精确。

最优低秩近似

截断 SVD 不只是「一种」低秩近似——它是最优的。

Eckart-Young 定理:在所有秩不超过 kk 的矩阵中,AkA_k(截断 SVD)最小化与原矩阵的 Frobenius 范数差:

Ak=argminrank(B)kABFA_k = \arg\min_{\text{rank}(B) \leq k} \|A - B\|_F

误差恰好等于被截掉的奇异值:

AAkF=σk+12+σk+22++σr2\|A - A_k\|_F = \sqrt{\sigma_{k+1}^2 + \sigma_{k+2}^2 + \cdots + \sigma_r^2}

翻译成直觉:想用 kk 个「方向」来近似一个矩阵,最佳策略就是保留奇异值最大的 kk 个方向。 这是一个极其优雅的结论——你不需要搜索所有可能的低秩矩阵,SVD 直接给出答案。

衡量截断 SVD 保留了多少信息,常用能量比

σ12++σk2σ12++σr2\frac{\sigma_1^2 + \cdots + \sigma_k^2}{\sigma_1^2 + \cdots + \sigma_r^2}

实际中,很多自然数据(图像、文本矩阵)的奇异值呈指数衰减,保留前 5%–10% 的奇异值就能捕获 90% 以上的能量。

应用:压缩、推荐、语义

图像压缩

一张 m×nm \times n 灰度图片是一个矩阵。完整存储需要 mnmn 个数字。做秩-kk 截断 SVD 后只需存储 UkU_kmkmk 个数)+ Σk\Sigma_kkk 个数)+ VkV_k^\topknkn 个数)= k(m+n+1)k(m + n + 1) 个数字。

kmin(m,n)k \ll \min(m, n) 时,压缩比非常可观。例如 1000×10001000 \times 1000 的图片,取 k=50k = 50,压缩到原来的 10%\approx 10\% 存储量,而人眼几乎看不出差异。

推荐系统(协同过滤)

用户-物品评分矩阵 RRmm 个用户 × nn 个物品)极度稀疏。对 RR 做低秩近似 RUkΣkVkR \approx U_k \Sigma_k V_k^\top

  • UkU_k 的每一行是用户的 kk 维 embedding。
  • VkV_k 的每一行是物品的 kk 维 embedding。
  • 预测评分 = 用户 embedding 与物品 embedding 的内积。

Netflix Prize 的经典解法 Simon Funk's SVD 就是这个思路。

潜在语义分析(LSA)

词-文档矩阵 XXmm 个词 × nn 个文档)做截断 SVD,得到词的低维表示和文档的低维表示。在这个低维空间里,语义相近的词(即使字面不同)会被映射到相近的向量——这是 Word2Vec 之前最重要的词向量方法。

这个想法在前沿里