线性注意力的线性代数前置知识
线性注意力这一路的推导,卡人的地方几乎都不是注意力,而是线性代数。DeltaNet 的状态更新写成 St=St−1(I−βtktkt⊺)+βtvtkt⊺,右乘的那个 I−βtktkt⊺ 被称为广义 Householder 变换;chunkwise 形式里的 UT 变换、WY 表示、T 矩阵,全都是这个秩一修正在一个 chunk 内累乘之后的产物。不先把 I−2uu⊺ 这个原型搞透,后面每一步都只能靠记公式。
本系列按「用到什么补什么」的顺序拆前置知识,第一部分是 Householder 矩阵:定义、对称性、正交性、单位向量条件为什么不能省、几何意义、以及完整的特征值计算。全部结论都给证明,并给一段可复跑的数值验证。
1. Householder 矩阵
1.1 定义
设 u∈Rn 且 u⊺u=1(即 ∥u∥2=1),定义
H=I−2uu⊺∈Rn×n
这里 uu⊺ 是秩一的 n×n 矩阵(外积),H 是单位矩阵的秩一修正。
两点必须一开始就说清楚:
- H 只依赖 u 的方向,不依赖朝向:把 u 换成 −u,(−u)(−u)⊺=uu⊺,H 不变。所以一条过原点的直线(u 的张成空间)唯一确定一个 H。
- u 是反射超平面的法向量:H 实现的是关于超平面 {x:u⊺x=0} 的镜面反射,u 垂直于这张镜子而不是躺在镜子里。这一点在 §1.5 会被几何证明。
一个立即可用的展开式(后面反复用到):
Hx=x−2u(u⊺x)=x−2(u⊺x)u
注意 u⊺x 是标量。这说明实现上永远不要显式构造 H:一次内积加一次 axpy,O(n) 就能算完 Hx,而显式矩阵乘是 O(n2)。DeltaNet kernel 里对 I−βkk⊺ 的处理沿用同一思路。
1.1.1 一个数字算例:矩阵形式是怎么被「提」出来的
定义式 H=I−2uu⊺ 常被当成天降公式,其实它只是把「反射两步走」这句话提取公因子的结果。取 n=2、u=e1=[1,0]⊺、x=[3,2]⊺ 走一遍:
图分三层,对应三个视角:
- (a) 几何:u=e1 时镜面就是 x2 轴。从 x 出发沿 −u 方向走一步 −(u⊺x)u 落到镜面上(此时第一坐标归零),再走同样的一步就到 x′。两步等长,这正是系数 2 的来源。
- (b) 数字验证:u⊺x=1⋅3+0⋅2=3,于是 x−2(u⊺x)u=[3,2]⊺−[6,0]⊺=[−3,2]⊺;另一条路先建矩阵 H=I−2e1e1⊺=diag(−1,1),再算 Hx=[−3,2]⊺。两条路结果相同。
- © 推导:唯一需要的一步是 u⊺x 是标量,标量与向量相乘可换序,所以 (u⊺x)u=u(u⊺x)。换序之后 x 变成右端公因子,反着用分配律提出来:
x′=x−2(u⊺x)u=x−2u(u⊺x)=(I−2uu⊺)x=Hx
换序是全部的技巧所在:(u⊺x)u 里 x 被夹在中间提不出来,写成 u(u⊺x) 后 uu⊺ 自然聚成一个矩阵。这个算例里 H=diag(−1,1) 顺带把 §1.6 的结论提前摆了出来:谱为 {−1,+1}、det=−1、tr=0=n−2。一般的 u 只是把这个对角矩阵旋转到 u 指向的坐标系里而已。
1.2 对称性证明
H⊺=(I−2uu⊺)⊺=I⊺−2(uu⊺)⊺=I−2uu⊺=H■
关键一步是 (uu⊺)⊺=(u⊺)⊺u⊺=uu⊺:外积矩阵天然对称。这一步完全没有用到 u⊺u=1,所以对称性对任意 v 的 I−2vv⊺ 都成立——这是 §1.4 反例仍然对称、但不再正交的原因。
1.3 正交性证明
由 §1.2 有 H⊺H=H2,直接展开:
H⊺H=H2=(I−2uu⊺)(I−2uu⊺)=I−4uu⊺+4uu⊺uu⊺=I−4uu⊺+4u(u⊺u)u⊺=I−4uu⊺+4uu⊺=I■
第三行到第四行是唯一用到 u⊺u=1 的地方:靠结合律把中间的 u⊺u 抠成标量 1,两个 4uu⊺ 才恰好抵消。
推论(对合性):H2=I 说明 H 是对合(involution),于是
H−1=H=H⊺
作用两次回到自身——这就是反射的代数签名。对比一下:旋转矩阵也正交,但一般 R−1=R⊺=R,转两次不回原位。「正交 + 对称」两条同时成立的矩阵,本质上只能是若干方向上取 ±1 的对角化形式,Householder 是其中最简单的一类(只有一个 −1)。
正交性带来两个工程上直接有用的性质:
- 保长度:∥Hx∥2=x⊺H⊺Hx=x⊺x=∥x∥2
- 保内积(保角):(Hx)⊺(Hy)=x⊺y
所以用 Householder 做变换在数值上是完全稳定的:条件数恒为 1,误差不放大。QR 分解选它而不选 Gram-Schmidt,就是这个原因。
1.4 「u 必须是单位向量」不可省
把单位化条件去掉,取任意 v∈Rn,v⊺v=1,令 H′=I−2vv⊺。重做 §1.3 的展开,中间那个 v⊺v=∥v∥2 不再是 1:
(H′)2=I−4vv⊺+4v(v⊺v)v⊺=I−4vv⊺+4∥v∥2vv⊺=I−4(1−∥v∥2)vv⊺=I
只要 v=0 且 ∥v∥=1,残差项 −4(1−∥v∥2)vv⊺ 非零,正交性与对合性同时失效。数值上取 ∥v∥2=4.443(n=4)时,max∣(H′)2−I∣=4.43,与公式预测一致(见 §1.7 验证代码)。
结论要说准:破坏的是正交性,不是对称性。H′ 依然对称(§1.2 没用到归一化),它在 v 方向上的特征值变成了
H′v=v−2v(v⊺v)=(1−2∥v∥2)v
即 λ=1−2∥v∥2,只有 ∥v∥2=1 时它才等于 −1。∥v∥<1 时 λ∈(−1,1),变换在该方向上压缩;∥v∥>1 时 ∣λ∣>1,放大(上例 λ=−7.886,detH′=−7.886)。
| ∣v∣2 |
v 方向特征值 1−2∣v∣2 |
(H′)2=I |
几何含义 |
| <1/2 |
∈(0,1) |
❌ |
沿 v 压缩,不翻转 |
| =1/2 |
0 |
❌ |
退化为投影(丢掉 v 分量,秩 n−1) |
| ∈(1/2,1) |
∈(−1,0) |
❌ |
翻转 + 压缩 |
| =1 |
−1 |
✅ |
纯反射(Householder) |
| >1 |
<−1 |
❌ |
翻转 + 放大 |
这张表就是 DeltaNet 那一族「广义 Householder」的全部动机:I−βkk⊺ 里 k 已 L2 归一化、β∈(0,1),等价于把系数 2 换成 β,k 方向的特征值是 1−β∈(0,1)——故意落在表格第一行:它要的是可学习的部分擦除(partial erasure),而不是把旧信息原封不动翻过来。β=2 才退回严格 Householder,β=1 是完全擦除(投影)。所以「不可省」这句话准确的表述是:要正交/对合就必须归一化;DeltaNet 选择放弃正交,换来一个可控的收缩算子——收缩(∣λ∣<1)恰好是状态能长期稳定不爆的原因。
1.5 几何意义
把任意 x∈Rn 沿 u 正交分解:
x=x∥+x⊥,x∥=(u⊺x)u,x⊥=x−x∥
先验证这个分解是正交的:u⊺x⊥=u⊺x−(u⊺x)(u⊺u)=u⊺x−u⊺x=0,所以 x⊥ 落在超平面 u⊺x=0 内(这里又用了一次 u⊺u=1)。
分别作用:
Hx∥=x∥−2u(u⊺x∥)=x∥−2(u⊺x)u=x∥−2x∥=−x∥
Hx⊥=x⊥−2u(u⊺x⊥)=x⊥−2u⋅0=x⊥
由线性性合起来:
Hx=x⊥−x∥
即 Hx 是 x 关于「过原点、法向为 u 的超平面」的镜像:垂直于镜面的分量取反,平行于镜面(躺在超平面内)的分量不动。n=2 时超平面退化为一条过原点的直线,图上就是标准的轴对称:
图里能直接读出三件事:∥Hx∥=∥x∥(等长)、x 与 Hx 到虚线超平面等距且连线垂直于超平面(镜像)、以及 x↦Hx 把定向翻了过来(对应 detH=−1)。
顺带解释「u 是法向量而非镜面内方向」为什么必须如此:如果 u 躺在镜面里,被翻转的就是镜面内的一个方向,那不是反射而是关于某个 n−1 维超平面的其他变换。定义式 H=I−2uu⊺ 里 −2uu⊺ 只作用在 u 方向上,被特殊对待的那个方向就是被翻转的方向,所以它只能是法向。
1.6 特征值完整计算
特征值 −1:直接代入定义,
Hu=u−2u(u⊺u)=u−2u=−u
故 λ1=−1,特征向量 u,代数重数与几何重数都是 1(其特征空间就是 span{u},一维)。
特征值 +1:取任意 x⊥u,即 u⊺x=0,
Hx=x−2u(u⊺x)=x
故 λ=+1,特征空间为 u⊥,维数 n−1,即重数 n−1。
完整性检查:span{u}⊕u⊥=Rn,1+(n−1)=n,特征向量已张满全空间,不存在其他特征值。谱写成
λ(H)={−1,n−1+1,⋯,+1}
也就是说 H 在正交基下的对角化是 H=Qdiag(−1,1,…,1)Q⊺,Q 的第一列取 u。
两个不变量:
detH=i∏λi=(−1)⋅1n−1=−1
trH=i∑λi=−1+(n−1)=n−2
迹也能不经特征值直接验证:tr(I−2uu⊺)=n−2tr(uu⊺)=n−2u⊺u=n−2(用了 tr(ab⊺)=b⊺a)。两条路径对上,说明谱算对了。
detH=−1 是反射与旋转的分界线:
| 变换 |
正交? |
det |
对合? |
定向 |
| 旋转 R∈SO(n) |
✅ |
+1 |
❌(一般) |
保持 |
| Householder 反射 H |
✅ |
−1 |
✅ |
翻转 |
| 一般正交 Q∈O(n) |
✅ |
±1 |
❌ |
视 det |
正交群 O(n) 被 det 分成两个连通分支,det=+1 的是旋转(SO(n)),det=−1 的含反射。进一步的事实:任意 Q∈O(n) 最多能被 n 个 Householder 反射的乘积表示(Cartan–Dieudonné 定理),偶数个反射的乘积是旋转(det 相乘为 +1),奇数个是反射。这是 Householder QR 的理论基础,也是「反射比旋转更基本」的原因。
一句话总结:H=I−2uu⊺ 的一切性质都锁在 u⊺u=1 这一个条件上——它让 u 方向的特征值精确等于 −1,于是同时得到正交、对合、det=−1、保长度四个结论;把 2 换成可学习的 β、把 −1 松弛为 1−β,就从「刚性反射」变成 DeltaNet 需要的「可控擦除」。
1.7 数值验证
n=5 单位向量与 n=4 非单位向量各跑一遍,把 §1.2–§1.6 的每条结论对上机器精度:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import numpy as np
np.random.seed(0) n = 5 u = np.random.randn(n) u /= np.linalg.norm(u) H = np.eye(n) - 2 * np.outer(u, u)
print(np.abs(H - H.T).max()) print(np.abs(H.T @ H - np.eye(n)).max()) print(np.abs(H @ H - np.eye(n)).max())
x = np.random.randn(n) print(np.linalg.norm(x), np.linalg.norm(H @ x))
x_par = (u @ x) * u x_perp = x - x_par print(np.abs(H @ x_par + x_par).max()) print(np.abs(H @ x_perp - x_perp).max())
print(np.sort(np.linalg.eigvalsh(H))) print(np.linalg.det(H), np.trace(H))
np.random.seed(1) v = np.random.randn(4) G = np.eye(4) - 2 * np.outer(v, v) print(np.abs(G - G.T).max()) resid = np.eye(4) - 4 * (1 - v @ v) * np.outer(v, v) print(np.abs(G @ G - resid).max()) print(1 - 2 * (v @ v), np.linalg.det(G))
u2 = np.array([1.0, 0.0]); x2 = np.array([3.0, 2.0]) H2 = np.eye(2) - 2 * np.outer(u2, u2) print(u2 @ x2) print(x2 - 2 * (u2 @ x2) * u2, H2 @ x2) print(H2.tolist(), np.linalg.det(H2), np.trace(H2))
|
实测数字(n=5,seed 0):对称误差 0,正交误差 2.22×10−16,det=−1.0,tr=3=n−2,谱 {−1,1,1,1,1};反例(n=4,seed 1)∥v∥2=4.443,max∣H′2−I∣=4.43,v 方向特征值 −7.886;§1.1.1 算例(n=2,u=e1)两条路径均得 [−3,2]⊺,H=diag(−1,1),tr=0=n−2。全部与推导一致。
总结
- 定义:H=I−2uu⊺,∥u∥=1;只依赖 u 的方向,u 是反射超平面的法向量;算 Hx 用 x−2(u⊺x)u,O(n) 而非 O(n2)。矩阵形式本质上是把「反射两步走」靠 u⊺x 是标量、可换序提出公因子 x 得到的(§1.1.1)。
- 代数:对称(不依赖归一化)、正交、对合 H−1=H=H⊺、保长度保内积、条件数为 1。
- 谱:{−1,1n−1},det=−1(翻转定向,与旋转 det=+1 分界),tr=n−2。
- 归一化条件的作用:唯一支撑正交性的那一步;松掉它变成 I−2vv⊺,v 方向特征值滑到 1−2∥v∥2,(H′)2=I−4(1−∥v∥2)vv⊺。
可迁移的启示:一个矩阵的全部行为往往被一个标量条件锁死。看懂 u⊺u=1 在证明里出现的位置,就同时看懂了「为什么 Householder 是刚性反射」和「为什么 DeltaNet 要故意放弃这个条件」——把 2 换成 β、把特征值从 −1 松到 1−β∈(0,1),刚性反射就变成了可学习的部分擦除,而收缩性正是长序列状态不爆的保证。下一部分接着这条线,讲秩一修正的求逆(Sherman–Morrison)与秩一修正在 chunk 内累乘后如何塌缩成 WY 表示。
参考:Householder, A. S., Unitary Triangularization of a Nonsymmetric Matrix, JACM 1958;Golub & Van Loan, Matrix Computations (4th ed.) §5.1;DeltaNet / Gated DeltaNet(arXiv:2412.06464v3)§2.2、§3.1 与附录 A;本站《TileLang 实战:KDA 从零到一–Gated DeltaNet》。
本文公式均经 NumPy 数值验证,验证代码见 §1.7。