

自 Transformer 架构提出以来,多头注意力(Multi-Head Attention, MHA)凭借其强大的并行建模能力成为标准配置。然而,随着模型规模不断扩大、上下文长度持续增长,MHA 在推理阶段暴露出显著的内存与计算瓶颈——尤其是其庞大的 KV Cache 开销,严重制约了部署效率。
为平衡模型性能与推理成本,研究者相继提出了多种注意力变体:多查询注意力(Multi-Query Attention, MQA)通过共享单一 Key 和 Value 头大幅压缩缓存,显著提升生成速度;而分组查询注意力(Grouped-Query Attention, GQA)则在 MHA 与 MQA 之间取得折中,在几乎不损失模型质量的前提下,有效降低内存占用并加速推理。
下面简单介绍一下这三种注意力机制:
多头注意力机制(MHA)#
多头注意力机制(Multi-Head Attention, MHA)并不是简单地将 Q、K、V 复制 n_heads 次,而是通过不同的可学习线性投影,将输入映射到 n_heads 个独立的子空间中,每个头在自己的子空间里并行计算注意力。
由于每一层MHA需要缓存n_heads个Key向量和n_heads个Value向量,总共是2*n_heads个/层。
✅ 优点#
| 优点 | 说明 |
|---|---|
| 1. 捕获多样化的依赖关系 | 不同头可以关注不同类型的模式(例如:一个头关注语法结构,另一个头关注语义角色,再一个头关注指代关系) |
| 2. 增强模型表达能力 | 相当于集成多个“弱注意力模型”,提升整体泛化能力 |
| 3. 并行计算高效 | 所有头可同时计算,充分利用 GPU 并行能力 |
| 4. 提高训练稳定性 | 多视角学习有助于缓解梯度消失/爆炸问题 |
❌ 缺点#
| 缺点 | 说明 |
|---|---|
| 1. 推理时 KV Cache 内存开销大 | 每个头都需要缓存自己的 K 和 V → KV Cache 大小与 n_heads 成正比(例如 Llama-7B:32 heads → 缓存是 MQA 的 32 倍) |
| 2. 计算量增加 | 虽然可并行,但总 FLOPs 高于单头 |
| 3. 对长上下文不友好 | KV Cache 随序列长度线性增长,多头进一步放大内存压力,限制最大上下文长度 |
| 4. 可能存在冗余头 | 研究发现部分头学习到相似模式,存在参数浪费 |
多查询注意力机制(MQA)#
MQA(Multi-Query Attention,多查询注意力) 是对标准多头注意力(MHA)的一种高效改进,主要用于降低大语言模型在推理阶段的内存和计算开销。它的核心思想是,保留多个Query头(每个头都有自己的查询表示),但所有头共享同一个Key和同一个Value。
这里我认为图中的KV Cache计算错了,应该是2个/层(一个Key和一个Value)。
✅ 优点#
| 优点 | 说明 |
|---|---|
| 1. 显著降低 KV Cache 内存占用 | 所有注意力头共享同一个 Key 和 Value,每层仅需缓存 1 个 K 和 1 个 V,KV Cache 大小与 n_heads 无关(例如 Llama-7B 使用 MQA 可将缓存减少至 MHA 的 1/32) |
| 2. 提升推理速度和吞吐量 | 减少显存读写和带宽压力,生成新 token 时延迟更低,尤其在长序列场景下优势明显 |
| 3. 更适合长上下文部署 | 因内存开销小,更容易支持数万 token 的上下文窗口,提升实际应用可行性 |
| 4. 训练开销几乎不变 | 仅减少了 K/V 投影参数数量,训练时计算量和收敛性基本不受影响 |
❌ 缺点#
| 缺点 | 说明 |
|---|---|
| 1. 表达能力略有下降 | 所有头被迫使用相同的 Key 和 Value 视角,无法像 MHA 那样从多个语义子空间独立建模依赖关系 |
| 2. 在复杂任务中可能性能受损 | 对于高度依赖细粒度注意力模式的任务(如机器翻译、结构化推理),可能出现轻微准确率下降 |
| 3. 不适用于编码器-heavy 架构 | MQA 主要优化解码器自回归生成,在需要双向上下文建模的编码器中收益有限甚至有害 |
| 4. 注意力多样性受限 | 由于共享 K/V,不同头之间的注意力分布趋于相似,削弱了“多视角”学习的优势 |
分组查询注意力机制(GQA)#
GQA(Grouped-Query Attention,分组查询注意力)是一种在多头注意力(MHA)之间的折中方案。它将多个查询头(Query heads)分成若干组,每组共享同一个 Key 和 Value,而不是像 MHA 那样每个头都拥有独立的 K/V,也不像 MQA 那样所有头共享同一对 K/V。
对于每层GQA,KV Cache取决于n_heads和g(分组数),2*n_heads/g个/层。例如,在 32 个头的模型中,可将其分为 8 组,每组 4 个 Query 头共享 1 个 K 和 1 个 V,从而将 KV Cache 的大小从 MHA 的 64 个张量减少到 16 个。
✅ 优点#
| 优点 | 说明 |
|---|---|
| 1. 在性能与效率之间取得良好平衡 | 相比 MQA 保留了更强的多头表达能力,相比 MHA 大幅降低推理开销,实测在多数任务上性能几乎无损 |
| 2. 显著减少 KV Cache 内存占用 | 将 n_heads 个 Query 头分组,每组共享一个 Key 和 Value,KV Cache 大小从 2 × n_heads 降至 2 × n_groups(例如 Llama-3-8B:32 heads → 8 groups,缓存减少至 1/4) |
| 3. 提升长上下文推理可行性 | 更低的显存占用使模型更容易支持数万 token 的上下文长度,适合实际部署 |
| 4. 兼容现有训练流程 | 无需修改训练目标或架构设计,仅调整注意力头的分组方式,训练稳定性与 MHA 相当 |
❌ 缺点#
| 缺点 | 说明 |
|---|---|
| 1. 仍存在一定的 KV Cache 开销 | 虽优于 MHA,但缓存大小仍高于 MQA(例如 8 组 vs 1 组),在极端内存受限场景下不如 MQA 轻量 |
| 2. 分组策略需人工设计 | n_groups 是超参数,需在模型设计阶段确定,不同任务可能需要调优,缺乏完全自适应机制 |
| 3. 组内头多样性受限 | 同一组内的多个 Query 头共享相同的 K/V,导致组内注意力模式趋同,略微削弱多视角建模能力 |
| 4. 实现复杂度略高 | 相比 MHA 和 MQA,需要额外处理分组逻辑,在底层推理引擎中需专门优化(如 vLLM、TensorRT-LLM) |
对比#
可以看到单从精度效果来看MHA-XXL是最好的,单从推理速度来看MQA-XXL是最好的,综合来看GQA-XXL是最好的。