注意力机制的每一次变体革命,本质上都是在回答同一个问题:如何在不损失表达能力的前提下,把 KV cache 的内存和计算代价压下去。
早在 Transformer 诞生之前,Schmidhuber 在 1993 年提出"快速权重"(Fast Weights)机制,允许网络动态生成权重矩阵。这是注意力机制的哲学先祖,但受限于当时的计算条件,未能大规模落地。
Bahdanau 等人在机器翻译中提出软注意力(soft attention),让解码器在每一步可以"回望"编码器的全部隐状态,并用一个对齐分数加权求和。这打破了 seq2seq 模型必须把所有信息压缩进单一向量的瓶颈。核心公式是 $e_{ij} = a(s_{i-1}, h_j)$,其中 $a$ 是一个小型 MLP。这是第一次让"哪里重要就看哪里"成为可微分操作。
Vaswani 等人在《Attention Is All You Need》中将注意力机制推向极致:去掉 RNN,完全依赖自注意力堆叠。Multi-Head Attention(MHA)将 Q/K/V 投影到 $h$ 个子空间并行计算,再拼接输出。这带来两个关键好处:不同头可以捕捉不同语义关系;并行计算极大提升训练效率。但代价是 KV cache 随头数线性增长,推理时内存压力巨大。
Shazeer 在 Google 内部提出 MQA(Multi-Query Attention):所有头共享同一组 K 和 V,只有 Q 保持多头。KV cache 从 $O(h \cdot d)$ 降至 $O(d)$,推理带宽需求骤降。代价是模型质量有所下滑,尤其在需要精细区分不同关系的任务上。
Ainslie 等人(Google Research)提出 Grouped Query Attention(GQA):将 $h$ 个查询头分成 $g$ 组,每组共享一对 K/V。当 $g=1$ 退化为 MQA,当 $g=h$ 退化为 MHA。Llama 2/3、Mistral 等主流模型均采用 GQA,实现了质量与效率的工程最优解。
DeepSeek 提出 Multi-head Latent Attention(MLA):不直接缓存 K/V,而是缓存一个低秩的潜变量 $c$,推理时从 $c$ 恢复 K/V。这将 KV cache 压缩比进一步推向极限,同时通过吸收投影矩阵避免推理时的额外计算开销,代表了注意力压缩从"减少头数"到"压缩表示维度"的范式转移。
设序列长度为 $L$,模型维度为 $d$,头数为 $h$,每头维度为 $d_h = d/h$。 MHA 的标准注意力输出为: $$\text{head}_i = \text{softmax}\!\left(\frac{Q_i K_i^\top}{\sqrt{d_h}}\right) V_i, \quad Q_i = X W_i^Q,\ K_i = X W_i^K,\ V_i = X W_i^V$$ 推理时需缓存所有头的 K/V,总量为 $2 \cdot L \cdot h \cdot d_h = 2Ld$。 GQA 将 $h$ 个查询头分为 $g$ 组,每组对应一对 K/V: $$\text{head}_i = \text{softmax}\!\left(\frac{Q_i K_{\lfloor ig/h \rfloor}^\top}{\sqrt{d_h}}\right) V_{\lfloor ig/h \rfloor}$$ KV cache 降至 $2 \cdot L \cdot g \cdot d_h$,压缩比为 $h/g$。 MLA 引入低秩联合压缩:令 $c_t^{KV} = X_t W^{DKV} \in \mathbb{R}^{d_c}$,其中 $d_c \ll hd_h$,再通过上投影恢复: $$K_t = c_t^{KV} W^{UK},\quad V_t = c_t^{KV} W^{UV}$$ 推理时只需缓存 $c_t^{KV}$,KV cache 从 $2hd_h$ 降至 $d_c$。关键洞察:$W^{UK}$ 可在推理前与 $W^Q$ 合并吸收,消除额外矩阵乘法,使压缩"免费"。 $\sqrt{d_h}$ 缩放因子的作用:防止点积在高维空间中数值过大导致 softmax 梯度消失,这是 Vaswani 等人的经典设计。
现代注意力变体的工作逻辑是:在推理阶段识别 KV cache 为核心瓶颈,然后通过不同粒度的参数共享或低秩分解来压缩它,同时用训练时的容量补偿推理时的信息损失。
在自回归生成中,每生成一个 token 都需要访问所有历史 token 的 K/V 向量。对于批大小 $B$、序列长度 $L$、头数 $h$、头维度 $d_h$ 的模型,KV cache 占用 $2BLhd_h \times \text{层数}$ 字节。以 Llama-3 70B 为例,在 $L=8192$、$B=32$ 时 KV cache 超过 100GB,远超 GPU 显存。这不是计算瓶颈,而是内存带宽瓶颈——每个解码步骤都要把整个 KV cache 从 HBM 搬到计算单元。
GQA 的核心设计决策是:不同查询头在关注"哪个位置"时可以有差异(保留多个 Q),但关注"那个位置的内容"时可以共享(合并 K/V)。实现上,将 $h$ 个头均匀分为 $g$ 组,每组内的头共享同一对 $W^K, W^V$。训练时与 MHA 几乎相同,只是 K/V 投影矩阵数量从 $h$ 降至 $g$。关键工程细节:从 MHA 预训练模型迁移到 GQA 时,可以用组内 K/V 头的均值初始化共享头,再微调,效果接近从头训练。Llama 2 70B 使用 $g=8$($h=64$),KV cache 压缩 8 倍。
MLA 的设计哲学更激进:既然 K/V 矩阵本身是低秩的(这在大量实证研究中得到验证),为什么不直接在低维潜空间中缓存?具体地,用一个"下投影"矩阵 $W^{DKV} \in \mathbb{R}^{d \times d_c}$ 将输入压缩到 $d_c$ 维潜变量,推理时缓存该潜变量而非完整 K/V。关键工程技巧:上投影矩阵 $W^{UK}$ 可以在推理前与查询投影 $W^Q$ 合并(矩阵吸收),使得推理时不需要额外的矩阵乘法来恢复 K,计算开销与 MHA 相当。DeepSeek-V2 中 $d_c = 512$,而 $hd_h = 128 \times 128 = 16384$,压缩比约 32 倍。
另一条路线不压缩 KV cache,而是在计算注意力时跳过不重要的位置。Sliding Window Attention(Mistral)让每个 token 只关注最近 $w$ 个位置,将复杂度从 $O(L^2)$ 降至 $O(Lw)$。BigBird/Longformer 结合局部窗口 + 全局 token + 随机稀疏,在理论上保持全局感受野。Flash Attention 则是另一维度的优化:不改变数学等价性,而是通过 IO-aware 的分块计算避免将完整注意力矩阵写回 HBM,将内存复杂度从 $O(L^2)$ 降至 $O(L)$。
最新趋势是混合架构:在 Transformer 层中插入线性注意力层(如 Mamba、RetNet)或滑动窗口层,只在关键层保留全局 MHA/GQA。Jamba(AI21)、Zamba(Zyphra)等模型验证了这种策略:用少量全局注意力层捕捉长程依赖,用线性层处理局部模式,整体 KV cache 大幅减少。
GQA 已成为 2023 年后几乎所有主流开源 LLM 的标配(Llama 2/3、Mistral、Qwen、Gemma),直接影响了数百亿参数模型的推理成本。MLA 在 DeepSeek-V2/V3 中验证了低秩压缩路线的可行性,使单卡可服务更长上下文。Flash Attention 被集成进 PyTorch、HuggingFace Transformers,成为训练和推理的基础设施。这些技术共同将 LLM 的推理成本降低了一个数量级,直接推动了大模型的商业化落地。
当前热点:①MLA 的理论分析——低秩假设在何种任务上会失效?②注意力头的异质性——不同层/头是否应采用不同压缩策略(自适应 GQA)?③KV cache 量化与稀疏的联合优化(TurboQuant 等工作);④线性注意力与 softmax 注意力的混合比例如何自动搜索?⑤超长上下文(>1M token)下注意力的根本性替代方案是否存在?