侧边栏壁纸
  • 累计撰写 56 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

MHA、MQA 和 GQA 有什么区别

温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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 架构,以在“推理效率”和“模型性能”之间取得最佳平衡。

0

评论区