近似矩阵乘法
矩阵乘法是线性代数中的基本运算,也是众多科学计算和机器学习算法的核心操作。然而,随着数据规模的增长,精确矩阵乘法的计算复杂度变得难以承受。近似矩阵乘法应运而生,它通过牺牲一定的精度来换取计算效率的提升。
近似矩阵乘法的基本概念
在介绍近似矩阵乘法之前,我们先回顾一下精确矩阵乘法。给定两个矩阵 A ∈ R m × n A \in \mathbb{R}^{m \times n} A∈Rm×n 和 B ∈ R n × p B \in \mathbb{R}^{n \times p} B∈Rn×p,它们的乘积 C = A × B ∈ R m × p C = A \times B \in \mathbb{R}^{m \times p} C=A×B∈Rm×p 定义为:
C i j = ∑ k = 1 n A i k ⋅ B k j C_{ij} = \sum_{k=1}^{n} A_{ik} \cdot B_{kj} Cij=k=1∑nAik⋅Bkj
对于维度较大的矩阵(如当 m m m、 n n n、 p p p 很大时),这种计算的时间复杂度为 O ( m n p ) O(mnp) O(mnp),在 m = n = p m=n=p m=n=p 的情况下即为 O ( n 3 ) O(n^3) O(n3)。这种复杂度在大规模计算中往往难以接受。
近似矩阵乘法的核心思想是找到一种方法,使得计算结果 C ~ \tilde{C} C~ 与真实结果 C C C 足够接近,同时大幅降低计算复杂度。形式上,我们希望:
∥ C − C ~ ∥ ≤ ϵ ∥ A ∥ ∥ B ∥ \|C - \tilde{C}\| \leq \epsilon \|A\| \|B\| ∥C−C~∥≤ϵ∥A∥∥B∥
其中 ϵ \epsilon ϵ 是一个小的误差容忍度, ∥ ⋅ ∥ \|\cdot\| ∥⋅∥ 表示某种矩阵范数。
从数学上看,近似矩阵乘法可以视为一个优化问题:
min C ~ C ( C ~ ) s.t. ∥ C − C ~ ∥ ≤ ϵ ∥ A ∥ ∥ B ∥ \min_{\tilde{C}} \mathcal{C}(\tilde{C}) \quad \text{s.t.} \quad \|C - \tilde{C}\| \leq \epsilon \|A\| \|B\| C~minC(C~)s.t.∥C−C~∥≤ϵ∥A∥∥B∥
其中 C ( C ~ ) \mathcal{C}(\tilde{C}) C(C~) 是计算 C ~ \tilde{C} C~ 的复杂度函数。
低秩近似方法
奇异值分解(SVD)
奇异值分解是近似矩阵乘法中最基础的方法之一。给定矩阵 A ∈ R m × n A \in \mathbb{R}^{m \times n} A∈Rm×n,其SVD分解为:
A = U Σ V T = ∑ i = 1 r σ i u i v i T A = U \Sigma V^T = \sum_{i=1}^{r} \sigma_i u_i v_i^T A=UΣVT=i=1∑rσiuiviT
其中 U = [ u 1 , u 2 , … , u m ] ∈ R m × m U = [u_1, u_2, \ldots, u_m] \in \mathbb{R}^{m \times m} U=[u1,u2,…,um]∈Rm×m 和 V = [ v 1 , v 2 , … , v n ] ∈ R n × n V = [v_1, v_2, \ldots, v_n] \in \mathbb{R}^{n \times n} V=[v1,v2,…,vn]∈Rn×n 是正交矩阵, Σ ∈ R m × n \Sigma \in \mathbb{R}^{m \times n} Σ∈Rm×n 是对角矩阵,对角线上的元素 σ 1 ≥ σ 2 ≥ . . . ≥ σ r > 0 \sigma_1 \geq \sigma_2 \geq ... \geq \sigma_r > 0 σ1≥σ2≥...≥σr>0 称为奇异值, r = rank ( A ) ≤ min ( m , n ) r = \text{rank}(A) \leq \min(m,n) r=rank(A)≤min(m,n)。
低秩近似的思想是只保留前 k k k 个最大的奇异值及其对应的奇异向量,得到 A A A 的秩为 k k k 的最佳近似:
A k = ∑ i = 1 k σ i u i v i T = U k Σ k V k T A_k = \sum_{i=1}^{k} \sigma_i u_i v_i^T = U_k \Sigma_k V_k^T Ak=i=1∑kσiuiviT=UkΣkVkT
其中 U k ∈ R m × k U_k \in \mathbb{R}^{m \times k} Uk∈Rm×k, Σ k ∈ R k × k \Sigma_k \in \mathbb{R}^{k \times k} Σk∈Rk×k, V k ∈ R n × k V_k \in \mathbb{R}^{n \times k} Vk∈Rn×k。
Eckart-Young定理表明, A k A_k Ak 是所有秩不超过 k k k 的矩阵中,在Frobenius范数和谱范数下最接近 A A A 的矩阵:
∥ A − A k ∥ F = min rank ( X ) ≤ k ∥ A − X ∥ F = ∑ i = k + 1 r σ i 2 \|A - A_k\|_F = \min_{\text{rank}(X) \leq k} \|A - X\|_F = \sqrt{\sum_{i=k+1}^{r} \sigma_i^2} ∥A−Ak∥F=rank(X)≤kmin∥A−X∥F=i=k+1∑rσi2
∥ A − A k ∥ 2 = min rank ( X ) ≤ k ∥ A − X ∥ 2 = σ k + 1 \|A - A_k\|_2 = \min_{\text{rank}(X) \leq k} \|A - X\|_2 = \sigma_{k+1} ∥A−Ak∥2=rank(X)≤kmin∥A−X∥2=σk+1
类似地,我们可以对矩阵 B B B 进行低秩近似: B l = P l Λ l Q l T B_l = P_l \Lambda_l Q_l^T Bl=PlΛlQlT。然后,矩阵乘积可以近似为:
C ≈ C ~ = A k B l = ( U k Σ k V k T ) ( P l Λ l Q l T ) C \approx \tilde{C} = A_k B_l = (U_k \Sigma_k V_k^T)(P_l \Lambda_l Q_l^T) C≈C~=AkBl=(UkΣkVkT)(PlΛlQlT)
这种计算的复杂度为 O ( m k + k l + l p ) O(mk + kl + lp) O(mk+kl+lp),当 k k k 和 l l l 远小于原始维度时,可以显著降低计算量。
近似的误差分析可以通过矩阵范数的性质得到:
∥ A B − A k B l ∥ F ≤ ∥ A − A k ∥ F ∥ B ∥ F + ∥ A k ∥ F ∥ B − B l ∥ F \|AB - A_kB_l\|_F \leq \|A - A_k\|_F \|B\|_F + \|A_k\|_F \|B - B_l\|_F ∥AB−AkBl∥F≤∥A−Ak∥F∥B∥F+∥Ak∥F∥B−Bl∥F
≤ ∑ i = k + 1 r A σ i 2 ( A ) ∥ B ∥ F + ∑ i = 1 k σ i 2 ( A ) ∑ j = l + 1 r B σ j 2 ( B ) \leq \sqrt{\sum_{i=k+1}^{r_A} \sigma_i^2(A)} \|B\|_F + \sqrt{\sum_{i=1}^{k} \sigma_i^2(A)} \sqrt{\sum_{j=l+1}^{r_B} \sigma_j^2(B)} ≤i=k+1∑rAσi2(A)∥B∥F+i=1∑kσi2(A)j=l+1∑rBσj2(B)
其中 r A r_A rA 和 r B r_B rB 分别是 A A A 和 B B B 的秩。
随机化SVD
尽管SVD提供了最优的低秩近似,但计算完整的SVD本身就是一个复杂的过程。随机化SVD通过引入随机投影来加速这一过程。基本步骤如下:
- 生成随机矩阵 Ω ∈ R n × ( k + p ) \Omega \in \mathbb{R}^{n \times (k+p)} Ω∈Rn×(k+p),其中 p p p 是一个小的过采样参数
- 计算 Y = A Ω Y = A\Omega Y=AΩ
- 对 Y Y Y 进行QR分解,得到 Y = Q R Y = QR Y=QR
- 计算 B = Q T A B = Q^T A B=QTA
- 对小矩阵 B B B 进行SVD: B = U ~ Σ V T B = \tilde{U} \Sigma V^T B=U~ΣVT
- 计算 U = Q U ~ U = Q\tilde{U} U=QU~
随机化SVD的理论基础是Johnson-Lindenstrauss引理和随机投影的性质。可以证明,当 Ω \Omega Ω 的元素是独立同分布的高斯随机变量时,存在常数 C C C 和 c c c,使得以概率至少 1 − δ 1-\delta 1−δ:
∥ A − Q Q T A ∥ F ≤ ( 1 + C ( k + p ) / p ) ∥ A − A k ∥ F + e k + p p ∥ A ∥ F δ \|A - Q Q^T A\|_F \leq (1 + C\sqrt{(k+p)/p}) \|A - A_k\|_F + \frac{e\sqrt{k+p}}{\sqrt{p}} \|A\|_F \delta ∥A−QQTA∥F≤(1+C(k+p)/p)∥A−Ak∥F+pek+p∥A∥Fδ
当过采样参数 p p p 适当选择时,这个误差界接近于最优低秩近似的误差界。
进一步地,可以证明随机化SVD得到的近似 A ^ k = U Σ V T \hat{A}_k = U\Sigma V^T A^k=UΣVT 满足:
E [ ∥ A − A ^ k ∥ F 2 ] ≤ ( 1 + k p − 1 ) ∥ A − A k ∥ F 2 \mathbb{E}[\|A - \hat{A}_k\|_F^2] \leq (1 + \frac{k}{p-1}) \|A - A_k\|_F^2 E[∥A−A^k∥F2]≤(1+p−1k)∥A−Ak∥F2
这表明随机化SVD在期望意义上接近于最优低秩近似。
随机投影方法
Johnson-Lindenstrauss变换
Johnson-Lindenstrauss引理告诉我们,包含 n n n 个点的欧几里得空间中的点集 S S S,可以嵌入到 d = O ( log n / ϵ 2 ) d = O(\log n / \epsilon^2) d=O(logn/ϵ2) 维空间,同时保持点之间距离的相对误差在 ( 1 ± ϵ ) (1 \pm \epsilon) (1±ϵ) 之内。
基于这一原理,我们可以设计随机投影矩阵 R ∈ R n × d R \in \mathbb{R}^{n \times d} R∈Rn×d ( d ≪ n d \ll n d≪n),并将矩阵乘法近似为:
C ≈ C ~ = ( A R ) ( B R ) T C \approx \tilde{C} = (AR)(BR)^T C≈C~=(AR)(BR)T
其中 A R ∈ R m × d AR \in \mathbb{R}^{m \times d} AR∈Rm×d, B R ∈ R p × d BR \in \mathbb{R}^{p \times d} BR∈Rp×d。这样计算的复杂度降为 O ( m n d + n p d + m p d ) O(mnd + npd + mpd) O(mnd+npd+mpd),当 d d d 远小于 n n n 时,效率提升显著。
常用的随机投影矩阵包括:
- 高斯随机投影: R i j ∼ N ( 0 , 1 / d ) R_{ij} \sim N(0, 1/d) Rij∼N(0,1/d)
- 稀疏随机投影: R i j = { + s / d 概率为 1 / 2 s 0 概率为 1 − 1 / s − s / d 概率为 1 / 2 s R_{ij} = \begin{cases} +\sqrt{s/d} & \text{概率为} 1/2s \\ 0 & \text{概率为} 1-1/s \\ -\sqrt{s/d} & \text{概率为} 1/2s \end{cases} Rij=⎩ ⎨ ⎧+s/d0−s/d概率为1/2s概率为1−1/s概率为1/2s
其中 s s s 是稀疏度参数。
对于高斯随机投影,可以证明对于任意固定向量 x , y ∈ R n x, y \in \mathbb{R}^n x,y∈Rn,当 d = O ( log ( 1 / δ ) / ϵ 2 ) d = O(\log(1/\delta)/\epsilon^2) d=O(log(1/δ)/ϵ2) 时,以概率至少 1 − δ 1-\delta 1−δ:
( 1 − ϵ ) ∥ x ∥ 2 ∥ y ∥ 2 ≤ d ⋅ ( R x ) T ( R y ) ≤ ( 1 + ϵ ) ∥ x ∥ 2 ∥ y ∥ 2 (1-\epsilon) \|x\|_2 \|y\|_2 \leq d \cdot (Rx)^T (Ry) \leq (1+\epsilon) \|x\|_2 \|y\|_2 (1−ϵ)∥x∥2∥y∥2≤d⋅(Rx)T(Ry)≤(1+ϵ)∥x∥2∥y∥2
这意味着随机投影近似保留了向量内积,从而保留了矩阵乘法的结构。
更精确地,对于矩阵乘法 C = A B C = AB C=AB,可以证明:
E [ ∥ ( A R ) ( B R ) T − A B ∥ F 2 ] = ∥ A ∥ F 2 ∥ B ∥ F 2 d \mathbb{E}[\|(AR)(BR)^T - AB\|_F^2] = \frac{\|A\|_F^2 \|B\|_F^2}{d} E[∥(AR)(BR)T−AB∥F2]=d∥A∥F2∥B∥F2
这表明当 d d d 增大时,近似的误差按 1 / d 1/d 1/d 的速率减小。
伪随机变换
完全随机的矩阵仍需生成和存储大量随机数,为了进一步提高效率,可以使用结构化随机矩阵,如:
R = 1 d D H S R = \frac{1}{\sqrt{d}} D H S R=d1DHS
其中 D D D 是随机对角矩阵,对角元素为独立的 ± 1 \pm 1 ±1 随机变量; H H H 是Hadamard矩阵,定义为 H n = [ H n / 2 H n / 2 H n / 2 − H n / 2 ] H_n = \begin{bmatrix} H_{n/2} & H_{n/2} \\ H_{n/2} & -H_{n/2} \end{bmatrix} Hn=[Hn/2Hn/2Hn/2−Hn/2], H 1 = [ 1 ] H_1 = [1] H1=[1]; S S S 是随机抽样矩阵,从单位矩阵 I n I_n In 中随机选择 d d d 列组成。使用这种结构化随机矩阵,矩阵-向量乘法 R x Rx Rx 的复杂度可以从 O ( n d ) O(nd) O(nd) 降低到 O ( n log d ) O(n \log d) O(nlogd),进一步提高了效率。
Ailon和Chazelle证明了这种伪随机变换仍然满足Johnson-Lindenstrauss引理,即对于任意固定向量 x , y ∈ R n x, y \in \mathbb{R}^n x,y∈Rn,当 d = O ( log ( 1 / δ ) / ϵ 2 ) d = O(\log(1/\delta)/\epsilon^2) d=O(log(1/δ)/ϵ2) 时,以概率至少 1 − δ 1-\delta 1−δ:
( 1 − ϵ ) ∥ x ∥ 2 ∥ y ∥ 2 ≤ d ⋅ ( R x ) T ( R y ) ≤ ( 1 + ϵ ) ∥ x ∥ 2 ∥ y ∥ 2 (1-\epsilon) \|x\|_2 \|y\|_2 \leq d \cdot (Rx)^T (Ry) \leq (1+\epsilon) \|x\|_2 \|y\|_2 (1−ϵ)∥x∥2∥y∥2≤d⋅(Rx)T(Ry)≤(1+ϵ)∥x∥2∥y∥2
蒙特卡洛采样方法
基本蒙特卡洛方法
蒙特卡洛方法的核心思想是通过随机采样来近似矩阵乘法。考虑矩阵乘积 C = A B C = AB C=AB,我们可以将其表示为:
C i j = ∑ k = 1 n A i k B k j = n ⋅ E K [ A i K B K j ] C_{ij} = \sum_{k=1}^{n} A_{ik} B_{kj} = n \cdot \mathbb{E}_{K}[A_{iK} B_{Kj}] Cij=k=1∑nAikBkj=n⋅EK[AiKBKj]
其中 K K K 是在 { 1 , 2 , . . . , n } \{1, 2, ..., n\} {1,2,...,n} 上均匀分布的随机变量。通过对 K K K 进行多次采样,我们可以得到 C i j C_{ij} Cij 的无偏估计:
C ~ i j = n s ∑ t = 1 s A i K t B K t j \tilde{C}_{ij} = \frac{n}{s} \sum_{t=1}^{s} A_{iK_t} B_{K_tj} C~ij=snt=1∑sAiKtBKtj
其中 s s s 是采样次数, K 1 , K 2 , . . . , K s K_1, K_2, ..., K_s K1,K2,...,Ks 是独立同分布的随机下标。当 s ≪ n s \ll n s≪n 时,计算复杂度可以从 O ( m n p ) O(mnp) O(mnp) 降低到 O ( m p s ) O(mps) O(mps)。
该估计的方差为:
Var ( C ~ i j ) = n 2 s ⋅ Var ( A i K B K j ) = n 2 s ( 1 n ∑ k = 1 n ( A i k B k j ) 2 − ( 1 n ∑ k = 1 n A i k B k j ) 2 ) \text{Var}(\tilde{C}_{ij}) = \frac{n^2}{s} \cdot \text{Var}(A_{iK} B_{Kj}) = \frac{n^2}{s} \left( \frac{1}{n} \sum_{k=1}^{n} (A_{ik} B_{kj})^2 - \left( \frac{1}{n} \sum_{k=1}^{n} A_{ik} B_{kj} \right)^2 \right) Var(C~ij)=sn2⋅Var(AiKBKj)=sn2 n1k=1∑n(AikBkj)2−(n1k=1∑nAikBkj)2
根据Hoeffding不等式,对于任意固定的 i , j i, j i,j,当 s ≥ 2 n 2 log ( 2 / δ ) ϵ 2 ∥ A i : ∥ 2 2 ∥ B : j ∥ 2 2 s \geq \frac{2n^2 \log(2/\delta)}{\epsilon^2 \|A_{i:}\|_2^2 \|B_{:j}\|_2^2} s≥ϵ2∥Ai:∥22∥B:j∥222n2log(2/δ) 时,以概率至少 1 − δ 1-\delta 1−δ:
∣ C ~ i j − C i j ∣ ≤ ϵ ∥ A i : ∥ 2 ∥ B : j ∥ 2 |\tilde{C}_{ij} - C_{ij}| \leq \epsilon \|A_{i:}\|_2 \|B_{:j}\|_2 ∣C~ij−Cij∣≤ϵ∥Ai:∥2∥B:j∥2
其中 A i : A_{i:} Ai: 是 A A A 的第 i i i 行, B : j B_{:j} B:j 是 B B B 的第 j j j 列。
重要性采样
基本蒙特卡洛方法的问题在于方差可能较大,导致估计不稳定。重要性采样通过引入非均匀采样概率来降低方差。具体来说,我们选择概率分布:
p ( k ) = ∥ A : , k ∥ 2 ∥ B k , : ∥ 2 ∑ l = 1 n ∥ A : , l ∥ 2 ∥ B l , : ∥ 2 p(k) = \frac{\|A_{:,k}\|_2 \|B_{k,:}\|_2}{\sum_{l=1}^{n} \|A_{:,l}\|_2 \|B_{l,:}\|_2} p(k)=∑l=1n∥A:,l∥2∥Bl,:∥2∥A:,k∥2∥Bk,:∥2
其中 A : , k A_{:,k} A:,k 表示 A A A 的第 k k k 列, B k , : B_{k,:} Bk,: 表示 B B B 的第 k k k 行。相应的估计为:
C ~ i j = ∑ t = 1 s 1 s ⋅ p ( K t ) A i K t B K t j \tilde{C}_{ij} = \sum_{t=1}^{s} \frac{1}{s \cdot p(K_t)} A_{iK_t} B_{K_tj} C~ij=t=1∑ss⋅p(Kt)1AiKtBKtj
可以证明这个估计是无偏的,即 E [ C ~ i j ] = C i j \mathbb{E}[\tilde{C}_{ij}] = C_{ij} E[C~ij]=Cij。更重要的是,它的方差比均匀采样小:
Var ( C ~ i j ) = 1 s ∑ k = 1 n ( A i k B k j ) 2 p ( k ) − 1 s C i j 2 \text{Var}(\tilde{C}_{ij}) = \frac{1}{s} \sum_{k=1}^{n} \frac{(A_{ik} B_{kj})^2}{p(k)} - \frac{1}{s} C_{ij}^2 Var(C~ij)=s1k=1∑np(k)(AikBkj)2−s1Cij2
通过适当选择概率分布 p ( k ) p(k) p(k),可以显著降低估计的方差。理论上最优的采样分布是:
p ∗ ( k ) = ∣ A i k B k j ∣ ∑ l = 1 n ∣ A i l B l j ∣ p^*(k) = \frac{|A_{ik} B_{kj}|}{\sum_{l=1}^{n} |A_{il} B_{lj}|} p∗(k)=∑l=1n∣AilBlj∣∣AikBkj∣
然而,这个分布取决于特定的 i , j i, j i,j,难以在实践中直接应用。因此,我们通常使用上述基于列范数和行范数的分布,它在整体上提供了良好的方差减小效果。
Drineas等人证明了,当使用重要性采样时,对于 δ ∈ ( 0 , 1 ) \delta \in (0, 1) δ∈(0,1) 和 ϵ > 0 \epsilon > 0 ϵ>0,如果采样数
s ≥ 68 ∥ A ∥ F 2 ∥ B ∥ F 2 ϵ 2 ∥ A B ∥ F 2 ln ( 2 δ ) s \geq \frac{68 \|A\|_F^2 \|B\|_F^2}{\epsilon^2 \|AB\|_F^2} \ln\left(\frac{2}{\delta}\right) s≥ϵ2∥AB∥F268∥A∥F2∥B∥F2ln(δ2)
则以概率至少 1 − δ 1-\delta 1−δ:
∥ A B − C ~ ∥ F 2 ≤ ϵ 2 ∥ A B ∥ F 2 \|AB - \tilde{C}\|_F^2 \leq \epsilon^2 \|AB\|_F^2 ∥AB−C~∥F2≤ϵ2∥AB∥F2
张量分解方法
CP分解
对于高维张量的计算,可以通过张量分解方法实现近似。CP(CANDECOMP/PARAFAC)分解将张量表示为多个秩为1的张量之和:
T ≈ ∑ r = 1 R a r ⊗ b r ⊗ c r ⊗ ⋯ \mathcal{T} \approx \sum_{r=1}^{R} a_r \otimes b_r \otimes c_r \otimes \cdots T≈r=1∑Rar⊗br⊗cr⊗⋯
其中 ⊗ \otimes ⊗ 表示张量积, R R R 是分解的秩。将矩阵视为二阶张量,CP分解等价于矩阵的低秩分解。
形式上,对于三阶张量 T ∈ R I × J × K \mathcal{T} \in \mathbb{R}^{I \times J \times K} T∈RI×J×K,其CP分解可以写为:
T i j k ≈ ∑ r = 1 R a i r b j r c k r \mathcal{T}_{ijk} \approx \sum_{r=1}^{R} a_{ir} b_{jr} c_{kr} Tijk≈r=1∑Rairbjrckr
其中 a r ∈ R I a_r \in \mathbb{R}^I ar∈RI, b r ∈ R J b_r \in \mathbb{R}^J br∈RJ, c r ∈ R K c_r \in \mathbb{R}^K cr∈RK。
CP分解可以通过交替最小二乘(ALS)方法求解。给定一个张量 T \mathcal{T} T,CP-ALS算法迭代地更新因子矩阵 A ∈ R I × R A \in \mathbb{R}^{I \times R} A∈RI×R, B ∈ R J × R B \in \mathbb{R}^{J \times R} B∈RJ×R, C ∈ R K × R C \in \mathbb{R}^{K \times R} C∈RK×R,使得
min A , B , C ∥ T − ∑ r = 1 R a r ⊗ b r ⊗ c r ∥ F 2 \min_{A,B,C} \|\mathcal{T} - \sum_{r=1}^{R} a_r \otimes b_r \otimes c_r\|_F^2 A,B,Cmin∥T−r=1∑Rar⊗br⊗cr∥F2
在每一步中,固定两个因子矩阵,更新第三个矩阵。例如,固定 B B B 和 C C C,更新 A A A 的问题变为:
min A ∥ T ( 1 ) − A ( C ⊙ B ) T ∥ F 2 \min_A \|\mathcal{T}_{(1)} - A(C \odot B)^T\|_F^2 Amin∥T(1)−A(C⊙B)T∥F2
其中 T ( 1 ) ∈ R I × J K \mathcal{T}_{(1)} \in \mathbb{R}^{I \times JK} T(1)∈RI×JK 是 T \mathcal{T} T 的模式-1展开, ⊙ \odot ⊙ 表示Khatri-Rao积(列到列的Kronecker积)。该问题的解为:
A = T ( 1 ) [ ( C ⊙ B ) T ] † = T ( 1 ) ( C ⊙ B ) ( C T C ∗ B T B ) − 1 A = \mathcal{T}_{(1)}[(C \odot B)^T]^{\dagger} = \mathcal{T}_{(1)}(C \odot B)(C^T C * B^T B)^{-1} A=T(1)[(C⊙B)T]†=T(1)(C⊙B)(CTC∗BTB)−1
其中 ∗ * ∗ 表示Hadamard积(元素对应的乘积)。
Tucker分解
Tucker分解是另一种常用的张量分解方法:
T ≈ G × 1 A × 2 B × 3 C × 4 ⋯ \mathcal{T} \approx \mathcal{G} \times_1 A \times_2 B \times_3 C \times_4 \cdots T≈G×1A×2B×3C×4⋯
其中 G \mathcal{G} G 是核心张量, A A A, B B B, C C C, … 是因子矩阵, × i \times_i ×i 表示沿第 i i i 维度的张量-矩阵乘积。对于三阶张量,Tucker分解可以写为:
T i j k ≈ ∑ p = 1 P ∑ q = 1 Q ∑ r = 1 R G p q r A i p B j q C k r \mathcal{T}_{ijk} \approx \sum_{p=1}^{P} \sum_{q=1}^{Q} \sum_{r=1}^{R} \mathcal{G}_{pqr} A_{ip} B_{jq} C_{kr} Tijk≈p=1∑Pq=1∑Qr=1∑RGpqrAipBjqCkr
其中 G ∈ R P × Q × R \mathcal{G} \in \mathbb{R}^{P \times Q \times R} G∈RP×Q×R 是核心张量, A ∈ R I × P A \in \mathbb{R}^{I \times P} A∈RI×P, B ∈ R J × Q B \in \mathbb{R}^{J \times Q} B∈RJ×Q, C ∈ R K × R C \in \mathbb{R}^{K \times R} C∈RK×R 是因子矩阵。
Tucker分解可以通过高阶奇异值分解(HOSVD)或交替最小二乘(ALS)方法求解。HOSVD方法的步骤如下:
- 计算
T
\mathcal{T}
T 的模式-1、模式-2、模式-3展开的SVD:
- T ( 1 ) ≈ U A Σ A V A T \mathcal{T}_{(1)} \approx U_A \Sigma_A V_A^T T(1)≈UAΣAVAT
- T ( 2 ) ≈ U B Σ B V B T \mathcal{T}_{(2)} \approx U_B \Sigma_B V_B^T T(2)≈UBΣBVBT
- T ( 3 ) ≈ U C Σ C V C T \mathcal{T}_{(3)} \approx U_C \Sigma_C V_C^T T(3)≈UCΣCVCT
- 取 A = U A ( : , 1 : P ) A = U_A(:,1:P) A=UA(:,1:P), B = U B ( : , 1 : Q ) B = U_B(:,1:Q) B=UB(:,1:Q), C = U C ( : , 1 : R ) C = U_C(:,1:R) C=UC(:,1:R)
- 计算核心张量 G = T × 1 A T × 2 B T × 3 C T \mathcal{G} = \mathcal{T} \times_1 A^T \times_2 B^T \times_3 C^T G=T×1AT×2BT×3CT
在矩阵乘法的上下文中,Tucker分解可以用于近似高维数据的运算,将原本的大规模矩阵乘法转化为多个小规模矩阵乘法和张量收缩操作。
快速矩阵乘法算法
Strassen算法
Strassen算法是精确矩阵乘法的优化算法,其计算复杂度为 O ( n log 2 7 ) ≈ O ( n 2.81 ) O(n^{\log_2 7}) \approx O(n^{2.81}) O(nlog27)≈O(n2.81),优于传统的 O ( n 3 ) O(n^3) O(n3) 复杂度。该算法的基本思想是将 n × n n \times n n×n 矩阵分解为四个 n / 2 × n / 2 n/2 \times n/2 n/2×n/2 的子矩阵,然后通过7次子矩阵乘法(而非直接的8次)和多次加减法得到结果。
具体来说,假设我们有两个 n × n n \times n n×n 矩阵 A A A 和 B B B,将它们分块为:
A = [ A 11 A 12 A 21 A 22 ] , B = [ B 11 B 12 B 21 B 22 ] A = \begin{bmatrix} A_{11} & A_{12} \\ A_{21} & A_{22} \end{bmatrix}, \quad B = \begin{bmatrix} B_{11} & B_{12} \\ B_{21} & B_{22} \end{bmatrix} A=[A11A21A12A22],B=[B11B21B12B22]
传统方法需要8次子矩阵乘法:
C
11
=
A
11
B
11
+
A
12
B
21
C_{11} = A_{11}B_{11} + A_{12}B_{21}
C11=A11B11+A12B21
C
12
=
A
11
B
12
+
A
12
B
22
C_{12} = A_{11}B_{12} + A_{12}B_{22}
C12=A11B12+A12B22
C
21
=
A
21
B
11
+
A
22
B
21
C_{21} = A_{21}B_{11} + A_{22}B_{21}
C21=A21B11+A22B21
C
22
=
A
21
B
12
+
A
22
B
22
C_{22} = A_{21}B_{12} + A_{22}B_{22}
C22=A21B12+A22B22
Strassen算法引入以下7个中间矩阵:
M
1
=
(
A
11
+
A
22
)
(
B
11
+
B
22
)
M_1 = (A_{11} + A_{22})(B_{11} + B_{22})
M1=(A11+A22)(B11+B22)
M
2
=
(
A
21
+
A
22
)
B
11
M_2 = (A_{21} + A_{22})B_{11}
M2=(A21+A22)B11
M
3
=
A
11
(
B
12
−
B
22
)
M_3 = A_{11}(B_{12} - B_{22})
M3=A11(B12−B22)
M
4
=
A
22
(
B
21
−
B
11
)
M_4 = A_{22}(B_{21} - B_{11})
M4=A22(B21−B11)
M
5
=
(
A
11
+
A
12
)
B
22
M_5 = (A_{11} + A_{12})B_{22}
M5=(A11+A12)B22
M
6
=
(
A
21
−
A
11
)
(
B
11
+
B
12
)
M_6 = (A_{21} - A_{11})(B_{11} + B_{12})
M6=(A21−A11)(B11+B12)
M
7
=
(
A
12
−
A
22
)
(
B
21
+
B
22
)
M_7 = (A_{12} - A_{22})(B_{21} + B_{22})
M7=(A12−A22)(B21+B22)
然后,结果矩阵 C = A B C = AB C=AB 的子块为:
C
11
=
M
1
+
M
4
−
M
5
+
M
7
C_{11} = M_1 + M_4 - M_5 + M_7
C11=M1+M4−M5+M7
C
12
=
M
3
+
M
5
C_{12} = M_3 + M_5
C12=M3+M5
C
21
=
M
2
+
M
4
C_{21} = M_2 + M_4
C21=M2+M4
C
22
=
M
1
−
M
2
+
M
3
+
M
6
C_{22} = M_1 - M_2 + M_3 + M_6
C22=M1−M2+M3+M6
可以验证这两种计算方法给出相同的结果,但Strassen算法只需要7次子矩阵乘法,而不是8次。通过递归应用这一技术,可以将 n × n n \times n n×n 矩阵乘法的复杂度从 O ( n 3 ) O(n^3) O(n3) 降低到 O ( n log 2 7 ) ≈ O ( n 2.81 ) O(n^{\log_2 7}) \approx O(n^{2.81}) O(nlog27)≈O(n2.81)。
需要注意的是,Strassen算法引入的额外加减法操作会增加数值误差,因此在某些情况下可能需要权衡精度和效率。
Coppersmith-Winograd算法
Coppersmith-Winograd算法及其改进版本是理论上最快的矩阵乘法算法,其计算复杂度可达 O ( n 2.373 ) O(n^{2.373}) O(n2.373)。该算法是对Strassen方法的进一步泛化,通过更复杂的代数结构来减少递归中的乘法次数。Coppersmith-Winograd算法的核心是一个基于三线性形式的结构。给定三个向量 x , y , z x, y, z x,y,z,我们考虑所有可能的三重积 x i y j z k x_i y_j z_k xiyjzk。传统方法需要计算所有 n 3 n^3 n3 个三重积,而Coppersmith-Winograd算法通过巧妙的代数变换,将其转化为更少的乘法操作。
具体来说,算法基于以下恒等式:
( ∑ i = 0 n − 1 x i ) ( ∑ j = 0 n − 1 y j ) ( ∑ k = 0 n − 1 z k ) = ∑ i , j , k = 0 n − 1 x i y j z k \left(\sum_{i=0}^{n-1} x_i\right) \left(\sum_{j=0}^{n-1} y_j\right) \left(\sum_{k=0}^{n-1} z_k\right) = \sum_{i,j,k=0}^{n-1} x_i y_j z_k (i=0∑n−1xi)(j=0∑n−1yj)(k=0∑n−1zk)=i,j,k=0∑n−1xiyjzk
通过分组和重新组合,可以用少于 n 3 n^3 n3 的乘法来计算所有 x i y j z k x_i y_j z_k xiyjzk 的值。这一思想可以推广到矩阵乘法,从而实现复杂度的降低。Coppersmith-Winograd算法的理论复杂度为 O ( n ω ) O(n^{\omega}) O(nω),其中 ω ≈ 2.373 \omega \approx 2.373 ω≈2.373 是当前已知的最小指数。然而,由于算法常数项较大且实现复杂,它在实践中较少使用。
量化方法
低精度计算
量化是一种通过降低数值精度来加速计算的技术。例如,将32位浮点数转换为8位定点数,可以大幅减少存储空间和计算开销。在矩阵乘法中,我们可以先将矩阵 A A A 和 B B B 量化为低精度表示,计算乘积后再转回高精度:
C ~ = dequantize ( quantize ( A ) × quantize ( B ) ) \tilde{C} = \text{dequantize}(\text{quantize}(A) \times \text{quantize}(B)) C~=dequantize(quantize(A)×quantize(B))
形式上,量化可以表示为:
quantize ( x ) = round ( x − min ( x ) max ( x ) − min ( x ) ⋅ ( 2 b − 1 ) ) \text{quantize}(x) = \text{round}\left(\frac{x - \min(x)}{\max(x) - \min(x)} \cdot (2^b - 1)\right) quantize(x)=round(max(x)−min(x)x−min(x)⋅(2b−1))
其中 b b b 是目标位宽。相应的反量化操作为:
dequantize ( y ) = min ( x ) + y 2 b − 1 ⋅ ( max ( x ) − min ( x ) ) \text{dequantize}(y) = \min(x) + \frac{y}{2^b - 1} \cdot (\max(x) - \min(x)) dequantize(y)=min(x)+2b−1y⋅(max(x)−min(x))
量化误差的理论分析可以基于量化噪声模型。假设量化误差是独立同分布的均匀随机变量,那么量化误差的方差为:
σ q 2 = ( max ( x ) − min ( x ) ) 2 ( 2 b − 1 ) 2 ⋅ 1 12 \sigma_q^2 = \frac{(\max(x) - \min(x))^2}{(2^b - 1)^2} \cdot \frac{1}{12} σq2=(2b−1)2(max(x)−min(x))2⋅121
对于量化后的矩阵乘法,误差可以建模为:
E A B = ( A + Δ A ) ( B + Δ B ) − A B = Δ A ⋅ B + A ⋅ Δ B + Δ A ⋅ Δ B E_{AB} = (A + \Delta A)(B + \Delta B) - AB = \Delta A \cdot B + A \cdot \Delta B + \Delta A \cdot \Delta B EAB=(A+ΔA)(B+ΔB)−AB=ΔA⋅B+A⋅ΔB+ΔA⋅ΔB
其中 Δ A \Delta A ΔA 和 Δ B \Delta B ΔB 是量化误差矩阵。
混合精度计算
混合精度计算是量化的一种变体,它在计算过程中使用不同的精度级别。例如,可以用低精度进行主要计算,但用高精度累加结果,以减少舍入误差:
C ~ i j = ∑ k = 1 n float32 ( float16 ( A i k ) ⋅ float16 ( B k j ) ) \tilde{C}_{ij} = \sum_{k=1}^{n} \text{float32}(\text{float16}(A_{ik}) \cdot \text{float16}(B_{kj})) C~ij=k=1∑nfloat32(float16(Aik)⋅float16(Bkj))
混合精度计算的理论基础是数值分析中的舍入误差累积理论。给定舍入误差界 ϵ 16 \epsilon_{16} ϵ16 和 ϵ 32 \epsilon_{32} ϵ32(分别对应16位和32位浮点数),混合精度矩阵乘法的相对误差界为:
∥ C ~ − C ∥ F ∥ C ∥ F ≤ ( n + 2 ) ϵ 16 + O ( n ϵ 16 2 ) \frac{\|\tilde{C} - C\|_F}{\|C\|_F} \leq (n+2)\epsilon_{16} + O(n\epsilon_{16}^2) ∥C∥F∥C~−C∥F≤(n+2)ϵ16+O(nϵ162)
相比之下,纯16位计算的误差界为:
∥ C ~ − C ∥ F ∥ C ∥ F ≤ 2 n ϵ 16 + O ( n 2 ϵ 16 2 ) \frac{\|\tilde{C} - C\|_F}{\|C\|_F} \leq 2n\epsilon_{16} + O(n^2\epsilon_{16}^2) ∥C∥F∥C~−C∥F≤2nϵ16+O(n2ϵ162)
可以看出,混合精度方法有效地减小了高阶误差项,特别是当 n n n 较大时。
近似矩阵乘法的误差分析
确定性误差界
对于基于低秩近似的方法,可以通过奇异值给出精确的误差界。假设 A k A_k Ak 和 B l B_l Bl 分别是 A A A 和 B B B 的秩为 k k k 和 l l l 的最佳近似,则:
∥ A − A k ∥ F = ∑ i = k + 1 min ( m , n ) σ i 2 ( A ) \|A - A_k\|_F = \sqrt{\sum_{i=k+1}^{\min(m,n)} \sigma_i^2(A)} ∥A−Ak∥F=i=k+1∑min(m,n)σi2(A)
∥ B − B l ∥ F = ∑ i = l + 1 min ( n , p ) σ i 2 ( B ) \|B - B_l\|_F = \sqrt{\sum_{i=l+1}^{\min(n,p)} \sigma_i^2(B)} ∥B−Bl∥F=i=l+1∑min(n,p)σi2(B)
矩阵乘积的误差可以通过三角不等式得到:
∥ A B − A k B l ∥ F ≤ ∥ A B − A k B ∥ F + ∥ A k B − A k B l ∥ F ≤ ∥ A − A k ∥ F ⋅ ∥ B ∥ F + ∥ A k ∥ F ⋅ ∥ B − B l ∥ F \|AB - A_kB_l\|_F \leq \|AB - A_kB\|_F + \|A_kB - A_kB_l\|_F \leq \|A - A_k\|_F \cdot \|B\|_F + \|A_k\|_F \cdot \|B - B_l\|_F ∥AB−AkBl∥F≤∥AB−AkB∥F+∥AkB−AkBl∥F≤∥A−Ak∥F⋅∥B∥F+∥Ak∥F⋅∥B−Bl∥F
利用奇异值分解的性质, ∥ A k ∥ F = ∑ i = 1 k σ i 2 ( A ) \|A_k\|_F = \sqrt{\sum_{i=1}^{k} \sigma_i^2(A)} ∥Ak∥F=∑i=1kσi2(A),可以进一步得到:
∥ A B − A k B l ∥ F ≤ ∑ i = k + 1 min ( m , n ) σ i 2 ( A ) ⋅ ∥ B ∥ F + ∑ i = 1 k σ i 2 ( A ) ⋅ ∑ i = l + 1 min ( n , p ) σ i 2 ( B ) \|AB - A_kB_l\|_F \leq \sqrt{\sum_{i=k+1}^{\min(m,n)} \sigma_i^2(A)} \cdot \|B\|_F + \sqrt{\sum_{i=1}^{k} \sigma_i^2(A)} \cdot \sqrt{\sum_{i=l+1}^{\min(n,p)} \sigma_i^2(B)} ∥AB−AkBl∥F≤i=k+1∑min(m,n)σi2(A)⋅∥B∥F+i=1∑kσi2(A)⋅i=l+1∑min(n,p)σi2(B)
这个界限是确定性的,不依赖于任何概率假设。
概率误差界
对于基于随机方法的近似,通常给出概率误差界。例如,对于随机投影方法,假设 R ∈ R n × d R \in \mathbb{R}^{n \times d} R∈Rn×d 是高斯随机矩阵,元素服从 N ( 0 , 1 / d ) N(0, 1/d) N(0,1/d) 分布,则对于任意 ϵ , δ > 0 \epsilon, \delta > 0 ϵ,δ>0,当 d ≥ c log ( 1 / δ ) ϵ 2 d \geq \frac{c \log(1/\delta)}{\epsilon^2} d≥ϵ2clog(1/δ) 时,以概率至少 1 − δ 1 - \delta 1−δ:
∥ A B − ( A R ) ( B R ) T ∥ F ≤ ϵ ∥ A ∥ F ∥ B ∥ F \|AB - (AR)(BR)^T\|_F \leq \epsilon \|A\|_F \|B\|_F ∥AB−(AR)(BR)T∥F≤ϵ∥A∥F∥B∥F
其中 c c c 是一个适当的常数。
这个界限可以通过矩阵集中不等式来证明。首先,注意到 ( A R ) ( B R ) T (AR)(BR)^T (AR)(BR)T 可以写为:
( A R ) ( B R ) T = ∑ j = 1 d ( A R ) : , j ( B R ) : , j T (AR)(BR)^T = \sum_{j=1}^{d} (AR)_{:,j} (BR)_{:,j}^T (AR)(BR)T=j=1∑d(AR):,j(BR):,jT
这是 d d d 个独立随机矩阵的和。定义 X j = ( A R ) : , j ( B R ) : , j T X_j = (AR)_{:,j} (BR)_{:,j}^T Xj=(AR):,j(BR):,jT,则 E [ X j ] = 1 d A B \mathbb{E}[X_j] = \frac{1}{d} AB E[Xj]=d1AB,且 ( A R ) ( B R ) T = ∑ j = 1 d X j (AR)(BR)^T = \sum_{j=1}^{d} X_j (AR)(BR)T=∑j=1dXj。
应用矩阵Bernstein不等式,当 d d d 足够大时,可以得到上述概率界限。
类似地,对于蒙特卡洛方法,当采样数 s s s 足够大时,可以证明:
P ( ∥ A B − C ~ ∥ F ≤ ϵ ∥ A ∥ F ∥ B ∥ F ) ≥ 1 − δ P\left(\|AB - \tilde{C}\|_F \leq \epsilon \|A\|_F \|B\|_F\right) \geq 1 - \delta P(∥AB−C~∥F≤ϵ∥A∥F∥B∥F)≥1−δ
其中 s ≥ c ⋅ log ( m p / δ ) / ϵ 2 s \geq c \cdot \log(mp/\delta) / \epsilon^2 s≥c⋅log(mp/δ)/ϵ2, c c c 是一个适当的常数。
近似矩阵乘法的实例
为了更具体地说明近似矩阵乘法的工作原理,我们通过一个简单的例子来演示。假设我们有两个矩阵:
A = [ 2 1 3 0 1 2 0 1 0 1 1 2 ] , B = [ 1 0 2 2 1 0 0 3 1 1 0 1 ] A = \begin{bmatrix} 2 & 1 & 3 & 0 \\ 1 & 2 & 0 & 1 \\ 0 & 1 & 1 & 2 \end{bmatrix}, \quad B = \begin{bmatrix} 1 & 0 & 2 \\ 2 & 1 & 0 \\ 0 & 3 & 1 \\ 1 & 0 & 1 \end{bmatrix} A= 210121301012 ,B= 120101302011
精确的矩阵乘积为:
C = A B = [ 5 10 7 6 2 3 5 1 3 ] C = AB = \begin{bmatrix} 5 & 10 & 7 \\ 6 & 2 & 3 \\ 5 & 1 & 3 \end{bmatrix} C=AB= 5651021733
现在,我们应用随机采样方法,假设采样次数 s = 2 s = 2 s=2,随机选择的下标为 K 1 = 1 K_1 = 1 K1=1 和 K 2 = 3 K_2 = 3 K2=3,则近似矩阵乘积为:
C ~ i j = 4 2 ( A i 1 B 1 j + A i 3 B 3 j ) \tilde{C}_{ij} = \frac{4}{2} \left( A_{i1} B_{1j} + A_{i3} B_{3j} \right) C~ij=24(Ai1B1j+Ai3B3j)
计算得到:
C ~ = [ 2 ⋅ ( 2 ⋅ 1 + 3 ⋅ 0 ) 2 ⋅ ( 2 ⋅ 0 + 3 ⋅ 3 ) 2 ⋅ ( 2 ⋅ 2 + 3 ⋅ 1 ) 2 ⋅ ( 1 ⋅ 1 + 0 ⋅ 0 ) 2 ⋅ ( 1 ⋅ 0 + 0 ⋅ 3 ) 2 ⋅ ( 1 ⋅ 2 + 0 ⋅ 1 ) 2 ⋅ ( 0 ⋅ 1 + 1 ⋅ 0 ) 2 ⋅ ( 0 ⋅ 0 + 1 ⋅ 3 ) 2 ⋅ ( 0 ⋅ 2 + 1 ⋅ 1 ) ] = [ 4 18 10 2 0 4 0 6 2 ] \tilde{C} = \begin{bmatrix} 2 \cdot (2 \cdot 1 + 3 \cdot 0) & 2 \cdot (2 \cdot 0 + 3 \cdot 3) & 2 \cdot (2 \cdot 2 + 3 \cdot 1) \\ 2 \cdot (1 \cdot 1 + 0 \cdot 0) & 2 \cdot (1 \cdot 0 + 0 \cdot 3) & 2 \cdot (1 \cdot 2 + 0 \cdot 1) \\ 2 \cdot (0 \cdot 1 + 1 \cdot 0) & 2 \cdot (0 \cdot 0 + 1 \cdot 3) & 2 \cdot (0 \cdot 2 + 1 \cdot 1) \end{bmatrix} = \begin{bmatrix} 4 & 18 & 10 \\ 2 & 0 & 4 \\ 0 & 6 & 2 \end{bmatrix} C~= 2⋅(2⋅1+3⋅0)2⋅(1⋅1+0⋅0)2⋅(0⋅1+1⋅0)2⋅(2⋅0+3⋅3)2⋅(1⋅0+0⋅3)2⋅(0⋅0+1⋅3)2⋅(2⋅2+3⋅1)2⋅(1⋅2+0⋅1)2⋅(0⋅2+1⋅1) = 42018061042
计算误差为:
∥ C − C ~ ∥ F = ∑ i , j ( C i j − C ~ i j ) 2 = ( 5 − 4 ) 2 + ( 10 − 18 ) 2 + ⋯ + ( 3 − 2 ) 2 ≈ 9.85 \|C - \tilde{C}\|_F = \sqrt{\sum_{i,j} (C_{ij} - \tilde{C}_{ij})^2} = \sqrt{(5-4)^2 + (10-18)^2 + \cdots + (3-2)^2} \approx 9.85 ∥C−C~∥F=i,j∑(Cij−C~ij)2=(5−4)2+(10−18)2+⋯+(3−2)2≈9.85
相对误差为:
∥ C − C ~ ∥ F ∥ C ∥ F = 9.85 5 2 + 1 0 2 + ⋯ + 3 2 ≈ 0.68 \frac{\|C - \tilde{C}\|_F}{\|C\|_F} = \frac{9.85}{\sqrt{5^2 + 10^2 + \cdots + 3^2}} \approx 0.68 ∥C∥F∥C−C~∥F=52+102+⋯+329.85≈0.68
这个误差较大,主要是因为采样次数太少。在实际应用中,我们通常会使用更多的采样点或结合其他技术来提高近似精度。