Multi-Head Attention、MQA 和 GQA 有什么区别?

三个厨师八个灶,效率与质量的博弈
上篇聊完了 Q、K、V 的含义。Query 是查询,Key 是索引标签,Value 是实际内容——Attention 就是让 Query 通过 Key 找到匹配的 Value。为什么要除以根号 dk?因为点积值会随着维度增长而变大,直接过 Softmax 会把梯度压到接近零。
搞懂这些之后,一个更现实的问题浮现出来:为什么现代大模型越来越关心 KV Cache 的开销?
这个问题,比你想象的更紧迫。
一、从单头到多头:八个专家比一个通才靠谱
先说 Multi-Head Attention。
单头 Attention 就像一个厨师做一桌菜。问题在于,这位厨师再厉害,也只能用一种"口味"理解输入——要么关注语法,要么关注语义,很难兼顾。
Multi-Head Attention 把事情分给了多个人。每个"头"有独立的 Q、K、V 矩阵,各自学习不同的关注模式。
一个头看主谓宾,一个头看情感色彩,一个头看实体关系。8 个专家各司其职,最后把结果拼起来。
Llama-2-7B 有 32 个注意力头。4096 的隐藏维度,除以 32,每个头负责 128 维。规模不大,但分工明确。
这比一个通才强在哪?每个头可以并行训练,关注输入的不同子空间。相当于把一个复杂问题拆成 32 道简单题,每道题交给一个专家。

二、生成越来越慢:推理阶段的"内存墙"
问题来了。
你让 ChatGPT 生成一篇长文。生成到第 1000 个字时,模型需要计算第 1000 个 token 和前 999 个 token 的关系。生成到第 2000 个字时,要计算第 2000 个 token 和前 1999 个的关系。
每次生成新 token,都要把所有历史 token 的 K、V 重新算一遍。这就是所谓的"内存墙"——算力够用,但数据喂不进去。
怎么办?
KV Cache 登场。
简单说,把每个 token 产生的 K 和 V 缓存下来。下次计算 Attention 时,直接从缓存里取,不用重新算。
听起来很完美。实际上这是现代 LLM 推理加速的基石,没有 KV Cache,生成速度会慢几十倍。
但代价是什么?
显存爆炸。
Llama-2-7B 有 32 层。生成 1024 个 token 时,每层都要存储 1024 个 token 对应的 K 和 V。32 层 × 1024 token × 4096 维度 × 2(K 和 V)× 2 字节(FP16)。
算下来,光 KV Cache 就要 8GB+。
这还只是 1024 长度的上下文。如果生成 8192 个 token?显存直接翻 8 倍。很多模型的上下文上限就是这么被卡住的。

三、MQA:所有 Query 共用一把钥匙
问题清楚了:K 和 V 太大了,要压缩。
Multi-Query Attention 给出的答案是:别每个 Query 头都配一套 K/V 了,全部 Query 头共用一套。
原来 32 个 Query 头,每个都有自己独立的 K 和 V。现在 32 个 Query 共用一组 K/V。
显存一下子降到原来的 1/32。
代价是什么?
32 个 Query 头本来各有各的"口味",现在全挤在同一组 K/V 上。一个头想看情感,一个头想看逻辑,结果只能看同一份材料。
表达能力受限。多头 Attention 的优势被削弱了一部分。
类比一下:8 个厨师各有自己的食材库,想做什么菜就拿什么食材。MQA 之后,8 个人共用一个食材库,取食材要排队,做出来的菜也趋向同质化。

四、GQA:分组共享,找到了平衡点
MQA 太激进,MHA 太浪费。GQA 走了中间路线。
GQA 的思路很简单:Query 头分组,每组共用一套 K/V。
32 个 Query 头,分成 8 组。每组 4 个 Query 头共用一套 K/V。
显存降到 MHA 的 1/8,表达能力比 MQA 强——因为每个 Query 头至少有 4 个伙伴,不会太孤单。
如果分成 4 组呢?每组 8 个 Query 头共用一套 K/V。显存只有 MHA 的 1/4,进一步压缩。
分组数量是一个可以调的参数。想省显存就多分几组,想保质量就少分几组。
Llama-2 和 Llama-3 都选了 GQA。具体来说,32 个 Query 头,8 个 KV 头。4 倍的压缩比,质量损失可控。

五、为什么主流大模型都选了 GQA?
这个问题值得深挖。
GPU 的算力增长是指数级的。但显存带宽的增长速度远跟不上。2018 年的 V100 到 2024 年的 H100,浮点算力涨了将近 20 倍,显存带宽只涨了 2 倍多。
算得快,但数据喂不进去。这是硬件层面的大趋势。
在这种情况下,KV Cache 的显存占用就成了必须解决的问题。GQA 在 1/4 到 1/8 的显存压缩下,还能保持接近 MHA 的效果。性价比最高。
Llama 系列全线采用 GQA。Mistral 也跟进了。
有意思的是,不是所有人都走这条路。DeepSeek-V2 选了 MLA——Multi-head Latent Attention。不是改变分组数量,而是用低秩分解压缩 KV 的表示。从计算图层面做优化,思路完全不同。
还有一些商业模型坚持 MHA。比如 MiniMax。理由是特定场景下,MHA 的表达能力确实更值钱。差的那点显存,在他们的场景里不是瓶颈。
选择哪种架构,本质上是在回答一个问题:你的瓶颈在哪里?

六、这场权衡不会停止
GQA 不是终点。
随着上下文越来越长——10 万 token、100 万 token——KV Cache 的问题只会更严重。
分组会更多,压缩会更狠。MLA 这样的新思路也会越来越多。
但有一点是确定的:多头注意力的表达能力不能丢。这是 Transformer 的核心能力。任何优化方案,都不能以牺牲模型"理解力"为代价。
所以问题变成了:如何在更少的显存里,装下更多的信息?
这个问题,驱动着下一轮架构创新。
等等,说到上下文长度,你有没有想过:模型是怎么知道每个 token 位置的?
100 万 token 的序列,第一个 token 和最后一个 token,模型是怎么区分的?
这涉及另一个核心问题:位置编码。
下篇我们聊一聊,RoPE 为什么在大模型中这么受欢迎。
