什么是奇异值分解
奇异值分解(英语:Singular value decomposition,缩写:SVD)是线性代数中一种重要的矩阵分解,在信号处理、统计学等领域有重要应用。奇异值分解在某些方面与对称矩阵或埃尔米特矩阵基于特征向量的对角化类似,这两种矩阵分解尽管有其相关性,但还是有明显的不同。对称阵特征向量分解的基础是谱分析,而奇异值分解则是谱分析理论在任意矩阵上的推广。
奇异值分解的表示形式
假设一个 m ∗ n m * n m ∗ n 的矩阵 A A A ,其奇异值分解的表示形式为:
A m × n = U m × m Σ m × n V n × n T A_{m \times n} = U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T A m × n = U m × m Σ m × n V n × n T
其中,V T V^T V T 和U U U 都是正交矩阵。
正交矩阵
数学定义 :满足 M T M = M M T = I M^T M = M M^T = I M T M = M M T = I 的方阵,其逆矩阵等于转置矩阵(M − 1 = M T M^{-1} = M^T M − 1 = M T )。
代数特性 :行/列向量两两垂直(正交)且长度均为 1,构成了空间中的一组标准正交基。
几何意义 :在矩阵变换中仅负责空间旋转 或镜像翻转 ,不改变向量的长度和夹角(保持刚体形态)。
奇异值分解的具体含义
假设有一个维度为 n n n 的向量 x x x
对于V T V^T V T 来说,V T x V^T x V T x 等同于计算在V V V 这个坐标系下,原先的向量x x x 对应的位置。
我们记 x 1 = V T x x_1 = V^T x x 1 = V T x
对于Σ \Sigma Σ 来说,Σ x 1 \Sigma x_1 Σ x 1 等同于计算在V V V 这个坐标系下,沿各个方向的伸缩程度。
我们记 x 2 = Σ x 1 = Σ V T x x_2 = \Sigma x_1 = \Sigma V^T x x 2 = Σ x 1 = Σ V T x
对于U U U 来说,U x 2 U x_2 U x 2 等同于向量x 2 x_2 x 2 映射到U U U 这个坐标系。
我们记 x 3 = U x 2 = U Σ x 1 = U Σ V T x x_3 = U x_2 = U \Sigma x_1 = U \Sigma V^T x x 3 = U x 2 = U Σ x 1 = U Σ V T x
奇异值的如何计算
对于任意对称矩阵 M M M (如 A T A A^TA A T A ),其特征值分解形式为 M = W Λ W T M = W \Lambda W^T M = W Λ W T (其中 W W W 为正交矩阵,Λ \Lambda Λ 为对角矩阵)。
由此可得:
A T A = M n × n = W n × n Λ n × n W n × n T \begin{aligned}
A^T A &= M_{n \times n} \\
&= W_{n \times n} \Lambda_{n \times n} W_{n \times n}^T
\end{aligned} A T A = M n × n = W n × n Λ n × n W n × n T
另一方面,将 A A A 的奇异值分解 A = U Σ V T A = U \Sigma V^T A = U Σ V T 代入上式展开:
A T A = ( U m × m Σ m × n V n × n T ) T ( U m × m Σ m × n V n × n T ) = V n × n Σ n × m T U m × m T U m × m Σ m × n V n × n T = V n × n ( Σ n × m T Σ m × n ) V n × n T = V n × n Λ n × n V n × n T \begin{aligned}
A^T A &= (U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T)^T (U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T) \\
&= V_{n \times n} \Sigma_{n \times m}^T U_{m \times m}^T U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T \\
&= V_{n \times n} (\Sigma_{n \times m}^T \Sigma_{m \times n}) V_{n \times n}^T \\
&= V_{n \times n} \Lambda_{n \times n} V_{n \times n}^T
\end{aligned} A T A = ( U m × m Σ m × n V n × n T ) T ( U m × m Σ m × n V n × n T ) = V n × n Σ n × m T U m × m T U m × m Σ m × n V n × n T = V n × n ( Σ n × m T Σ m × n ) V n × n T = V n × n Λ n × n V n × n T
通过对比上述两种矩阵对角化的形式,我们可以确定:A T A A^TA A T A 的特征向量矩阵 W W W 可以作为右奇异矩阵 V V V 的一个解。
同理,对于左奇异矩阵 U U U ,我们可以通过构建对称矩阵 A A T A A^T A A T 来进行推导。
假设我们对矩阵 A A T A A^T A A T 进行特征值分解(EVD):
A A T = N m × m = P m × m Λ m × m P m × m T \begin{aligned}
A A^T &= N_{m \times m}\\
&= P_{m \times m} \Lambda_{m \times m} P_{m \times m}^T
\end{aligned} A A T = N m × m = P m × m Λ m × m P m × m T
其中,P P P 是由 A A T A A^T A A T 的特征向量正交单位化后组成的矩阵,Λ \Lambda Λ 是对应的特征值对角矩阵。
而根据 SVD 的定义 A = U Σ V T A = U \Sigma V^T A = U Σ V T ,代入可得:
A A T = ( U m × m Σ m × n V n × n T ) ( U m × m Σ m × n V n × n T ) T = U m × m Σ m × n V n × n T V n × n Σ n × m T U m × m T \begin{aligned}
A A^T &= (U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T) (U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T)^T \\
&= U_{m \times m} \Sigma_{m \times n} V_{n \times n}^T V_{n \times n} \Sigma_{n \times m}^T U_{m \times m}^T
\end{aligned} A A T = ( U m × m Σ m × n V n × n T ) ( U m × m Σ m × n V n × n T ) T = U m × m Σ m × n V n × n T V n × n Σ n × m T U m × m T
因为 V V V 是正交矩阵,满足 V T V = I n × n V^T V = I_{n \times n} V T V = I n × n ,所以上式可以化简为:
A A T = U m × m ( Σ m × n Σ n × m T ) U m × m T = U m × m Λ m × m U m × m T \begin{aligned}
A A^T &= U_{m \times m} (\Sigma_{m \times n} \Sigma_{n \times m}^T) U_{m \times m}^T \\
&= U_{m \times m} \Lambda_{m \times m} U_{m \times m}^T
\end{aligned} A A T = U m × m ( Σ m × n Σ n × m T ) U m × m T = U m × m Λ m × m U m × m T
因此,通过对比两组对角化形式,我们可以确定:P P P 可以是 U U U 的一个解。
通过对比特征值分解与奇异值分解的展开式,我们同样可以推导得到中间奇异值矩阵 Σ \Sigma Σ 的求解方式。
由前述推导可知,特征值对角矩阵 Λ \Lambda Λ 与奇异值矩阵 Σ \Sigma Σ 满足如下关系:
Λ n × n = Σ n × m T Σ m × n Λ m × m = Σ m × n Σ n × m T \begin{aligned}
\Lambda_{n \times n} &= \Sigma_{n \times m}^T \Sigma_{m \times n} \\
\Lambda_{m \times m} &= \Sigma_{m \times n} \Sigma_{n \times m}^T
\end{aligned} Λ n × n Λ m × m = Σ n × m T Σ m × n = Σ m × n Σ n × m T
展开对角矩阵的乘法映射,对于对角线上的每一个元素,有如下对应关系:
λ i = σ i 2 σ i = λ i \begin{aligned}
\lambda_i &= \sigma_i^2 \\
\sigma_i &= \sqrt{\lambda_i}
\end{aligned} λ i σ i = σ i 2 = λ i
注意
这里的每一个λ \lambda λ 都是大于等于0的,因为A T A A^T A A T A 是半正定 的,即:
x T ( A T A ) x ≥ 0 x^T (A^T A) x \ge 0 x T ( A T A ) x ≥ 0
通过对比上述矩阵对角线的映射关系,我们可以确定:中间奇异值矩阵 Σ \Sigma Σ 的非零对角元素 σ i \sigma_i σ i 即为矩阵 A T A A^TA A T A (或 A A T AA^T A A T )特征值 λ i \lambda_i λ i 的算术平方根。在结构上,只需将 σ i \sigma_i σ i 构造在与原矩阵 A A A 维度完全相同的 m × n m \times n m × n 对角矩阵中即可。
如何计算奇异值分解?
对于方阵
import torch
def compute_svd (A: torch.Tensor ):
s_eig, V = torch.linalg.eigh(A.T @ A)
s_eig = torch.flip(s_eig, dims=[0 ])
V = torch.flip(V, dims=[1 ])
S_val = torch.sqrt(torch.clamp(s_eig, min =0.0 ) + 1e-12 )
U_reduced = (A @ V) / S_val.unsqueeze(0 )
return U_reduced, torch.diag(S_val), V.T
1. 计算右奇异矩阵 V V V 和奇异值 Σ \Sigma Σ
对矩阵 A T A A^T A A T A 进行实对称特征值分解(即调用 torch.linalg.eigh)。
特征值处理 :将解出的特征值由大到小降序排列,直接开根号(即对元素执行 torch.sqrt)得到奇异值。构造出对角矩阵 Σ \Sigma Σ 。
向量对齐 :将特征向量矩阵的列按照对应的特征值降序同步翻转,得到最终的右奇异矩阵 V V V 。
2. 联动计算左奇异矩阵 U U U 的有效列
不独立求解 A A T A A^T A A T ,而是直接通过 A A A 和已求出的 V V V 、Σ \Sigma Σ 进行反向逆推,求出紧凑版的左奇异矩阵 U 部分 U_{\text{部分}} U 部分 :
U 部分 = A V Σ − 1 U_{\text{部分}} = A V \Sigma^{-1} U 部分 = A V Σ − 1
在代码中,这等价于计算矩阵乘法 A × V A \times V A × V ,然后将结果的每一列分别除以对应的非零奇异值 σ i \sigma_i σ i 。此时 U U U 与 V V V 的空间正负号完全绑定对齐。
3. 正交化补全维度(仅在需要 Full SVD 时)
如果需要将 U U U 补全为 m × m m \times m m × m 的完备方阵(如 full_matrices=True):
算法会在内核中利用施密特正交化(Gram-Schmidt) ,人为产生与已有列向量全部严格垂直、且模长为 1 的新向量,直接拼接塞入矩阵剩余的空位中。
奇异值分解的另一种表达形式
外积展开形式 (Outer Product Expansion)矩阵形式的 A = U Σ V T A = U \Sigma V^T A = U Σ V T
实际上可以转译为数个低秩矩阵相加的线性组合。这种形式能最直观地体现“奇异值大小决定信息量大小”的本质。
假设 A A A 的秩为 r r r ,u i u_i u i 为 U U U 的第 i i i 个列向量,v i v_i v i 为 V V V 的第 i i i 个列向量(则 v i T v_i^T v i T 为 V T V^T V T 的第 i i i 个行向量):
A = ∑ i = 1 r σ i u i v i T = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + ⋯ + σ r u r v r T A = \sum_{i=1}^{r} \sigma_i u_i v_i^T = \sigma_1 u_1 v_1^T + \sigma_2 u_2 v_2^T + \dots + \sigma_r u_r v_r^T A = ∑ i = 1 r σ i u i v i T = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + ⋯ + σ r u r v r T
结构拆解
每一个 u i v i T u_i v_i^T u i v i T 都是一个大小为 m × n m \times n m × n 、但秩严格等于 1 的基础矩阵。
物理意义:原矩阵 A A A 被拆解成了 r r r 个秩为 1 的“子图层/子矩阵”的叠加,而每个图层所分配的权重(清晰度/能量),正好就是对应的奇异值 σ i \sigma_i σ i 。