矩阵乘法: 从 Strassen 到 Coppersmith–Winograd

这篇文章主要是对 MIT6.890 的 Lec19~23 的理解, 试图概括在 Strassen 之后一直到 (小) Coppersmith–Winograd 的矩阵乘法用到了一些什么技术. 本文的终点是证明 ω2.404.

张量描述

固定域 F, 我们称 F 上一个双线性计算问题是对于

fk=tijkxiyj,

输入所有 xi,yj, 计算所有 fk. 这里 tFN×M×K 是一个三阶张量.

线性算法与 rank

之前理解过转置原理的同学可能对这里更好理解.

我们希望完成这个双线性计算问题, 我们首先希望优化的是 x,y 之间 的乘法问题, 换句话说, 我们认为 t 是一个已经被固定的东西, 再次强调, 只有 x,y 是输入.

|F| 无限的时候, 加, 减, 乘所得到的结果无非是一个关于全体 xi,yi 的多项式, 而且当它们不定的时候, 我们没有特殊关系可以约化它们, 所以正确的结果必须最后只剩下 xiyj 的线性组合. 直觉上说, 我们的计算一定可以表示成, 先做一些乘法

Pλ=(uλTx)(vλTy).

然后每个输出是一个线性组合 fk=wkTP. 在 "bilinear complexity" 的意义下, 我们只关心这个向量 P 的维数.

注意到当我们考虑多项式

i,j,ktijkxiyjzk

的时候, 上面的写法就可以写作

λ(uλTx)(vλTy)(wλTz).

也就是说, 输入和输出的地位其实是相等的.

我们称可行的最小的 λ 的长度为 R(t), 这个张量的秩 (rank). 显然上述对称的写法是很好理解的, 而且对二阶张量, 也即矩阵来说, 和我们对矩阵定义的秩是一致的.

|F| 无限的时候, 我们记 C(t) 是前文提到的所需的 "乘法" 次数, 那么经过一些讨论, 我们其实可以证明 R(t)C(t)2R(t). 所以研究 R(t), 在很大程度上就相当于研究矩阵乘法的效率问题.

但这并不对所有问题都完全奏效, 比如对多项式乘法来说, 在无限域上我们可以先进行求值, 然后做 n 次乘法, 再插值回来. 在 "bilinear complexity" 意义下, 这个算法有 R(t)=n, 但它粗暴地忽略了求值插值的所需时间!

我们记 tK×M×NtK×M×N 是一个 (K+K)×(M+M)×(N+N) 维张量, 具体来说就是将 t 放在立方体的 "左下角", t 放在 "右上角".

tK×M×NtK×M×N 是一个 (KK)×(MM)×(NN) 维张量, 不意外地, 我们有

(tt)iijjkk=tijktijk.

容易知道, R(tt)R(t)+R(t), 而 R(tt)R(t)R(t).

矩阵乘法

对于 K×M×N 的矩阵乘法来说, 问题就是一个 FKM×MN×KN 的张量, 其中

tij,jk,ik=δiiδjjδkk.

我们今后记这个张量为 K,M,N.

我们的第一个观察是 K,M,N 同构于 M,N,K, 这是因为贡献关系可以看做一个完全三分图的所有三角形, 将顶点重标号并不影响什么. 所以我们有

R(K,M,N)=R(M,N,K)=R(N,K,M).

第二个观察就是 K,M,NK,M,N=KK,MM,NN, 这无非就是分块矩阵乘法.

现在, 我们可以来定义什么是 ω 了. 我们记

ω=infn>1logR(n,n,n)logn,

接下来, 我们声称: 对任意 ϵ>0, 存在 O(nω+ϵ) 的矩阵乘法算法. 这是因为我们总存在一个常数 T 使得 logR(T,T,T)logTω+ϵ, 然后我们不断调用 R(T,T,T) 给出的分块矩阵乘法递归下去, 主定理就保证了复杂度为 O(nω+ϵ).

从这一步我们也能预感到矩阵乘法接下来的算法为什么现实中都不 work 了: 因为他们需要的 T 可能都是天文数字!

Strassen 和 Pan 的构造

最初 Strassen 的构造无非指出, R(2,2,2)7. 因此 ωlog272.8074.

然后, Pan (1980) 构造出了 R(70,70,70)143640, 这导出了 ω2.796.

到目前为止, 远超我们理解的奇迹还没有出现.

Border rank

事情的转机来源于一个奇怪的现象. 我们考虑一些可以做逼近的域, 让一系列秩不超过 r 的矩阵 At 趋于 A, 我们有 A 的秩仍然不超过 r. 这可以通过考察所有 r+1 阶的余子式确定. 但奇怪的是, 对于三阶张量来说, 这件事是不成立的. 对于二次型

g0=a0b0,g1=a0b1+a1b0,

我们可以用

t(ϵ)=(1,ϵ)(1,ϵ)(0,1/ϵ)+(1,0)(1,0)(1,1/ϵ)

来逼近它, 但这个二次型本身的秩是 3.

我们考虑多项式环 F[ϵ], 我们定义 Rh(t) 为最小的 L, 使得有一组解 uλ(ϵ),vλ(ϵ),wλ(ϵ) 使得

λ(uλTx)(vλTy)(wλTz)=ϵht+O(ϵh+1).

显然按照这个定义, 我们有 R0(t)R1(t), 因为 Rh(t) 总是整数, 我们有下界 R(t)=minhRh(t).

第一个观察是, R0(t) 依然是可以被 Rh(t) 控制的, 这是因为我们提取 (uλTx)(vλTy)(wλTz)ϵh 次项系数, 这只需要做 O(h2) 次乘法.

接下来的观察就更为有趣了, 我们不难验证: Rh(tt)Rh(t)+Rh(t)Rh+h(tt)Rh(t)+Rh(t). 后者的巧妙指出就在于, h 的次数贡献是相加而不是相乘. 这直接导出了如下结果:

ω3logR(K,M,N)log(KMN).

这是因为, 首先我们将它划归到方阵, 也即

T,T,T=K,M,NM,N,KN,K,M,

我们有 T=log(KNM), 此时设 h=Rt(K,M,N), 那么我们有 R3t(T,T,T)h3.

接下来要用到我们前面的观察了, 我们将它再张量 s 次, 得到

R3st(Ts,Ts,Ts)h3s.

也就有

ωlog(O(st2)h3s)slog(NMK)=3loghlog(NMK)+O(logss).

因此, 我们不需要控制 rank, 而是只要能够控制 border rank, 我们就可以得到更快的矩阵乘法了.

Bini, Capovani, Romani (1979) 得到了 R(2,2,3)10. 进而得到了 ω2.780.

Schönhage τ-定理

接下来, 矩阵乘法迎来了指数上最大的单次改进, 这来源于 Schönhage 的观察: 我们未必要直接控制某一个矩阵乘法的 border rank, 而是控制一些几个并行的矩阵乘法的 border rank.

Schönhage τ-定理: 对于 r>p 以及

R(i=1pki,mi,ni)r,

τ 是下述等式

i=1p(kimini)τ=r

的解, 我们有 ω3τ.

这个定理的证明涉及一些琐碎的计算, 这里我们主要展示其主要思想.

将上面的这个张量记为 t, 有 Rh(t)=s, 我们考虑它的 s 阶张量积 ts, 我们可以控制

R(ts)rspoly(hs),

再考虑 ts 的展开式中, 有一个直和因子

iki,mi,nisi=ikisi,imisi,inisi,

它总共出现了 (ss1,,sp) 次, 如果我们选取 si 最大化

(ss1,,sp)(ikisiimisiinisi)τ,

记三部分乘积分别为 K,M,N, 就可以用 rs(ss1,,sp)(KMN)τ(s+p1p1) 来进行控制, 也就得到了

R((ss1,,sp)K,M,N)(ss1,,sp)(KMN)τ(s+p1p1)poly(hs).

这是同时计算常数 a=(ss1,,sp)K,M,N 时候得到的界, 但我们可以通过继续做张量积 K,M,N, 也就是在算更大的矩阵乘法的时候把这个东西摊掉, 也就是可以当做下述事实成立来控制 ω, 具体证明就是做张量积的时候进行放缩, 细节略去.

R(K,M,N)(KMN)τ(s+p1p1)poly(hs)

s 时, 我们有

3log[(KMN)τ(s+p1p1)poly(hs)]logKMN3τ.

所以 ω3τ.

基于一些构造, Schönhage (1981) 在此之上确定了 ω2.522.

Coppersmith–Winograd 张量

先前的构造都是考虑了一些矩阵乘法问题的直和的 border rank 被如何控制. Coppersmith 和 Winograd 对这一想法做出了如下变通:

  1. 我们先将一些矩阵乘法问题求和成为一个张量, 但它们未必是直和的形式.
  2. 我们将这个张量做很高次的张量积, 然后将一些变量 "置零" 来去除一些纠缠在一起的项, 然后我们数一数剩下来的东西, 发现完全分解成很多个矩阵乘法问题的直和.
  3. 应用 Schönhage τ-定理来控制 ω.

我们这里主要讨论小 CW 张量 cwqF(q+1)×(q+1)×(q+1), 其中 q2. 我们记变量为 X0={x0},X1={x1,,xq} 以及类似的 Y,Z. 令 Tijk=XiYjZk. 我们定义

cwq=T110+T011+T101=i+j+k=2Tijk=i=1q(x0yizi+xiy0zi+xiyiz0).

可以验证, T011 就等同于 1,1,q, T101 等同于 q,1,1, T110 等同于 1,q,1.

对于 k 位的数 I,J,K{0,1}k, 我们可以自然地定义 TIJK, 并且有

cwqk=I,J,KIi+Ji+Ki=2TIJK.

现在我们考虑 cwq3N, 为了方便分析, 我们先让 XI 中只保留 I2N1 的, Y,Z 类似处理, 记

t=I,J,KIi+Ji+Ki=2|I|=|J|=|K|=2NTIJK,

如果 R(cwq)=c, 那么我们知道 R(t)R(cwq3N)c3N+o(N).

我们记 t 中保留的指标集为 L, 我们的问题就是: 如何选取三个子集 SX,SY,SZ, 使得 |LSX×SY×SZ| 中任意两个点都没有相同的坐标 II,JJ,KK (下称独立), 且交集尽量大?

首先我们注意到:

如果我们可以对某个常数 ϕ 构造出一族

|LSX×SY×SZ|ϕNo(N),

就可以给出控制

ωlogc3ϕlogq.

这是因为我们考虑使用 Schönhage τ-定理, 现在我们有 ϕNo(N) 个大小为 q3N 的矩阵乘法, 那么

ϕNo(N)q3Nτ=c3N+o(N)

的解是

τ=(1+o(1))logc3ϕ3logq,

所以有

ωlogc3ϕlogq.

接下来就是考虑如何构造出一组合适的选取方法了.

ω2.404 的构造

对于这个 SX,SY,SZ 的构造大概分两步.

  1. 我们首先通过一个随机的方式将所有的指标 I,J,K 映到一些桶里 (有的被清零), 我们保证不同的桶之间两个点两两独立.
  2. 接下来, 我们对每个桶内部进行一些处理, 使得每个桶内只保留一些独立的点.

第 1 步: 哈希与极值组合

首先让我们来构造一族哈希函数. 选取一个充分大的质数 p 介于 [3(2N2),4(2N2)] 之间, 我们考虑一个随机数 w0 以及随机向量 w, 都是在模 p 下均匀随机的, 然后考虑 modp 下的哈希函数

hX(I)=wTI,hY(J)=hX(J)+w0,hZ(K)=12hY(2K).

由于 p 充分大, 所以是奇素数, 12 是良定义的.

显然, 由于这三个函数都是仿射变换, 所以 II 的时候, hX(I),hX(I) 是独立随机的, hY,hZ 有类似性质. 同时, 注意到在 LI+J+K=2 总是成立, 我们还有 hX(I)+hY(J)=2hZ(K)(modp), 也就是说, hX(I),hZ(K),hY(J) 总是等差数列.

之所以构造这样的哈希函数, 是因为极值组合学中有如下构造:

(Behrend, 1946) 对于 N, 存在 [N] 的子集 S 中不存在非平凡的长为 3 的等差数列, 同时

|S|NeO(logN).

我们取 p=N/2, 就得到了 modp 下无等差数列的构造. 对此, 我们其实是想要结果: 对于任意 ϵ, 对充分大的 p, 我们希望 |S|p1ϵ.

那么接下来, 我们令

SX=hX1(S),SY=hY1(S),SZ=hZ1(S).

由于 S 是无等差数列的, 那么 hX(I),hY(J),hZ(K)S 的情况下, 如果 (I,J,K)L, 我们就有它们必须是平凡等差数列, 也即 hX(I)=hY(J)=hZ(K).

因此对每一个 sS, 我们可以把映到 sI,J,K 称作一个桶 (bucket), 此时三个下标都被映到了 s, 这也很显然地说明了桶和桶之间是坐标不交的.

接下来让我们先算一下我们还剩下多少. 注意我们 L 中为了简化分析加了条件, 我们考虑每一列 (Ii,Ji,Ki), 它出现 110,101,011 必须各 N 次, 因此

|L|=(3NN,N,N).

由于 hX(I),hY(J) 的取值独立, 它们又唯一确定了 hZ(K), 我们有

Pr[h(I,J,K)=s]=1p2.

因此

E[|LSX×SY×SZ|]=|L||S|p21p1+ϵ(3NN,N,N).

第 2 步

接下来我们考虑通过一个简单的策略来实现 "清零".

我们随便按照某个顺序考虑一个桶里的所有元素 Bs, 如果一个元素和排在它前面的某个元素有一个相同坐标, 我们就选取一个不同的坐标, 将当前元素的这个坐标清零 (注意 L 中元素任意两者最多一个相同坐标). 这个操作显然至少会删掉这个元素自身, 但也会同时删掉其他元素. 我们考虑用某种方法来估计一个上界.

我们考虑两个元素如果不独立就连一条边, 当我们进行一次清零操作的时候, 假设这个坐标此时对应了 个元素, 那么会一次性删去 (2) 条边, 由于这个清零操作引发的时候还有一个元素和其他元素有边, 所以总共删去至少 (2)+1 条边. 也就是说, 我们可以用边数来控制删去的元素数量.

那么边数的期望就比较好求了. 容易验证, 当 I=I 的时候, hX(I),hY(J),hY(J) 三者两两独立 (其他情况类似), 也就是说一条边有 |S|/p3=1/p2+ϵ 的概率继续存在.

通过一些简单的计数我们可以知道, 一开始 L 中的边数是

(3NN,N,N)32((2NN)1).

最后我们利用选取的 p 的大小, 就可以得到上界, 经过了最终的清零后, 我们有

E[|LSX×SY×SZ|]18pϵ(3NN).

根据 Stirling 近似, 我们有

E[|LSX×SY×SZ|]Ω(1pϵN(274)N).

因此 ϕ=274 满足要求.

结合前面的结果, 我们有

ωlog4c327logq.

cq+2 的构造, 以及剩下的?

我们还需要知道 c=R(cwq) 能做到多好. 实际上, 由于

i=1qϵ(x0+ϵxi)(y0+ϵyi)(z0+ϵzi)(x0+ϵ2X1)(y0+ϵ2Y1)(z0+ϵ2Z1)+(1qϵ)x0y0z0=ϵ3cwq+O(ϵ4),

cq+2. 当取 q=8 的时候, 就有

ωlog8(400027)<2.40364.

这里有一个尚未解决的问题, 就是是否有 cq+1, 但是如果 q=2 的时候 cq+1 可以构造出来, 我们就有 ω=2 了.

更多?

这里其实并没有介绍 Coppersmith–Winograd 的最后结果 (ω2.3755), 为了达到最后的结果, 他们还考虑了更加复杂的张量, 被称作大 CW 张量.

据说目前最优的结果 (ω2.3728596) 又发明了被称作 laser 法, 我还没有了解过, 按下不表.

此外, Coppersmith–Winograd 的方法似乎不是唯一的路径, Cohn, Kleinberg, Szegedy 和 Umans (2003) 通过表示论另辟蹊径, 达到了和 CW 很接近的结果. 我之后有时间的话可能会尝试解读一下.

posted @   EntropyIncreaser  阅读(4216)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示