☰ DSv4.1 Flash 架构导读

5. 只改 Q 为什么够:注意力是指数族

5.1 把一次读出拆成三个对象

第 4 章的 40 层里,4 层 Full(自己算 KV 与地址)、4 层 Reindex(复用 KV、重算地址)、30 层 Reuse(KV 与地址都复用),最前还有 2 层纯 SWA。也就是说有一大批层只复用别人算好的 KV 与 Top-K,自己只算 Q。这听起来像是在"用同一份材料做几十道不同的菜",很可疑。这一章把它证清楚:固定材料的注意力,仍然是一个 512 维的指数族;改 Q 就是在族内任意移动。

先约定一次稀疏注意力的读出。设被选中的条目集合是 \(A\),每个条目是一个向量 \(c_j\in\mathbb{R}^d\)(参考实现里 key 和 value 是同一个 \(c_j\),这正是第 1.4 节 MLA 的结论),把它们按行堆成矩阵 \(C_A\in\mathbb{R}^{|A|\times d}\)。那么

\[ \begin{aligned} o(q)&=\sum_{j\in A}p_j(q)\,c_j,\\ p(q)&=\operatorname{softmax}\!\big(\tfrac{1}{\sqrt d}\,C_A q\big). \end{aligned} \]

三个可变输入各管一件事:内容 \(C_A\)(读什么)、地址 \(A\)(从哪读,离散)、查询 \(q\)(怎么读)。三种模式就是"这三样里刷新哪几样":Full 三样都刷,Reindex 刷地址与查询,Reuse 只刷查询。

判断方法

三者有一条单向依赖:\(C\to A\to\) 读出,而 \(q\) 只在读出端注入。所以复用只能自上而下——可以"复用内容顺带复用地址"(Reuse),可以"复用内容但重选地址"(Reindex);反过来"换了内容却沿用旧地址"技术上能算(旧编号仍然有效),但拿到的 Top-K 已经不对应新内容,等于用陈旧地址读新记忆。CSA2 的三种模式因此不是三个并列的设计,而是这条依赖链上从"最全"到"最省"的三个档位。这里的 \(q\) 专指主注意力的查询;Indexer 有自己的查询 \(q^I\)(第 2.3 节),地址由它决定。

5.2 输出一定落在凸包里

\(p_j\ge 0\) 且 \(\sum_j p_j=1\),所以 \(o(q)\) 是 \(\{c_j\}\) 的凸组合(convex combination)。凸组合的意思:每个坐标都介于 \(c_j\) 对应坐标的最小值与最大值之间。因此

\[ o(q)\in\operatorname{conv}\{c_j:j\in A\} \qquad\text{对一切 }q . \]

这条结论在数学基础第 7.4 节出现过一次,当时只说了"不会凭空造出超出候选范围的值"。现在要问的是更强的问题:改 \(q\) 能在这个凸包里走多远?

先手算一个两维的例子,把后面所有公式都落到实处。取三个条目

\[ c_1=(1,0),\quad c_2=(0,1),\quad c_3=(1,1), \] \[ d=2,\qquad \sqrt d=1.4142 . \]

代入三个查询:

q        p (c1,c2,c3)     o
 1.41    0.42 0.16 0.42  0.84 0.58
-1.41    0.21 0.58 0.21  0.42 0.79
 0.00    0.33 0.33 0.33  0.67 0.67

第一行:\(q\) 与 \(c_1,c_3\) 对齐,权重偏向它们,输出靠近线段 \(c_1c_3\) 的中间。第二行:反号,权重倒向 \(c_2\),输出跑到三角形的另一侧。第三行:全零查询,三个条目打分相同,输出正好是重心 \((2/3,2/3)\)。

这张表就是"只改 Q"的全部内容:三个条目一个都没变,只改查询,输出就在三角形内从 \((0.845,0.578)\) 走到 \((0.424,0.788)\)。它们都在 \(\operatorname{conv}\{c_1,c_2,c_3\}\) 里,也都在它的内部——因为三行概率没有一个是零。

5.3 改 Q 的一次微小移动:Jacobian 就是协方差

看局部。对 \(q\) 求导。先算 softmax 的导数,这是一条要背下来的式子:

\[ \frac{\partial p_j}{\partial q} =\frac{1}{\sqrt d}\,p_j\Big(c_j-\sum_{i}p_i c_i\Big) \] \[ =\frac{1}{\sqrt d}\,p_j\,(c_j-o). \]

推导只要两步:\(\partial z_j/\partial q=c_j/\sqrt d\);对 \(\log p_j=z_j-\log\sum_i e^{z_i}\) 求导得 \(\partial_z \log p_j=\delta_{jk}-p_k\)。两者相乘即可。

再把它代进输出 \(o=\sum_j p_j c_j\):

\[ \frac{\partial o}{\partial q} =\frac{1}{\sqrt d}\sum_j p_j\,(c_j-o)\,c_j^{\top} =\frac{1}{\sqrt d}\,\Sigma_p , \] \[ \Sigma_p=\sum_j p_j c_jc_j^{\top}-oo^{\top}. \]

其中 \(\Sigma_p\) 叫协方差矩阵。这个式子的意思是 \(\Sigma_p=\sum_j p_j(c_j-o)(c_j-o)^\top\),即每个条目相对均值的偏差张成的加权外积和。

于是得到一句可以当工具用的话:注意力输出对查询的 Jacobian,就是当前权重下条目的协方差(除以 \(\sqrt d\))。它是半正定对称矩阵,秩不超过 \(d\),也不超过 \(|A|-1\)(因为 \(\sum_j p_j(c_j-o)=0\) 给出一个零方向)。

回到例子,在 \(q=(1.414,0)\) 处,\(p=(0.4223,0.1554,0.4223)\)、\(o=(0.8446,0.5777)\),算得

\[ \frac{\partial o}{\partial q}=\Sigma_p/\sqrt2 =\begin{pmatrix}0.0928&-0.0464\\ -0.0464&0.1725\end{pmatrix}. \]

用差分验算:对 \(q\) 的第二个分量加 \(\pm10^{-6}\),输出变化率是 \((-0.0464,\,0.1725)\),与上面第二列一致。这一步值得亲手按一遍,它是"梯度正常回流"这句话的具体含义:Reuse 层没有 Indexer、没有 Top-K,但 \(\partial o/\partial q\) 是光滑的,梯度照常传回 \(W_q\)。

5.4 改 Q 的全局效果:对基线分布做指数倾斜

局部看完了看整体。把源层(发布这份 KV 与 Top-K 的那层)的查询记为 \(q^\ast\),它对应的分布 \(p^\ast=\operatorname{softmax}(C_Aq^\ast/\sqrt d)\) 叫基线分布。本层的查询写成 \(q=q^\ast+\Delta q\)。注意内积是可加的:\(\langle q,c_j\rangle=\langle q^\ast,c_j\rangle+\langle\Delta q,c_j\rangle\),而 \(p^\ast_j\propto e^{\langle q^\ast,c_j\rangle/\sqrt d}\) 只是被缩放了一个与 \(j\) 无关的常数,所以

\[ p_j(q)=p^\ast_j\cdot\frac{e^{t_j}}{\sum_i p^\ast_i e^{t_i}}, \qquad t=\frac{1}{\sqrt d}\,C_A\,\Delta q . \]

也就是

\[ p_j(q)\ \propto\ p^\ast_j\,e^{\,t_j}. \]

这个操作在统计里有名字:指数倾斜(exponential tilting)。它的含义是"先按基线概率给每个条目一个底分,再按 \(t_j\) 抬升或压低"。三种极端都在里面:取 \(t\) 为常数,分布不变;取 \(t\) 沿某个方向拉开,分布向该方向暴露的面集中;只有当目标条目是该凸包的一个顶点(能被某个线性泛函唯一暴露)时,才能把分布压到它的 one-hot。中间就是软插值。

常见错误

"任意条目都能被单独选出来"不成立。反例:\(c_1=-1,\;c_2=0,\;c_3=1\) 在同一条直线上,无论 \(q\) 取什么值,中间那条的概率最大只能到 \(1/3\)。它不在凸包的顶点上,就没有任何倾斜能让它独占。

能实现哪些 \(t\)?只有那些能写成 \(C_A\Delta q\) 的。所有可达的倾斜构成一个线性子空间:

\[ \mathcal T=\{C_A\Delta q:\Delta q\in\mathbb{R}^{d}\}=\operatorname{col}(C_A), \] \[ \dim\mathcal T=\operatorname{rank}(C_A)\le\min(d,|A|). \]

代入第 4 章的配置:\(d=512\)(潜在维),\(|A|=K+W=512+128=640\)(512 条选中 + 128 条窗口)。于是

\[ \dim\mathcal T\le 512<640-1=639 . \]

640 个条目上的概率分布处在一个 639 维的单纯形里,而这里只能到达其中至多 512 维的一片。至少 127 个方向的重新加权,是任何 \(\Delta q\) 都做不到的。这不是缺陷,是"共用一份记忆"必须付的价——下一节算清楚这个价的边界。

5.5 像集:恰好是凸包的相对内部

现在问最完整的问题:让 \(q\) 取遍整个 \(\mathbb{R}^d\),\(o(q)\) 的像集是什么?答案不是"凸包"这么含糊,而是凸包的相对内部(relative interior,记 \(\operatorname{relint}\)):去掉边界面的那部分。

把基线权重写成 \(\rho_j=p^\ast_j>0\)(\(\sum_j\rho_j=1\)),并定义对数配分函数

\[ \psi(q)=\log\sum_{j=1}^{n}\rho_j\,e^{\langle q,c_j\rangle}, \] \[ p_j(q)=\rho_j\,e^{\langle q,c_j\rangle-\psi(q)} . \]

(把 \(1/\sqrt d\) 并进 \(q\) 的尺度里,下式不再显式写出。)对 \(q\) 求导,指数项给出概率,于是

\[ \nabla\psi(q)=\sum_j p_j(q)\,c_j=o(q). \]

第一步(包含):\(o\) 是凸组合,所以 \(\nabla\psi\) 的像在 \(\operatorname{conv}\{c_j\}\) 里。

第二步(边界到不了):\(\rho_j>0\) 且指数因子恒正,所以每个 \(p_j(q)>0\);一个坐标严格为正的凸组合不可能落在边界面上。所以像在相对内部。

第三步(内部全都能到):取任意目标 \(u\in\operatorname{relint}\operatorname{conv}\{c_j\}\),看泛函

\[ g(q)=\langle q,u\rangle-\psi(q). \]

\(g\) 是凹函数(\(\psi\) 是 log-sum-exp,凸)。要证它有最大值点,光有上界不够——凹函数可能有上界却取不到(例如 \(-e^{-x}\) 就有一条渐近上界)。关键要用到 \(u\) 在相对内部:令 \(L=\operatorname{span}\{c_j-c_1\}\) 是凸包所在的有效子空间。因为 \(u\) 在相对内部,存在 \(\varepsilon>0\),使每个 \(v\in L,\ \|v\|=1\) 都满足

\[ \max_j\langle v,\,c_j-u\rangle\ \ge\ \varepsilon . \]

对 \(q=\|q\|v\in L\),取使内积最大的 \(j^\ast\),则

\[ \begin{aligned} \psi(q)&\ \ge\ \log\rho_{j^\ast}+\langle q,c_{j^\ast}\rangle\\ &\ \ge\ \log\rho_{\min}+\|q\|\big(\langle v,u\rangle+\varepsilon\big), \end{aligned} \]

其中 \(\rho_{\min}=\min_j\rho_j>0\)。于是

\[ g(q)\ \le\ -\|q\|\,\varepsilon-\log\rho_{\min}, \] \[ g(q)\ \longrightarrow\ -\infty\qquad(\|q\|\to\infty). \]

所以 \(g\) 在 \(L\) 上连续、在无穷远处趋于 \(-\infty\),必在某点取到最大值;一阶条件 \(\nabla g=0\) 就是 \(u=\nabla\psi(q)=o(q)\)。\(g\) 在 \(L^\perp\) 方向上不变,不影响结论。这顺带处理了顶点不满维的情形(例如所有 \(c_j\) 落在一条直线上)。

结论

\(\{o(q):q\in\mathbb{R}^d\}=\operatorname{relint}\operatorname{conv}\{c_j:j\in A\}\)。只要内容与地址固定,改 Q 可以在凸包内部到达任何一点——而 Full 层能做的,是换一份 \(C_A\)(换掉顶点),把输出挪到凸包之外,或者换掉整个指数族的"倾斜几何"。

顺带说明为什么这条结论不矛盾于 5.4 节的 512 维上界:凸包本身活在 \(\mathbb{R}^{512}\) 里,最多 512 维;639 维说的是"概率分布"的空间,不是"输出"的空间。同一个输出可以由许多不同的分布给出(\(640>512\),映射不单射),所以分布侧受限、输出侧仍可满。

5.6 与 Full 的差距:三件事做不到

把 Full 层和 Reuse 层摆在一起,Full 层有三个随层独立变化的自由度:

对固定的 \((C^\ast,S^\ast)\) 有严格包含 \(\text{Reuse}\subseteq\text{Full}\),而且 Full 还对所有 \((C,S)\) 取并。缺口正好是三件 Reuse 做不到的事:

  1. 召回上限:\(j\notin S^\ast\) 且不在局部窗口里的内容根本不在 \(A\) 里,任何 \(\Delta q\) 都够不着它。在复用段内,上游选错下游确实补不回来;但跨段看,后续 Reindex / Full 可以重选地址(下一条),所以这是"这一段内的上限",不是永久损失(2.4 节)。
  2. 顶点不可移:输出被钉在 \(\operatorname{conv}\{c^\ast_j\}\) 内。Full 层换 \(v_j\) 就能把输出放到凸包外(比如让某个条目带上相反的符号方向),Reuse 不能。
  3. 倾斜几何不可换:可达分布的集合是由 \(C_A^\ast\) 决定的那个固定指数族。Full 换掉 \(C^l\) 等于换掉整个族;Reuse 只能在这个族里挑一个成员。

还有一个必须说清的细节:RoPE 的影响取决于实现里到底存了什么、算什么。真实注意力比较的是不同位置:\(\langle R_tq,\,R_jk_j\rangle=q^{\top}R_t^{\top}R_jk_j\),不能用一个"同位置"的恒等式把旋转消掉。本节所有结论都建立在候选集固定、键和值是同一个向量的理想化模型上。如果实现里 K 旋转、V 不旋转,读出映射的 Jacobian 一般不再是半正定的值协方差,像集也不自动是相对内部——这属于实现细节,要回代码核对,不能靠"旋转是正交的"一句话带过。

5.7 这套数学解释了哪几个设计

报告之外还有一层推测:既然每层的 KV 空间是一个随深度变化的高维流形,或许可以用"Q 感知的参数"把下一层的空间映射回当前层,从而连 Q 都不必每层重算。原文把这类想法归入内部实验,没有给出结论。读到这里的人可以自己判断它的可行性:它要解决的是 F2,而 F2 正是上面证明里唯一不能靠 \(\Delta q\) 绕过的自由度。

5.8 容易算错的地方

常见错误
  • 把"凸组合"当成"凸包内部"。凸组合允许某些系数为 0,那就在边界上;\(\rho_j>0\) 才保证严格内部。训练中某些权重会饱和到接近 0,实际输出会贴近边界面。
  • 把 639 当成"能到达的分布维数"。639 是单纯形的维数,是上界;实际可达 ≤512。
  • 漏掉 \(\sqrt d\)。Jacobian 是 \(\Sigma_p/\sqrt d\),不是 \(\Sigma_p\);用差分验算时数值会对不上(差 1.414 倍)。
  • 以为指数倾斜能改变排序之外的任何东西。它只能重新分配质量,不能引入新条目;\(t\) 只能把已有的 \(p^\ast_j\) 按比例缩放。
  • 把 RoPE 当成"破坏共享",或者反过来当成"完全无害"。旋转是正交的,但它按位置作用在不同向量上,不能用一个"同位置"的恒等式消掉;结论成立的前提是"候选集固定、K 与 V 同源"。真正影响共享自由度的是 (F2)(F3)。