MHA(Multi-Head Attention,多头注意力)、MQA(Multi-Query Attention,多查询注意力)和 GQA(Grouped-Query Attention,分组查询注意力)是大型语言模型(LLM)中注意力机制的三种主要变体。
它们的核心区别在于 Query(查询)、Key(键)和 Value(值)的“头”(Head)的数量及共享方式。这种设计差异直接决定了模型的推理速度、显存占用(尤其是 KV Cache)以及模型的表达能力。
以下是三者的详细区别:
1. MHA (Multi-Head Attention,多头注意力)
- 机制:Query、Key 和 Value 拥有相同数量的头(假设为 $h$ 个)。每个头都有自己独立的权重矩阵,互不共享。这是传统 Transformer 的标准配置。
- 优点:表达能力最强,能够捕捉最丰富的特征,模型精度最高。
- 缺点:在自回归生成(解码阶段)时,需要为每个头存储历史状态的 Key 和 Value,导致 KV Cache 显存占用极大。在长上下文场景下,显存会成为瓶颈,且推理速度较慢。
2. MQA (Multi-Query Attention,多查询注意力)
- 机制:Query 仍然保持 $h$ 个头,但 Key 和 Value 只有 1 个头。也就是说,所有的 Query 头在计算时,都共享同一组 Key 和 Value。
- 优点:极大地减少了 KV Cache 的显存占用(理论上减少为原来的 $1/h$),并且大幅提升了推理速度(尤其是内存带宽受限的解码阶段)。
- 缺点:由于所有查询头强制共享同一组键值对,模型的表达能力受到严重限制,通常会导致明显的精度下降(困惑度升高)。
3. GQA (Grouped-Query Attention,分组查询注意力)
- 机制:这是 MHA 和 MQA 的完美折中方案。Query 仍然有 $h$ 个头,但 Key 和 Value 被分成了 $g$ 组($1 < g < h$)。每个组内的 Query 头共享同一组 Key 和 Value。
- 例如:模型有 32 个 Query 头,8 个 KV 头。那么每 4 个 Query 头会共享 1 个 KV 头。
- 优点:在大幅减少 KV Cache 显存占用和提升推理速度的同时,最大程度地保留了模型的表达能力。其模型精度非常接近标准的 MHA。
- 缺点:工程实现比 MQA 稍微复杂一点,但目前主流深度学习框架已完全支持,不再是问题。
核心对比总结表
| 特性 | MHA (多头注意力) | MQA (多查询注意力) | GQA (分组查询注意力) |
|---|---|---|---|
| Query 头数 | $h$ | $h$ | $h$ |
| Key/Value 头数 | $h$ | $1$ | $g$ (其中 $1 < g < h$) |
| KV Cache 显存占用 | 最大 (基准 100%) | 最小 (约 $1/h$) | 中等 (约 $g/h$) |
| 推理速度 | 最慢 | 最快 | 较快 (非常接近 MQA) |
| 模型精度/表达能力 | 最高 | 较低 (有明显损失) | 高 (非常接近 MHA) |
业界发展趋势
在早期的大模型中,MHA 是绝对的主流。但随着模型参数量增大和对长上下文(Long Context) 需求的爆发,KV Cache 的显存压力变得无法忽视。
虽然 MQA 能解决显存问题,但精度损失太大。因此,GQA 目前已成为业界的主流标准和最佳实践。例如,Llama 2/3、Mistral、Qwen(通义千问)等现代主流大语言模型,均广泛采用了 GQA 架构,以在“推理效率”和“模型性能”之间取得最佳平衡。
评论区