Day 18 · 注意力变体
注意力变体:MQA、GQA 到 MLA 的压缩史诗
昨天我们看到,KV Cache 是一头吃爆显存的怪兽。为了给大模型推理松绑,过去几年工业界发动了一场波澜壮阔的「显存自救运动」:从激进共享的 MQA、折中平衡的 GQA(LLaMA-3),到用低秩投影将显存压到极致的 MLA(DeepSeek / Kimi K3)。今天我们看懂注意力的压缩进化主线。
学完你能回答
MQA 与 GQA 是怎么通过「共享」省显存的?
学完你能回答
MLA(多头潜在注意力)的核心压缩原理是什么?
学完你能回答
为什么 MLA 是显存救星而非「费地方的经典注意力」?
1起点:这些你早就会了
注意力压缩的演进,本质是「如何用更少的草稿纸记下同样多的信息」:
| 你已经会的 | AI 世界里对应的东西 |
| 8 个人各买一套百科全书:每个人桌上都堆满书(极度浪费) | MHA(2017 多头):每个头拥有独立的 Key 和 Value,KV 缓存膨胀 8 倍 |
| 全班 8 个人共用 1 套百科全书:桌子瞬间空出来了,但可能抢书 | MQA(多查询注意力):所有 Query 头强行共享同 1 组 Key/Value,显存降至 1/8 |
| 分成 2 个学习小组,每组 4 人共用一套书:折中平衡 | GQA(分组查询注意力):8 个 Query 头分成 2 组,每组共享 1 个 KV 头 |
| 租房权衡:便宜的房子通勤远,近的房子贵——在预算和体验之间找平衡点 | 压缩率与表达力的权衡:MQA 压得最狠但有损伤,GQA 取折中,MLA 试图两头兼顾 |
| 压缩包(ZIP):把 512 维厚书压缩成 128 维密码本,用时秒解压 | MLA(多头潜在注意力):用低秩矩阵仅缓存潜在向量 c_t^KV,显存大降 |
2MQA 与 GQA:靠「共享」给显存瘦身
在 2017 原版 MHA(Multi-Head Attention) 中,如果有 32 个头,每个 token 就要生成 32 个不同的 K 向量和 32 个 V 向量,显存开销极大。
两代共享机制演进
•
MQA(Multi-Query Attention,Shazeer 2019):
极度激进:保留 32 个
Q 头,但
强行让所有头共用唯独 1 个 K 和 1 个 V!
KV Cache 显存暴降至原来的
1/32(节省约 97%)!但代价是模型的表达能力受到一定损伤。
•
GQA(Grouped-Query Attention,Ainslie 2023):
黄金折中:把 32 个
Q 头分成 8 组,每 4 个
Q 共享 1 组
K/V(共 8 组 KV)。
显存压到 1/4,同时模型效果几乎追平原生 MHA——这成为了
LLaMA-2/3、Mistral 等开源模型的绝对主流。
严格来说(类比的边界):百科全书是「买的时候只买一套」,MQA/GQA 也一样——模型在训练时就只学出 1 组(或几组)K/V 投影,不是先训好全量再共享;而且「效果几乎追平」是经验结论,不是数学保证。
3MLA(多头潜在注意力):低秩压缩的降维打击
GQA 虽然好,但只要想保持全量多头表征,KV 缓存依然难以进一步压缩。2024 年,DeepSeek 提出了 MLA(Multi-Head Latent Attention),并在 Kimi K3(Gated MLA,§2.1.2)中得到了发扬光大。
MLA 的核心压缩精髓:低秩隐空间
不要直接存各个头的 K 和 V!
1. 下投影压缩:把输入的高维特征先投影到一个极小维度的潜在向量(Latent Vector)c_t^KV(例如仅 512 维);
2. 显存只存潜在向量:在 GPU 显存(KV Cache)里,只保存这个扁平的 c_t^KV!
3. 计算时在线解压:在计算注意力时,由于矩阵乘法的结合律,可以把「解压」用的升投影矩阵预先吸收进 Query 一侧,完全不需要在显存中展开巨大的各头 KV!
严格来说(类比的边界):ZIP 是无损压缩,而 MLA 的低秩压缩是「学出来」的有损近似——压得好不好由训练保证;而且推理时并没有真的「解压」,升投影被矩阵吸收进了 Query 一侧,密码本始终没摊开。
图 18.1:注意力压缩进化全貌。MLA 的本性就是极致压缩省缓存,使超长序列大并发推理成为现实。
进阶小注 · MLA 的解耦位置键(Decoupled RoPE Key):
由于潜在向量 c_t^KV 经过了低秩线性下投影,若直接在其上乘 RoPE 会破坏矩阵吸收结合律。因此 DeepSeek 原版 MLA 巧妙地采用了解耦位置键(Decoupled Position Key)机制:将 Key 拆分为不带位置的压缩隐向量 c_t^KV 与极小维度的解耦旋转键 k_t^R,分别与 Query 计算内积后相加。既保全了 RoPE 相对位置感知,又彻底解放了 KV 缓存!注意:这是 DeepSeek 原版 MLA 的设计;K3 的 MLA 层改用 NoPE(Day 16 讲),没有这套解耦键。
4面试视角
面试视角 · 高频考点
面试官可能会问:「对比一下 MHA、MQA、GQA 和 MLA 的区别?为什么 MLA 能在不损失表达能力的前提下大幅节省显存?」
八股答「MHA 是每个头独立 KV;MQA 是所有头共用一个 KV;GQA 是按组共享 KV。MLA 是用低秩分解压缩 KV,缓存只存潜在向量,显存压缩比最高而且效果不下降。」——核心要点都有,若能说清矩阵吸收(Matrix Absorption)则达到资深架构师水平。
本课答「演进的主线是在表征容量与 KV 显存带宽之间寻找帕累托最优:① MHA → MQA/GQA:通过硬性减少 Key/Value 头数(剪裁参数维度)来降低缓存大小,但会牺牲一定的多子空间检索自由度;② MLA 的数学降维打击:MLA 保持了全量多头的高维检索表达力,但在存储时通过低秩下投影矩阵将 Key 和 Value 联合压缩为一个低维潜在向量 c_t^KV。在推理时,利用矩阵乘法的结合律做一个「吸收等价」:把重建 Key/Value 所需的升投影矩阵预先合并进 Query 一侧的投影中,从而在全程无需在显存中解压展开多头 KV 的前提下完成注意力计算——DeepSeek-V2 论文报告 KV 缓存因此压缩了 90% 以上,同时保持了 MHA 级别的表征能力。」
5映射到原文:K3 报告 §2.1.2
K3 原文(§2.1.2 Gated MLA)
「MLA 不再缓存完整的逐头键与值,而是缓存 c_t,并在注意力计算过程中通过学习到的升投影重构内容键与值。这种分解在保留全局 token 间注意力的同时降低了 KV 缓存占用。」
逐词翻译:
- 「不再缓存完整的逐头键与值」:对照第 1 节的 8 套百科全书——MHA 是每个头各存一套独立 K/V,MLA 一套都不存。
- 「缓存 c_t」:c_t 就是第 3 节那个压缩后的潜在向量,显存里只有它。
- 「学习到的升投影重构内容键与值」:「升投影」就是「解压」,解压矩阵是训练时学出来的;配合矩阵吸收,连「真的解压出来」这一步都省了。
- 「降低了 KV 缓存占用」:直接对应 Day 17 那头吃显存的怪兽被瘦身——这也是 K3 在周期性的全局注意力层里保留 MLA 的原因。
1/32
MQA 相对 32 头 MHA 的
KV 缓存占比
1/4
GQA-8 相对 32 头 MHA 的
KV 缓存占比
MLA
K3/DeepSeek 采用的
低秩潜在注意力
90%+
MLA 相对 MHA 的 KV 缓存压缩率(DeepSeek-V2 论文口径)
6自测题(先自己答,再点开看解析)
Q1 MQA 和 MHA 的核心结构区别是什么?
解析:MHA 中每个 Query 头拥有独立的 Key 头和 Value 头;MQA 中所有 Query 头共享同一个全局 Key 头和 Value 头。
Q2 假设有 32 个 Query 头,采用 GQA-8 分组,KV 缓存缩小到了原来的几分之几?
解析:32 个 Query 头分为 8 组,每 4 个 Query 共享 1 组 KV,共有 8 组 KV。缓存大小为原版 MHA 的 8/32 = 1/4(25%)。
Q3 MLA 为什么能将 KV 显存大幅压缩?它存的是什么?
解析:MLA 不直接缓存展开后的高维 Key 和 Value,而是将它们通过低秩矩阵压缩为一个维度极小的潜在向量(Latent Vector c_t^KV),显存中仅需保存该潜在向量。
Q4 为什么 MLA 推理时不需要在显存里把潜在向量解压回全量多头?
解析:因为矩阵乘法的结合律,解压投影矩阵可以预先与 Query 的投影矩阵相乘合并(矩阵吸收),直接用变换后的 Query 与低维潜在向量做内积。
Q5 在设计存活表上,注意力机制从 2017 到 2026 经历了怎样的压缩接力?
解析:从 2017 的全量缩放点积(MHA)→ MQA(激进共享)→ GQA(分组平衡)→ MLA 低秩潜在压缩(K3 最终选择之一)。
明天 · Day 19
线性注意力与 KDA:Kimi K3 的核心灵魂
如果完全不存 KV 缓存,用一个固定大小的记忆矩阵(State)能做到多强?KDA 又是怎么把长文本推理的显存和成本压下来的?
进入 Day 19 →