在线性代数那篇我们看到:对称矩阵可以用特征分解拆成「旋转→缩放→旋转回来」。但大多数实际矩阵不是方阵,也不对称——特征分解不存在。
奇异值分解(Singular Value Decomposition, SVD) 解决了这个问题:对任意 m×n 矩阵 A,都存在分解:
A=UΣV⊤
其中:
- U 是 m×m 正交矩阵(U⊤U=I),列向量叫左奇异向量。
- Σ 是 m×n 对角矩阵,对角元素 σ1≥σ2≥⋯≥σr>0 叫奇异值(r=rank(A))。
- V 是 n×n 正交矩阵(V⊤V=I),列向量叫右奇异向量。
直觉上,SVD 把一个复杂的线性变换精确分解成三个简单操作的组合:
旋转2U⋅缩放Σ⋅旋转1V⊤
和特征分解的关系:A⊤A 的特征向量就是 V,AA⊤ 的特征向量就是 U,奇异值是对应特征值的平方根。
以 2D 为例。一个 2×2 矩阵 A 把单位圆变成椭圆。SVD 告诉我们这个变形永远可以拆成三步:
- V⊤(第一次旋转):把输入空间旋转到一组特殊的正交方向上。
- Σ(缩放):沿这些方向分别拉伸 σ1 倍和 σ2 倍。圆变成了椭圆。
- U(第二次旋转):把椭圆旋转到最终位置。
σ1 是椭圆的长半轴长度,σ2 是短半轴长度。它们量化了矩阵在每个主方向上的「作用强度」。
试试下面的演示——点击步骤按钮逐步观察单位圆如何被分解成三步变形:
SVD 将任意矩阵分解为三步: Vᵀ 旋转 → Σ 缩放 → U 旋转。 点击步骤按钮逐步观察单位圆的变形。
这个几何图景的关键洞察:无论矩阵多么复杂,它的本质动作只有旋转和缩放。奇异值告诉你缩放了多少,奇异向量告诉你沿哪个方向。
完整 SVD 保留了所有奇异值。但实际中很多矩阵的奇异值迅速衰减——前几个很大,后面几乎为零。这意味着矩阵的大部分「能量」集中在少数方向上。
紧奇异值分解:只保留 r 个非零奇异值(r=rank(A)):
A=UrΣrVr⊤
其中 Ur 是 m×r,Σr 是 r×r,Vr 是 n×r。这是精确表示,没有信息损失,只是去掉了零空间的部分。
截断奇异值分解:只保留前 k 个最大的奇异值(k<r):
Ak=UkΣkVk⊤=i=1∑kσiuivi⊤
这就有损了——Ak=A。但信息丢失量是可控的:被丢弃的奇异值越小,近似越精确。
截断 SVD 不只是「一种」低秩近似——它是最优的。
Eckart-Young 定理:在所有秩不超过 k 的矩阵中,Ak(截断 SVD)最小化与原矩阵的 Frobenius 范数差:
Ak=argrank(B)≤kmin∥A−B∥F
误差恰好等于被截掉的奇异值:
∥A−Ak∥F=σk+12+σk+22+⋯+σr2
翻译成直觉:想用 k 个「方向」来近似一个矩阵,最佳策略就是保留奇异值最大的 k 个方向。 这是一个极其优雅的结论——你不需要搜索所有可能的低秩矩阵,SVD 直接给出答案。
衡量截断 SVD 保留了多少信息,常用能量比:
σ12+⋯+σr2σ12+⋯+σk2
实际中,很多自然数据(图像、文本矩阵)的奇异值呈指数衰减,保留前 5%–10% 的奇异值就能捕获 90% 以上的能量。
一张 m×n 灰度图片是一个矩阵。完整存储需要 mn 个数字。做秩-k 截断 SVD 后只需存储 Uk(mk 个数)+ Σk(k 个数)+ Vk⊤(kn 个数)= k(m+n+1) 个数字。
当 k≪min(m,n) 时,压缩比非常可观。例如 1000×1000 的图片,取 k=50,压缩到原来的 ≈10% 存储量,而人眼几乎看不出差异。
用户-物品评分矩阵 R(m 个用户 × n 个物品)极度稀疏。对 R 做低秩近似 R≈UkΣkVk⊤:
- Uk 的每一行是用户的 k 维 embedding。
- Vk 的每一行是物品的 k 维 embedding。
- 预测评分 = 用户 embedding 与物品 embedding 的内积。
Netflix Prize 的经典解法 Simon Funk's SVD 就是这个思路。
词-文档矩阵 X(m 个词 × n 个文档)做截断 SVD,得到词的低维表示和文档的低维表示。在这个低维空间里,语义相近的词(即使字面不同)会被映射到相近的向量——这是 Word2Vec 之前最重要的词向量方法。