GQA 的压缩止步于"头数变少、每头维度不变"。MLA(Multi-head Latent Attention,DeepSeek-V2 提出,V3 沿用)把问题换个提法:K/V 对每层的 token 表示本来就是一个 $2\cdot n_h\cdot d_h$ 维的张量(V3 里是 $2\times128\times128=32768$ 维),其中真正独立的信息有多少?答案如果远小于 32768,压缩就该对着信息维度做,而不是对着头数做。
低秩投影:缓存潜变量,不缓存 K/V
MLA 的做法是把 K/V 的形成改写成两段。对每个位置 $t$,先从隐藏状态压出潜向量:
$$ c_t^{KV} = W^{DKV}\, h_t \in \mathbb{R}^{d_c}, \qquad d_c = 512 \ (\text{V3}), $$
推理时 KV cache 里只存 $c_t^{KV}$(外加一个位置分量,下节讲),每 token 每层缓存从 32768 维降到 512 维量级——比 GQA 还少一个数量级。注意力计算时再把潜向量上投影回各头的 K/V:
$$ k_{t,i} = W^{KR}_i\, c_t^{KV}, \qquad v_{t,i} = W^{UV}_i\, c_t^{KV}, \quad i=1,\dots,n_h. $$
这本质是认定矩阵 $K_{\text{all}} = [k_{1,:},\dots,k_{n,:}]$(所有位置的 K 拼起来,形状 $n_h d_h \times n$)对 $W^{DKV}$ 的值域是低秩的:V 同理。GQA 的低秩假设是"组间共享"(块对角结构),MLA 的低秩假设是"全部共用一个 $d_c$ 维值域"(秩 $d_c$ 结构),后者是前者的推广,压缩上限高得多,代价是头与头之间的 K/V 不再有任何独立性。
吸收:推理时的等效改写
上投影看着要在每步解码时对每个历史 token 重算 $n_h$ 份 K/V——这会把缓存省下的算力又还回去。MLA 的关键技巧是权重吸收:上投影矩阵和 Q/O 投影合并,让潜向量直接参与打分。
打分侧:head i 的注意力分数(暂略 RoPE 分量)是
$$ s_i = q_i^\top k_i = (W^Q_i h_t)^\top (W^{KR}_i c^{KV}) = \big(\underbrace{W^{QK}_i}_{(W^{KR}_i)^\top W^Q_i} h_t\big)^\top c^{KV}. $$
合并后的 $W^{QK}_i$ 形状 $d_c \times d$,是离线算好的常量。解码时每步只对当前 query 算一次 $W^{QK}_i h_t \in \mathbb{R}^{512}$,和历史 $c^{KV}$ 做点积——上投影从"每历史 token 一次"摊到"每新 token 一次"。
输出侧同理:head i 的输出是注意力权重向量 $a_i \in \mathbb{R}^n$ 乘 V,
$$ o_i = \sum_j a_{i,j}\, W^{UV}_i c_j^{KV} = W^{UV}_i \underbrace{\Big(\sum_j a_{i,j}\, c_j^{KV}\Big)}_{:=\,u_i \in \mathbb{R}^{d_c}} = W^{UV}_i u_i, $$
即先对潜向量加权求和得 $u_i$,再上投影。两步吸收的净效果:MLA 推理的 GEMM 形状和"单头、维度 $d_c$ 的注意力"几乎一样,却保有 $n_h$ 个头的 Q 侧多样性。
解耦 RoPE:低秩压缩与位置编码的冲突
RoPE 要作用在 K 上:$k \leftarrow R_t k$,其中 $R_t$ 是位置 $t$ 的旋转矩阵。麻烦在于 $R_t$ 夹在两层投影中间,$W^{KR} R_t W^{DKV}$ 没法离线合并($R_t$ 随 $t$ 变),吸收技巧对带 RoPE 的部分失效。DeepSeek 的处理是解耦:K 拆成内容分量(上面的吸收路径,不经 RoPE)和位置分量 $k_t^R = \mathrm{RoPE}(W^{KR} h_t)$($d_h^R=64$ 维,所有头共享,只做位置用),RoPE 只加在位置分量上;Q 侧对称地拆出 $q_i^R$。cache 里额外存每个历史 token 的 $k_t^R$,每 token 每层的总缓存是 $d_c + d_h^R = 576$ 维——仍然比 GQA 小一个数量级。后来 Kimi 的 MLA 变体、Qwen3-Next 的线性注意力方案都沿用了"位置通道独立"这个设计,它是"低秩压缩 × 相对位置编码"这组矛盾的标准解法。
小结
MLA 把 KV cache 问题重新表述为低秩压缩:缓存对象从"每头的 K/V"换成"所有头共享的潜向量",再用权重吸收把上投影成本摊薄到每 token 一次,最后用解耦 RoPE 绕开"位置旋转夹在低秩投影中间、无法离线合并"的死结。三件套各自的动机——信息维度远小于头数×维度、矩阵乘结合律、相对位置编码的不可吸收性——都是可以独立理解的,合在一起才是 MLA。代价也要记账:训练时为了反向传播需要保存各头 K/V 或等价中间量,训练显存收益小于推理;$d_c$ 是新的容量瓶颈,太短会直接顶到表达力上限。V3 的 512 是实测甜点,下一代往上还是往下,取决于"长检索任务对 K 值域秩"的进一步证据。