上一篇 我们看到 PCA 的核心计算就是 SVD——对中心化数据矩阵 X ~ = U Σ V T \tilde{X} = U\Sigma V^T X ~ = U Σ V T 求前 k k k 个奇异向量。对于一个小规模矩阵,经典 SVD 算法(如 Golub-Kahan 双对角化)完全够用。但当矩阵规模变大时,问题来了。
精确 SVD 的代价 :对一个 m × n m \times n m × n 矩阵,经典 SVD 的复杂度是 O ( m n min ( m , n ) ) O(mn\min(m,n)) O ( mn min ( m , n )) 。考虑一个现实场景——Netflix 的用户-电影评分矩阵大约是 480,000 × 17,000 480{,}000 \times 17{,}000 480 , 000 × 17 , 000 ,全 SVD 的计算量约为 480,000 × 17,000 × 17,000 ≈ 1.4 × 10 14 480{,}000 \times 17{,}000 \times 17{,}000 \approx 1.4 \times 10^{14} 480 , 000 × 17 , 000 × 17 , 000 ≈ 1.4 × 1 0 14 次浮点操作。即使在现代硬件上,这也需要数小时乃至数天。而在实际应用中,我们通常只需要前 k k k (比如 50 或 100)个奇异值和奇异向量——全 SVD 做了太多不必要的工作。
核心思想 :既然我们只要前 k k k 个分量,何不先用一个随机投影 将矩阵压缩到一个远小于原始维度的子空间,然后在这个小子空间里做精确 SVD?只要随机投影足够好——即它大致保持了矩阵的”重要方向”——最终结果就接近精确的截断 SVD。
这就是随机化 SVD (Randomized SVD)的思想。它的理论基础是一个看似违反直觉但异常深刻的结论:随机投影几乎保持距离 ——Johnson-Lindenstrauss 引理。
Johnson-Lindenstrauss 引理
直觉
JL 引理:随机投影几乎保持所有距离 原始空间 ℝᵈ (d 可能很大) d₁₂ f(x) = Ωx/√k Ω: 随机高斯矩阵 投影空间 ℝᵏ (k ≥ 8 ln N / ε²) d'₁₂ (1−ε)‖xᵢ−xⱼ‖² ≤ ‖f(xᵢ)−f(xⱼ)‖² ≤ (1+ε)‖xᵢ−xⱼ‖²
想象你有 N N N 个点散布在 R d \mathbb{R}^d R d 中,d d d 很大(比如 10,000 维)。你想把这些点投影到低维空间(比如 k = 50 k = 50 k = 50 维)以便存储和计算。一般来说,降维必然丢失信息,点与点之间的距离会被扭曲。
但 Johnson-Lindenstrauss(JL)引理告诉我们一个惊人的事实:只要目标维度 k k k 与 ln N \ln N ln N 成正比,一个随机 线性投影就能同时保持所有点对之间的距离 ,失真不超过 ε \varepsilon ε 。
注意这里的关键词:
随机 :不需要精心设计投影矩阵,随机高斯矩阵就够了
同时 :不是保持某一对点的距离,而是所有 ( N 2 ) \binom{N}{2} ( 2 N ) 对的距离
与 d d d 无关 :目标维度只取决于点数 N N N 和容差 ε \varepsilon ε ,与原始维度 d d d 完全无关
严格陈述
引理 (Johnson & Lindenstrauss, 1984):给定 0 < ε < 1 0 < \varepsilon < 1 0 < ε < 1 和 N N N 个点 x 1 , … , x N ∈ R d \mathbf{x}_1, \ldots, \mathbf{x}_N \in \mathbb{R}^d x 1 , … , x N ∈ R d ,若
k ≥ 8 ln N ε 2 k \geq \frac{8\ln N}{\varepsilon^2} k ≥ ε 2 8 l n N
则随机线性映射 f ( x ) = 1 k Ω x f(\mathbf{x}) = \frac{1}{\sqrt{k}}\Omega\mathbf{x} f ( x ) = k 1 Ω x (其中 Ω ∈ R k × d \Omega \in \mathbb{R}^{k \times d} Ω ∈ R k × d ,每个元素独立采样自 N ( 0 , 1 ) \mathcal{N}(0, 1) N ( 0 , 1 ) )以高概率满足:对所有 1 ≤ i , j ≤ N 1 \leq i, j \leq N 1 ≤ i , j ≤ N (即全部 ( N 2 ) \binom{N}{2} ( 2 N ) 个点对),
( 1 − ε ) ∥ x i − x j ∥ 2 ≤ ∥ f ( x i ) − f ( x j ) ∥ 2 ≤ ( 1 + ε ) ∥ x i − x j ∥ 2 (1 - \varepsilon)\|\mathbf{x}_i - \mathbf{x}_j\|^2 \leq \|f(\mathbf{x}_i) - f(\mathbf{x}_j)\|^2 \leq (1 + \varepsilon)\|\mathbf{x}_i - \mathbf{x}_j\|^2 ( 1 − ε ) ∥ x i − x j ∥ 2 ≤ ∥ f ( x i ) − f ( x j ) ∥ 2 ≤ ( 1 + ε ) ∥ x i − x j ∥ 2
注意:经典陈述用”存在线性映射”,但证明是构造性 的——你不需要搜索这个映射,随机生成 Ω \Omega Ω 就行,它大概率满足条件。
“随机投影”是什么? 就是矩阵乘法 y = 1 k Ω x \mathbf{y} = \frac{1}{\sqrt{k}}\Omega\mathbf{x} y = k 1 Ω x 。原始向量 x ∈ R d \mathbf{x} \in \mathbb{R}^d x ∈ R d ,结果 y ∈ R k \mathbf{y} \in \mathbb{R}^k y ∈ R k (k ≪ d k \ll d k ≪ d )。Ω \Omega Ω 的每一行是 R d \mathbb{R}^d R d 中的一个随机方向,y i = 1 k ω i T x y_i = \frac{1}{\sqrt{k}}\boldsymbol{\omega}_i^T\mathbf{x} y i = k 1 ω i T x 就是 x \mathbf{x} x 在这个随机方向上的投影分量。k k k 个随机方向一起,把高维信息”压缩”到 k k k 维。1 / k 1/\sqrt{k} 1/ k 是归一化因子,使得 ∥ y ∥ 2 \|\mathbf{y}\|^2 ∥ y ∥ 2 在期望意义下等于 ∥ x ∥ 2 \|\mathbf{x}\|^2 ∥ x ∥ 2 。
逐项理解各参数:
ε \varepsilon ε (epsilon):允许的最大相对失真。ε = 0.1 \varepsilon = 0.1 ε = 0.1 意味着距离最多变化 10%
N N N :总点数。k k k 的下界与 ln N \ln N ln N 成正比,因为需要对全部 ( N 2 ) < N 2 / 2 \binom{N}{2} < N^2/2 ( 2 N ) < N 2 /2 个点对做 union bound——点越多,需要更高的维度来保证所有对同时不失真。但增长只是对数的 :点数翻 10 10 10 倍,k k k 只需多 8 ln 10 / ε 2 ≈ 18 / ε 2 8\ln 10 / \varepsilon^2 \approx 18/\varepsilon^2 8 ln 10/ ε 2 ≈ 18/ ε 2
k ≥ 8 ln N / ε 2 k \geq 8\ln N / \varepsilon^2 k ≥ 8 ln N / ε 2 :目标维度的下界,与原始维度 d d d 完全无关。N = 1,000,000 N = 1{,}000{,}000 N = 1 , 000 , 000 个点、ε = 0.1 \varepsilon = 0.1 ε = 0.1 时,k ≥ 8 × ln ( 10 6 ) / 0.01 ≈ 11,053 k \geq 8 \times \ln(10^6) / 0.01 \approx 11{,}053 k ≥ 8 × ln ( 1 0 6 ) /0.01 ≈ 11 , 053 ——从任意高维降到约一万维,所有距离保持 90%-110%
1 / k 1/\sqrt{k} 1/ k 是必须的吗? 不是。不除的话,∥ Ω x ∥ 2 \|\Omega\mathbf{x}\|^2 ∥Ω x ∥ 2 的期望是 k ∥ x ∥ 2 k\|\mathbf{x}\|^2 k ∥ x ∥ 2 ——所有距离被统一放大 k k k 倍,但 JL 保证的相对 失真不受全局缩放影响(集中不等式控制的是 ∥ Ω x ∥ 2 / ( k ∥ x ∥ 2 ) \|\Omega\mathbf{x}\|^2/(k\|\mathbf{x}\|^2) ∥Ω x ∥ 2 / ( k ∥ x ∥ 2 ) 偏离 1 的程度)。如果只关心距离的排序(如最近邻搜索),1 / k 1/\sqrt{k} 1/ k 完全不需要;如果需要投影后的距离在绝对数值 上近似原始距离,就加上它。加 1 / k 1/\sqrt{k} 1/ k 使 E [ ∥ f ( x ) ∥ 2 ] = ∥ x ∥ 2 \mathbb{E}[\|f(\mathbf{x})\|^2] = \|\mathbf{x}\|^2 E [ ∥ f ( x ) ∥ 2 ] = ∥ x ∥ 2 ,公式更干净。
证明思路
完整证明超出本文范围,但核心思路值得一看。关键在于一个集中不等式 (concentration inequality):
对单个向量 x \mathbf{x} x ,随机投影 f ( x ) = 1 k Ω x f(\mathbf{x}) = \frac{1}{\sqrt{k}}\Omega\mathbf{x} f ( x ) = k 1 Ω x 的范数平方 ∥ f ( x ) ∥ 2 \|f(\mathbf{x})\|^2 ∥ f ( x ) ∥ 2 是 k k k 个独立卡方变量之和(经缩放)。由 Hoeffding 不等式(或更精确的 sub-Gaussian 尾界):
Pr [ ∣ ∥ f ( x ) ∥ 2 − ∥ x ∥ 2 ∣ > ε ∥ x ∥ 2 ] ≤ 2 exp ( − k ε 2 8 ) \Pr\Big[\big|\|f(\mathbf{x})\|^2 - \|\mathbf{x}\|^2\big| > \varepsilon\|\mathbf{x}\|^2\Big] \leq 2\exp\!\Big(-\frac{k\varepsilon^2}{8}\Big) Pr [ ∥ f ( x ) ∥ 2 − ∥ x ∥ 2 > ε ∥ x ∥ 2 ] ≤ 2 exp ( − 8 k ε 2 )
将 x \mathbf{x} x 替换为 x i − x j \mathbf{x}_i - \mathbf{x}_j x i − x j ,就得到单个点对的距离保持概率。对全部 ( N 2 ) < N 2 / 2 \binom{N}{2} < N^2/2 ( 2 N ) < N 2 /2 个点对取 union bound:
Pr [ 存在某对距离失真超过 ε ] < N 2 exp ( − k ε 2 8 ) \Pr[\text{存在某对距离失真超过 } \varepsilon] < N^2 \exp\!\Big(-\frac{k\varepsilon^2}{8}\Big) Pr [ 存在某对距离失真超过 ε ] < N 2 exp ( − 8 k ε 2 )
令右边 < 1 < 1 < 1 ,即 k > 8 ln N / ε 2 k > 8\ln N / \varepsilon^2 k > 8 ln N / ε 2 ——这就是 JL 引理的维度要求。
深层含义 :JL 引理的力量在于它的通用性 。不需要对数据做任何假设(无需低秩、无需稀疏、无需特殊分布),只要目标维度足够大,随机投影就能保持距离。这为随机化算法提供了坚实的理论基础。
可视化
用下面的交互组件亲手体验 JL 引理。我们生成 d = 50 d = 50 d = 50 维的随机高斯点,投影到 k k k 维,然后在散点图中对比每对点的原始距离和投影距离。如果 JL 引理成立,所有点应该落在对角线附近的 ( 1 ± ε ) (1 \pm \varepsilon) ( 1 ± ε ) 容差带内。
试试:先用很小的 k k k (如 2-3),观察点偏离对角线的程度;然后逐渐增大 k k k ,观察点如何收敛到对角线。
Johnson-Lindenstrauss 引理:随机投影保持距离
高维点对 → 随机投影到低维 → 对比成对距离
0.0 3.5 6.9 10.4 13.9 17.4 0.0 3.5 6.9 10.4 13.9 17.4 原始距离(高维) 投影距离(低维) 理想保持线 y = x (1±ε) 容差带 (ε=0.3) 超出容差带 距离保持统计
原始维度 d: 50 投影维度 k k: 8 < 303 (JL 理论下界) 落入容差带的点对: 345/435 (79.3%) 最大失真: 63.6% 平均失真: 19.0%
从 JL 到随机化 SVD
JL 引理保证了随机投影保持距离。但随机化 SVD 需要更强的性质:随机投影不仅要保持距离,还要捕获矩阵的主要列空间 。这正是 Halko、Martinsson 和 Tropp(2011)在其里程碑论文中系统发展的理论。
关键洞察
设 A ∈ R m × n A \in \mathbb{R}^{m \times n} A ∈ R m × n 的精确截断 SVD 为 A k = U k Σ k V k T A_k = U_k\Sigma_k V_k^T A k = U k Σ k V k T ,其中 U k ∈ R m × k U_k \in \mathbb{R}^{m \times k} U k ∈ R m × k 的列张成了 A A A 的前 k k k 个左奇异向量构成的子空间。
目标 :找到一个 m × k m \times k m × k (或略大)的正交矩阵 Q Q Q ,使得 Q Q Q 的列空间近似 U k U_k U k 的列空间。为什么这就够了?因为 Q Q T QQ^T Q Q T 是到 Q Q Q 列空间的正交投影,而 A k = U k Σ k V k T = U k ( U k T A ) A_k = U_k\Sigma_kV_k^T = U_k(U_k^TA) A k = U k Σ k V k T = U k ( U k T A ) 本质上是 A A A 到 U k U_k U k 列空间的投影。如果两个列空间近似相同,两个投影也近似相同:Q Q T A ≈ U k U k T A = A k QQ^TA \approx U_kU_k^TA = A_k Q Q T A ≈ U k U k T A = A k 。一旦有了这样的 Q Q Q ,就可以在 Q Q Q 张成的小空间里做精确 SVD。
随机投影的作用 :取随机矩阵 Ω ∈ R n × ( k + p ) \Omega \in \mathbb{R}^{n \times (k+p)} Ω ∈ R n × ( k + p ) (p p p 是过采样参数,通常取 5-10),计算
Y = A Ω ∈ R m × ( k + p ) Y = A\Omega \in \mathbb{R}^{m \times (k+p)} Y = A Ω ∈ R m × ( k + p )
每一列 Y j = A ω j Y_j = A\boldsymbol{\omega}_j Y j = A ω j 是 A A A 列空间的一个随机采样。由于 A A A 的前 k k k 个奇异方向”权重最大”(奇异值 σ 1 ≥ ⋯ ≥ σ k \sigma_1 \geq \cdots \geq \sigma_k σ 1 ≥ ⋯ ≥ σ k 远大于 σ k + 1 , … \sigma_{k+1}, \ldots σ k + 1 , … ),这些随机采样倾向于落在前 k k k 个奇异方向张成的子空间附近。Y Y Y 的列空间就是我们要找的近似子空间。
Halko-Martinsson-Tropp 算法
Halko-Martinsson-Tropp 算法:两阶段流水线
阶段 1:构建近似列空间 A m×n Ω n×(k+p) 随机 Y=AΩ m×(k+p) Q (QR) m×(k+p) × Q 阶段 2:小空间精确分解 B=QᵀA (k+p)×n SVD(B) 精确 SVD U=QÛ,Σ,Vᵀ 近似截断 SVD 总复杂度 O(mn(k+p)),远优于全 SVD O(mn·min(m,n))
算法步骤
输入 :矩阵 A ∈ R m × n A \in \mathbb{R}^{m \times n} A ∈ R m × n ,目标秩 k k k ,过采样参数 p p p (默认 p = 5 p = 5 p = 5 或 10 10 10 )
阶段 1——构建近似列空间 :
生成随机测试矩阵 Ω ∈ R n × ( k + p ) \Omega \in \mathbb{R}^{n \times (k+p)} Ω ∈ R n × ( k + p ) ,元素 Ω i j ∼ N ( 0 , 1 ) \Omega_{ij} \sim \mathcal{N}(0,1) Ω ij ∼ N ( 0 , 1 )
计算采样矩阵 Y = A Ω ∈ R m × ( k + p ) Y = A\Omega \in \mathbb{R}^{m \times (k+p)} Y = A Ω ∈ R m × ( k + p )
对 Y Y Y 做 QR 分解:Y = Q R Y = QR Y = QR ,取 Q ∈ R m × ( k + p ) Q \in \mathbb{R}^{m \times (k+p)} Q ∈ R m × ( k + p ) (正交基)
阶段 2——在小空间中精确分解 :
4. 计算小矩阵 B = Q T A ∈ R ( k + p ) × n B = Q^T A \in \mathbb{R}^{(k+p) \times n} B = Q T A ∈ R ( k + p ) × n
5. 对 B B B 做精确 SVD:B = U ^ Σ V T B = \hat{U}\Sigma V^T B = U ^ Σ V T
6. 恢复左奇异向量:U = Q U ^ U = Q\hat{U} U = Q U ^
输出 :A ≈ U Σ V T A \approx U\Sigma V^T A ≈ U Σ V T (截断到前 k k k 列即得秩 k k k 近似)
逐步解读
每一步在做什么?
步骤 1-2 (随机采样):Y = A Ω Y = A\Omega Y = A Ω 生成 A A A 列空间的 k + p k+p k + p 个随机线性组合。过采样参数 p p p 的作用是提供额外的”安全余量”——即使某些随机方向碰巧与重要奇异方向正交(概率很小但非零),额外的 p p p 个方向也能弥补。实践中 p = 5 ∼ 10 p = 5 \sim 10 p = 5 ∼ 10 就足够了(见 Halko et al., 2011, Section 1.4)。
步骤 3 (QR 分解):将 Y Y Y 的列正交化,得到列空间的正交基 Q Q Q 。Q Q Q 的列空间与 Y Y Y 的列空间相同,但数值上更稳定。
步骤 4 (换基降维):B = Q T A B = Q^T A B = Q T A 把 A A A 的每一列从标准基换到 Q Q Q 的列向量构成的基下,得到投影后的坐标 (( k + p ) × n (k+p) \times n ( k + p ) × n 矩阵)。严格来说投影是 Q Q T A QQ^TA Q Q T A (换基再换回),Q T A Q^TA Q T A 只做了前半步——但由于后面还要在小空间里做 SVD 再用 Q Q Q 换回(步骤 6),前半步就够了。
步骤 5-6 (精确 SVD + 恢复):在小空间中做精确 SVD 代价很低。U = Q U ^ U = Q\hat{U} U = Q U ^ 把小空间中的奇异向量映射回原始空间。
伪代码
function RandomizedSVD(A, k, p=5):
n = cols(A)
# 阶段 1: 构建近似列空间
Omega = randn(n, k+p) # 随机高斯矩阵
Y = A @ Omega # m × (k+p)
Q, _ = qr(Y) # 正交化
# 阶段 2: 小空间精确 SVD
B = Q.T @ A # (k+p) × n
U_hat, Sigma, Vt = svd(B) # 精确 SVD
U = Q @ U_hat # 恢复到原空间
# 截断到秩 k
return U[:, :k], Sigma[:k], Vt[:k, :]
幂迭代加速
幂迭代:放大奇异值间距 原始 σᵢ σ₁ σ₂ σ₃ σ₄ σ₅ σ₆ 间距×1.3 1 次幂迭代 σᵢ³ σ₁ σ₂ σ₃ σ₄ σ₅ σ₆ 间距×2.1 2 次幂迭代 σᵢ⁵ σ₁ σ₂ σ₃ σ₄ σ₅ σ₆ 间距×3.3 幂迭代将 σₖ/σₖ₊₁ 的间距从 r 放大到 r²ᵠ⁺¹ —— 使随机采样更容易区分前 k 个方向
当奇异值衰减缓慢时(即 σ k \sigma_k σ k 和 σ k + 1 \sigma_{k+1} σ k + 1 相差不大),基础算法的精度可能不够。幂迭代 (power iteration)可以放大奇异值之间的差距。
思路:将步骤 2 中的 Y = A Ω Y = A\Omega Y = A Ω 替换为
Y = ( A A T ) q A Ω Y = (AA^T)^q A\Omega Y = ( A A T ) q A Ω
其中 q q q 是幂迭代次数(通常 q = 1 q = 1 q = 1 或 2 2 2 就够)。A A A 的奇异值为 σ i \sigma_i σ i ,则 ( A A T ) q A (AA^T)^q A ( A A T ) q A 的奇异值为 σ i 2 q + 1 \sigma_i^{2q+1} σ i 2 q + 1 。如果原来 σ k / σ k + 1 = 1.1 \sigma_k / \sigma_{k+1} = 1.1 σ k / σ k + 1 = 1.1 ,一次幂迭代后变为 ( 1.1 ) 3 ≈ 1.33 (1.1)^3 \approx 1.33 ( 1.1 ) 3 ≈ 1.33 ,两次后变为 ( 1.1 ) 5 ≈ 1.61 (1.1)^5 \approx 1.61 ( 1.1 ) 5 ≈ 1.61 ——间隔被指数级放大,随机采样更容易捕获前 k k k 个方向。
复杂度分析
步骤 操作 复杂度 Y = A Ω Y = A\Omega Y = A Ω 矩阵乘法 O ( m n ( k + p ) ) O(mn(k+p)) O ( mn ( k + p )) Y = Q R Y = QR Y = QR QR 分解 O ( m ( k + p ) 2 ) O(m(k+p)^2) O ( m ( k + p ) 2 ) B = Q T A B = Q^TA B = Q T A 矩阵乘法 O ( m n ( k + p ) ) O(mn(k+p)) O ( mn ( k + p )) SVD of B B B 精确 SVD O ( ( k + p ) 2 n ) O((k+p)^2 n) O (( k + p ) 2 n ) U = Q U ^ U = Q\hat{U} U = Q U ^ 矩阵乘法 O ( m ( k + p ) 2 ) O(m(k+p)^2) O ( m ( k + p ) 2 )
总计 :O ( m n ( k + p ) ) O(mn(k+p)) O ( mn ( k + p )) (矩阵乘法主导)。
与精确 SVD 对比 :
精确全 SVD:O ( m n min ( m , n ) ) O(mn\min(m,n)) O ( mn min ( m , n ))
截断 SVD(Lanczos/ARPACK):O ( m n k ) O(mnk) O ( mnk ) (但需多次 pass,且不易并行)
随机化 SVD:O ( m n ( k + p ) ) O(mn(k+p)) O ( mn ( k + p )) ,只需一次 pass (计算 Y = A Ω Y = A\Omega Y = A Ω ),天然适合并行和 streaming 场景
对于 Netflix 矩阵(m = 480,000 m = 480{,}000 m = 480 , 000 , n = 17,000 n = 17{,}000 n = 17 , 000 , k = 50 k = 50 k = 50 , p = 10 p = 10 p = 10 ):
全 SVD:∼ 1.4 × 10 14 \sim 1.4 \times 10^{14} ∼ 1.4 × 1 0 14 操作
随机化 SVD:∼ 480,000 × 17,000 × 60 ≈ 4.9 × 10 11 \sim 480{,}000 \times 17{,}000 \times 60 \approx 4.9 \times 10^{11} ∼ 480 , 000 × 17 , 000 × 60 ≈ 4.9 × 1 0 11 操作
加速约 300 倍 ,且以极高概率给出几乎相同的前 50 个奇异值和奇异向量。
误差界
随机化 SVD 的理论保证来自 Halko et al.(2011, Theorem 10.5, 10.6)。
期望误差
设 A A A 的精确截断 SVD 为 A k = U k Σ k V k T A_k = U_k\Sigma_k V_k^T A k = U k Σ k V k T (Eckart-Young 最佳近似 ),则随机化 SVD 的输出 A ~ k \tilde{A}_k A ~ k 满足:
E ∥ A − A ~ k ∥ F ≤ ( 1 + k p − 1 ) 1 / 2 ⋅ ( ∑ j > k σ j 2 ) 1 / 2 \mathbb{E}\|A - \tilde{A}_k\|_F \leq \left(1 + \frac{k}{p-1}\right)^{1/2} \cdot \left(\sum_{j>k}\sigma_j^2\right)^{1/2} E ∥ A − A ~ k ∥ F ≤ ( 1 + p − 1 k ) 1/2 ⋅ ( ∑ j > k σ j 2 ) 1/2
逐项理解:
( ∑ j > k σ j 2 ) 1 / 2 = ∥ A − A k ∥ F \left(\sum_{j>k}\sigma_j^2\right)^{1/2} = \|A - A_k\|_F ( ∑ j > k σ j 2 ) 1/2 = ∥ A − A k ∥ F 是精确截断 SVD 的误差(Eckart-Young 下界),无论什么方法都不可能比这更好
( 1 + k / ( p − 1 ) ) 1 / 2 (1 + k/(p-1))^{1/2} ( 1 + k / ( p − 1 ) ) 1/2 是随机化带来的额外代价因子。当 p = k p = k p = k (过采样等于目标秩)时,这个因子约为 2 \sqrt{2} 2 ——误差至多增大 41%。实践中 p = 5 ∼ 10 p = 5 \sim 10 p = 5 ∼ 10 配合幂迭代即可让这个因子接近 1
Spectral 范数误差
对于谱范数(Art. 4 范数与条件数 中定义的 ∥ ⋅ ∥ 2 \|\cdot\|_2 ∥ ⋅ ∥ 2 ),类似的界为:
E ∥ A − A ~ k ∥ 2 ≤ ( 1 + k p − 1 ) σ k + 1 + e k + p p ( ∑ j > k σ j 2 ) 1 / 2 \mathbb{E}\|A - \tilde{A}_k\|_2 \leq \left(1 + \sqrt{\frac{k}{p-1}}\right)\sigma_{k+1} + \frac{e\sqrt{k+p}}{p}\left(\sum_{j>k}\sigma_j^2\right)^{1/2} E ∥ A − A ~ k ∥ 2 ≤ ( 1 + p − 1 k ) σ k + 1 + p e k + p ( ∑ j > k σ j 2 ) 1/2
当奇异值快速衰减(σ k + 1 ≪ σ k \sigma_{k+1} \ll \sigma_k σ k + 1 ≪ σ k )时,第一项主导,误差接近最优的 σ k + 1 \sigma_{k+1} σ k + 1 。
直觉总结
随机化 SVD 的核心交易 :用 O ( m n ( k + p ) ) O(mn(k+p)) O ( mn ( k + p )) 的计算量(远低于全 SVD)换取一个( 1 + δ ) (1+\delta) ( 1 + δ ) 倍最优的近似,其中 δ \delta δ 由过采样参数 p p p 控制,且以指数概率趋于零。
数值例子
让我们用一个小例子验证算法的正确性。
设 A ∈ R 6 × 4 A \in \mathbb{R}^{6 \times 4} A ∈ R 6 × 4 是一个秩 2 矩阵加微弱噪声:
A = [ 3 1 0 2 1 0 ] [ 1 0 1 0 ] ⏟ σ 1 ≈ large + [ 0 1 2 0 1 2 ] [ 0 1 0 1 ] ⏟ σ 2 ≈ medium + 0.01 ⋅ noise ⏟ σ 3 , σ 4 ≈ 0 A = \underbrace{\begin{bmatrix}3\\1\\0\\2\\1\\0\end{bmatrix}\begin{bmatrix}1&0&1&0\end{bmatrix}}_{\sigma_1 \approx \text{large}} + \underbrace{\begin{bmatrix}0\\1\\2\\0\\1\\2\end{bmatrix}\begin{bmatrix}0&1&0&1\end{bmatrix}}_{\sigma_2 \approx \text{medium}} + \underbrace{0.01 \cdot \text{noise}}_{\sigma_3, \sigma_4 \approx 0} A = σ 1 ≈ large 3 1 0 2 1 0 [ 1 0 1 0 ] + σ 2 ≈ medium 0 1 2 0 1 2 [ 0 1 0 1 ] + σ 3 , σ 4 ≈ 0 0.01 ⋅ noise
假设我们只想要前 k = 2 k = 2 k = 2 个奇异值。取 p = 2 p = 2 p = 2 ,所以随机矩阵 Ω ∈ R 4 × 4 \Omega \in \mathbb{R}^{4 \times 4} Ω ∈ R 4 × 4 。
计算 Y = A Ω Y = A\Omega Y = A Ω :Y Y Y 是 6 × 4 6 \times 4 6 × 4 矩阵。由于 A A A 几乎是秩 2 的,Y Y Y 的列几乎都落在前两个奇异向量张成的 2 维子空间内(加微弱噪声扰动)
QR 分解 :Q Q Q 的前两列精确捕获了这个 2 维子空间
小空间 SVD :B = Q T A B = Q^T A B = Q T A 是 4 × 4 4 \times 4 4 × 4 ,对它做 SVD 代价极低
截断 :取前 k = 2 k = 2 k = 2 个分量,得到的 A ~ 2 \tilde{A}_2 A ~ 2 与精确的 A 2 A_2 A 2 几乎相同
关键观察:A A A 的前两个奇异值远大于后两个(因为构造如此),所以随机投影几乎不会”遗漏”重要方向。奇异值衰减越快,随机化 SVD 越准确。
实践要点
何时用随机化 SVD
矩阵巨大但只需前 k k k 个分量 :这是最常见的场景。k ≪ min ( m , n ) k \ll \min(m,n) k ≪ min ( m , n ) 时加速最显著
矩阵只能做矩阵-向量乘法 (如稀疏矩阵、隐式矩阵):随机化 SVD 只需要 A Ω A\Omega A Ω 和 A T Q A^T Q A T Q 两次矩阵乘法,不需要显式访问 A A A 的元素
Streaming / single-pass :数据按行/按块到达,每次更新 Y Y Y 即可
主流实现
库 函数 备注 scikit-learn TruncatedSVD(algorithm='randomized')默认算法 scipy scipy.sparse.linalg.svds支持稀疏矩阵 Facebook (Meta) fbpca.pca专为大规模优化 cuML (RAPIDS) cuml.decomposition.TruncatedSVDGPU 加速
scikit-learn 的 TruncatedSVD 和 PCA 默认使用随机化 SVD(algorithm='randomized'),而非精确分解。绝大多数用户在调用 PCA(n_components=50) 时,实际执行的就是本文描述的 Halko-Martinsson-Tropp 算法。
总结与展望
本文建立了两个核心工具:
Johnson-Lindenstrauss 引理 :N N N 个高维点可以被随机投影到 O ( ln N / ε 2 ) O(\ln N / \varepsilon^2) O ( ln N / ε 2 ) 维,同时保持所有成对距离在 ( 1 ± ε ) (1 \pm \varepsilon) ( 1 ± ε ) 以内。目标维度只取决于点数和容差,与原始维度无关——这是随机化算法的理论基石
随机化 SVD (Halko-Martinsson-Tropp, 2011):通过随机投影将矩阵压缩到 k + p k + p k + p 维子空间,再在小空间做精确 SVD。复杂度从 O ( m n min ( m , n ) ) O(mn\min(m,n)) O ( mn min ( m , n )) 降到 O ( m n ( k + p ) ) O(mn(k+p)) O ( mn ( k + p )) ,误差至多比 Eckart-Young 最优界差一个由 p p p 控制的常数因子
关键公式回顾:
JL 维度要求 :k ≥ 8 ln N / ε 2 k \geq 8\ln N / \varepsilon^2 k ≥ 8 ln N / ε 2
随机投影 :f ( x ) = 1 k Ω x f(\mathbf{x}) = \frac{1}{\sqrt{k}}\Omega\mathbf{x} f ( x ) = k 1 Ω x ,Ω i j ∼ N ( 0 , 1 ) \Omega_{ij} \sim \mathcal{N}(0,1) Ω ij ∼ N ( 0 , 1 )
核心步骤 :Y = A Ω → Q = orth ( Y ) → B = Q T A → SVD ( B ) Y = A\Omega \to Q = \text{orth}(Y) \to B = Q^TA \to \text{SVD}(B) Y = A Ω → Q = orth ( Y ) → B = Q T A → SVD ( B )
误差界 :E ∥ A − A ~ k ∥ F ≤ ( 1 + k / ( p − 1 ) ) 1 / 2 ∥ A − A k ∥ F \mathbb{E}\|A - \tilde{A}_k\|_F \leq (1 + k/(p-1))^{1/2}\|A - A_k\|_F E ∥ A − A ~ k ∥ F ≤ ( 1 + k / ( p − 1 ) ) 1/2 ∥ A − A k ∥ F
随机化 SVD 是 Part 1 “拆”阶段从精确分解走向可扩展分解的关键一步。后续的应用文章——矩阵补全 、NMF 、Robust PCA ——中的大规模计算几乎都依赖随机化技术加速核心的 SVD 步骤。更远处,Part 3 “汇”中 LoRA 的低秩适配和 Efficient Attention 的低秩近似,同样植根于”大矩阵有低秩结构,可以用少量随机采样捕获”这一洞察。