把矩阵乘法写成外积之和
现在回到矩阵乘法。设
A∈Rm×n,B∈Rn×p
把 A 按列写成
A=[a1a2⋯an]
把 B 按行写成
B=b1⊤b2⊤⋮bn⊤
那么矩阵乘法可以拆成
AB=j=1∑najbj⊤
每一项
ajbj⊤
都是一个 rank one matrix
记
Mj=ajbj⊤
于是目标就是
AB=j=1∑nMj
如果 n 很大,完整求和可能很贵。随机矩阵乘法的想法是:不计算所有 Mj,而是随机抽一些项,用它们构造一个对 AB 的估计
把统计概念放回矩阵乘法
到这里,前面那些统计概念可以一一对应到矩阵乘法问题里
| 统计概念 | 在随机矩阵乘法中的对象 |
|---|
| 真实目标 θ | AB |
| 一次随机结果 | 抽到某个下标 J=j |
| 抽样概率分布 | 抽到某个下标的可能性有多大,P(J=j)=pj |
| 单次随机估计量 | X=pJ1MJ |
| 多次抽样后的估计量 | AB=s1∑ℓ=1spjℓ1Mjℓ |
| 抽样分布 | 重复运行整个随机算法时,AB 的分布 |
| 无偏 | E[AB]=AB |
| 有偏 | E[AB]=AB |
这个表里最重要的是区分两层随机性
第一层是一次抽样抽到哪个下标 J
P(J=j)=pj
第二层是整个估计量 AB 在重复运行算法时如何波动
AB本身也是随机的
无偏性讨论的是第二层:估计量的长期平均是否等于真实目标,而不是问每次抽到的下标是不是均匀,也不是问单次结果是不是已经等于 AB
为什么抽到某项 M_j 以后要乘 1/p_j
设随机变量 J 表示本次抽到的下标,我们一共有 n 个 Mj 可选
P(J=j)=pj
所以
j=1∑npj=1
注意,这里完全不要求 pj 相等。大的项可以被更频繁地抽到,小的项可以少抽一些
如果抽到 j 之后直接输出
X=Mj
那么期望是
E[X]=j=1∑npjMj
这里求和到 n,是因为 X 是 单次抽样 得到的随机矩阵。单次抽样时,可能结果有 n 种:
M1,M2,…,Mn
其中抽到 Mj 的概率是 pj。所以按照期望定义,要对所有可能结果 j=1,…,n 做概率加权求和
这一般不等于
j=1∑nMj
因此它通常不是 AB 的无偏估计
正确的做法是抽到 j 之后输出
X=pj1Mj=pj1ajbj⊤
这时
E[X]=j=1∑npj(pj1Mj)=j=1∑nMj=AB
所以
E[X]=AB
这就是无偏估计了
如果抽 s 次,并且每次独立地按同一个分布 pj 抽样,那么可以定义
AB=s1ℓ=1∑spjℓ1ajℓbjℓ⊤
这里要区分 n 和 s:
- n 是候选外积项的总数,也就是有多少个 Mj 可以被抽
- s 是重复抽样的次数,也就是最终平均时一共抽了多少次
这里的 ℓ 表示第几次抽样:
ℓ=1,2,…,s
而 jℓ 表示第 ℓ 次抽样时实际抽到的下标。例如第 3 次抽样如果抽到了第 7 个外积项,那么
j3=7
对应的样本项就是
pj31aj3bj3⊤=p71a7b7⊤
所以这个公式里的
ℓ=1∑s
是在把实际抽到的 s 次随机估计结果加起来;而前面计算单次随机变量 X 的期望时,
j=1∑n
是在对所有可能被抽到的 n 个候选结果做概率加权求和
由期望的线性性,
E[AB]=E[s1ℓ=1∑spjℓ1ajℓbjℓ⊤]=s1ℓ=1∑sE[pjℓ1ajℓbjℓ⊤]
而每一次抽样都使用同一个分布 pj,所以对任意一次 ℓ 都有
E[pjℓ1ajℓbjℓ⊤]=j=1∑npj(pj1ajbj⊤)=j=1∑najbj⊤=AB
代回去得到
E[AB]=s1ℓ=1∑sAB=s1sAB=AB
所以 AB 仍然是 AB 的无偏估计
这里的 1/s 是在平均这 s 次随机估计结果,1/pjℓ 是在修正第 jℓ 项被抽中的概率
这两个因子的含义不同
s1 平均样本记录,pj1 修正抽样概率
这就是随机矩阵乘法的意义:我们不必显式计算所有外积项来得到完整的 AB,而是多次重复这个随机过程,并对结果取平均。抽样次数 s 越大,估计量的方差越小,AB 的结果通常越接近真实的 AB
有偏估计会是什么样
有偏的核心形式是
E[AB]=AB
最简单的有偏情形就是抽到以后不做缩放
X=MJ
于是
E[X]=j=1∑npjMj
这估计的是按 pj 加权后的平均,而不是所有外积项的总和
如果采用均匀抽样
pj=n1
但仍然直接输出 MJ,那么
E[X]=n1j=1∑nMj=n1AB
它少了一个因子 n
所以均匀抽样下,单次无偏估计应该是
X=nMJ
因为
E[X]=j=1∑nn1nMj=AB
这也说明了一个重要事实:无偏性不是由“是否均匀抽样”决定的,而是由目标、抽样概率和估计量构造方式共同决定的
方差与抽样概率的选择
无偏只保证平均方向正确,但不保证每次结果稳定
如果某个 Mj 很大,而 pj 又很小,那么一旦抽到它,估计量里会出现
pj1Mj
这个项可能非常大,从而带来很大的方差
为了量化矩阵估计的波动,可以使用 Frobenius norm 下的均方误差。令
C=AB
单次估计量是
X=pJ1MJ
因为 E[X]=C,所以
E∥X−C∥F2=E∥X∥F2−∥C∥F2
这一点可以直接展开 Frobenius inner product 来看。由于
∥X−C∥F2=⟨X−C,X−C⟩F
所以
∥X−C∥F2=∥X∥F2−2⟨X,C⟩F+∥C∥F2
两边取期望:
E∥X−C∥F2=E∥X∥F2−2E⟨X,C⟩F+∥C∥F2
因为 C 是固定目标,不是随机变量,所以
E⟨X,C⟩F=⟨E[X],C⟩F=⟨C,C⟩F=∥C∥F2
因此
E∥X−C∥F2=E∥X∥F2−2∥C∥F2+∥C∥F2=E∥X∥F2−∥C∥F2
于是
E∥X−C∥F2=E∥X∥F2−∥C∥F2=j=1∑npjpj1MjF2−∥C∥F2=j=1∑npj∥Mj∥F2−∥AB∥F2
而 rank one matrix 满足
∥Mj∥F=∥ajbj⊤∥F=∥aj∥2∥bj∥2
因此要控制的主要部分是
j=1∑npj∥aj∥22∥bj∥22
和前面推导的平均估计量方差下降规律一样,抽 s 次再平均会把波动缩小到单次估计的约 1/s
EAB−ABF2=s1(j=1∑npj∥Mj∥F2−∥AB∥F2)
现在问题变成:在约束
j=1∑npj=1
下,怎样选择 pj 让方差小?
设
cj=∥Mj∥F=∥aj∥2∥bj∥2
那么均方误差里的关键部分可以写成
j=1∑npj∥Mj∥F2−∥AB∥F2=j=1∑npjcj2−∥AB∥F2
这里
∥AB∥F2
是目标矩阵本身的大小,和抽样概率 pj 无关。我们现在能选择的只有概率分布
p1,p2,…,pn
所以如果想通过选择 pj 来降低随机估计的波动,就只需要关注依赖 pj 的那一项,也就是最小化
j=1∑npjcj2
也可以这样理解:真正的误差项是
j=1∑npjcj2−∥AB∥F2
我们当然希望前一项尽量接近后面的
∥AB∥F2
但 ∥AB∥F2 是固定常数,无法通过选择 pj 改变,所以最小化整个误差项等价于最小化
j=1∑npjcj2
而且这项只能从上方接近 ∥AB∥F2。因为
E∥X−C∥F2≥0
所以由
E∥X−C∥F2=j=1∑npjcj2−∥AB∥F2
可得
j=1∑npjcj2≥∥AB∥F2
所以我们能做的是把它压到尽可能小,也就是让它尽量贴近这个下界
直观上,如果某个外积项很大,也就是 cj 很大,但给它的抽样概率 pj 很小,那么
pjcj2
会变得很大,从而让方差变大。因此大的外积项应该被更频繁地抽到
现在这是一个带约束的最优化问题:
p1,…,pnminj=1∑npjcj2s.t.j=1∑npj=1
约束来自概率分布本身:所有抽样概率必须加起来等于 1
Lagrange multiplier 就是处理这类带约束最优化问题的方法。它的做法是引入一个新变量 λ,把约束也放进目标函数里。直观上,λ 用来记录“为了满足约束,目标函数的最优方向需要怎样被修正”
因此构造
L(p1,…,pn,λ)=j=1∑npjcj2+λ(j=1∑npj−1)
接下来要求最优点。对于一元函数,最小值点通常满足
f′(x)=0
这里变量有很多个:
p1,p2,…,pn,λ
所以对应地,要对每个变量求偏导,并令偏导为 0。这就是一阶最优条件
对 pj 求偏导,是为了找到让目标函数最小的概率分配:
∂pj∂L=−pj2cj2+λ=0
所以
pj=λcj
对 λ 求偏导,则会把约束条件带回来:
∂λ∂L=j=1∑npj−1=0
也就是
j=1∑npj=1
现在把
pj=λcj
代入约束:
j=1∑npj=j=1∑nλcj=λ1j=1∑ncj=1
因此
λ=j=1∑ncj
再代回 pj=λcj,得到
pj=∑k=1nckcj=∑k=1n∥ak∥2∥bk∥2∥aj∥2∥bj∥2
这里分母里的 k 只是求和下标,用来避免和分子里的 j 混淆。它表示把所有 c1,c2,…,cn 加起来:
k=1∑nck=c1+c2+⋯+cn
所以这个步骤本质上是在做归一化:先得到 pj∝cj,再用 ∑jpj=1 把它变成真正的概率分布
如果某个 cj=0,也就是对应的外积项本来就是零矩阵,那么它对总和没有贡献,实际算法里可以不抽它。上面的概率公式主要针对 cj>0 的项,此时需要保证 pj>0,否则 1/pj 没有意义
直观上就是
越可能贡献大的外积项,越应该更频繁地抽到
这样不会改变无偏性,但会降低估计量的方差
实际计算时还要注意一个成本问题:这个最优概率需要先计算所有
∥aj∥2∥bj∥2
并把它们加起来。看起来好像也要扫过所有 j=1,…,n,但这通常仍然比完整计算 AB 便宜很多
如果
aj∈Rm,bj∈Rp
那么形成一个外积
ajbj⊤
需要大约 O(mp) 的工作量,完整计算所有 n 个外积大约是
O(mnp)
而计算一个范数乘积
∥aj∥2∥bj∥2
只需要扫过 aj 和 bj 的元素,代价大约是 O(m+p)。计算所有 j 的范数乘积大约是
O(n(m+p))
这通常只是扫描输入数据的成本,而不是形成并累加完整输出矩阵的成本。因此在 m,p 较大时,它往往远小于完整矩阵乘法
当然,如果连扫描所有列和行都很贵,或者数据是 streaming / distributed 的,实际算法也可能使用 uniform sampling、近似的 sampling probabilities、近似 leverage scores 等更便宜的方案。上面的 pj∝∥aj∥2∥bj∥2 是方差最优意义下的理想选择,不一定总是实现成本最低的选择
1/p_j 的另一种理解
上面的 1/pj 可以理解成一种补偿因子。结合前面的说法,这一整套做法可以看成 Monte Carlo estimation + importance weighting:
- Monte Carlo estimation:用随机抽样的平均来估计完整总和
- importance weighting:用 1/pj 修正抽样概率,保证估计量无偏
在矩阵乘法里,我们的目标是完整的总和
j=1∑nMj
也就是说,每一项 Mj 在目标里都应该完整贡献一次
但实际随机抽样时,第 j 项只以概率 pj 被抽到。如果抽到以后直接输出 Mj,那么长期平均只会得到
j=1∑npjMj
这不是我们想要的完整总和
所以抽到第 j 项时,要把它放大
pj1
倍,用来补偿“它只以概率 pj 出现”这件事。于是
E[pJ1MJ]=j=1∑npj(pj1Mj)=j=1∑nMj=AB
所以可以把 1/pj 认为是:
抽得越少,抽中以后就要补得越多。
这类思想通常叫 importance weighting。更一般地,如果目标权重是 πj,而实际抽样概率是 qj,修正权重就是
qjπj
随机矩阵乘法这一节里,目标是普通总和,可以理解成每一项的目标权重都是 1,实际抽样概率是 pj,所以修正权重就是 1/pj
总结
随机矩阵乘法的核心可以压缩成:
把 AB 写成 rank one terms 的总和,然后随机抽样其中一部分,用概率修正保证无偏。
具体来说,
AB=j=1∑najbj⊤
抽到第 j 项的概率是 pj,单次估计量取
X=pj1ajbj⊤
于是
E[X]=AB
多次抽样后取平均
AB=s1ℓ=1∑spjℓ1ajℓbjℓ⊤
仍然无偏,并且方差随样本数增加而下降
variance∼s1
但无偏不代表稳定。要让估计稳定,需要合理选择抽样概率
pj∝∥aj∥2∥bj∥2
所以这节真正想建立的直觉是:随机算法不是说随便丢掉信息,我们要用概率分布来决定需要哪些信息,用权重修正保证平均正确,再用方差分析决定怎样抽得更稳