分组查询注意力机制(Grouped-Query Attention, GQA)

这位同学,你这个问题提得非常**“紧跟时事”**!

如果你去读现在最火的大模型(比如 LLaMA-2, LLaMA-3, Mistral)的技术报告,你会在显著位置看到 GQA (Grouped-Query Attention) 这个词。

它不是一个新的架构,而是一个**“省钱省内存”的极致优化技巧**。

简单说:它是为了解决**“大模型推理速度太慢、显存不够用”**这个问题而诞生的。

我们用一个**“点菜”**的例子,来对比三种注意力机制,你就秒懂了。


第一阶段:MHA (Multi-Head Attention) —— 传统的“土豪”模式

这是最早 Transformer (BERT, GPT-2) 用的标准模式。

场景模拟:
假设有 8 个顾客(8 个 Query 头)来餐厅吃饭。

  • 配置: 餐厅给这 8 个顾客,每人配备了 1 个专属服务员(Key)和 1 份专属菜单(Value)。

  • 比例: 8 个 Q 配 8 组 KV。(1:1)

  • 优点: 服务极其周到,每个人想吃啥都能精准匹配,脑子清楚(效果最好)。

  • 缺点: 太浪费资源了!

    • 在大模型推理时,我们需要把这些 K 和 V 都存在显存里(这叫 KV Cache)。
    • 如果是 MHA,显存很快就被这些重复的 KV 填满了,导致你很难处理长文章,或者生成速度变慢。

第二阶段:MQA (Multi-Query Attention) —— 极端的“省钱”模式

为了解决显存爆炸的问题,有人(Google 2019年)提出了 MQA。

场景模拟:
还是 8 个顾客(8 个 Query 头)。

  • 配置: 餐厅为了省钱,只雇了 1 个服务员(Key)和 1 份菜单(Value),让这 8 个顾客共享

  • 比例: 8 个 Q 配 1 组 KV。(N:1)

  • 优点: 极其省显存! 速度飞快。

  • 缺点: 脑子容易乱。

    • 大家共用一套信息,细节容易丢失,模型的智商(效果)会明显下降,稍微复杂点的问题就回答不好了。

第三阶段:GQA (Grouped-Query Attention) —— 完美的“中庸之道”

这就是 LLaMA-2 引入的主角。它觉得 MHA 太贵,MQA 太傻,于是折中了一下。

场景模拟:
还是 8 个顾客(8 个 Query 头)。

  • 配置: 我们把顾客分成 4 个小组(Group),每组 2 个人。

  • 分配: 每 1 个小组,共享 1 个服务员1 份菜单

  • 比例: 8 个 Q 配 4 组 KV。(2:1,或者 4:1,看具体设置)

  • 优点:

    • 省显存: 比 MHA 省了很多(KV 数量变成了原来的 1/2 或 1/4)。
    • 效果好: 比 MQA 聪明很多,几乎和 MHA 的效果一样好。
    • 速度快: 推理速度大幅提升。

技术细节:为什么要这么做?(KV Cache)

你可能会问:“只是少存几个矩阵,有那么重要吗?”

非常重要!

在 GPT 这种生成式模型里,每生成一个字,都要回顾之前所有的字。为了不重复计算,我们会把之前算好的 K 和 V 矩阵存在显存里,这就叫 KV Cache

  • 对于 70B 这样的大模型:
    • 如果是 MHA,KV Cache 巨大无比,一张 A100 显卡可能光存这些“记忆”就存满了,根本没空间算新东西。
    • 如果是 GQA,KV Cache 的大小直接缩小为原来的 1/8(假设分了8组),这意味着:
      1. 你可以输入更长的 Prompt(比如几十万字的书)。
      2. 你可以用更便宜的显卡跑大模型。
      3. 生成的速度更快(因为从显存搬运数据的时间少了)。

总结一张表

模式 全称 结构 (Q : KV) 显存占用 效果 (智商) 代表模型
MHA Multi-Head Attention 1 : 1 (很多头对很多KV) 巨大 (贵) ⭐⭐⭐⭐⭐ BERT, GPT-3
MQA Multi-Query Attention N : 1 (很多头对1个KV) 极小 (省) ⭐⭐⭐ StarCoder
GQA Grouped-Query Attention N : M (分组共享) 适中 ⭐⭐⭐⭐✨ LLaMA-2/3, Mistral

一句话总结:
GQA 就是在**“效果”“速度/显存”**之间找到的最佳平衡点。现在的开源大模型如果不发 GQA,出门都不好意思跟人打招呼。

GQA不是窗口注意力吧

完全正确!你的直觉非常敏锐。

GQA(分组查询注意力)Window Attention(窗口注意力/滑窗注意力) 根本就是两码事

它们虽然都是为了“省资源”,但省的方向完全不同

为了让你一辈子忘不了,我们用一个**“复习考试”**的例子来打比方。


1. GQA (Grouped-Query Attention) —— 是在“精简笔记”

  • 痛点: 显存(KV Cache)不够用。
  • 做法:
    • 本来每门课(每个 Query 头)都要配一本单独的教科书(Key/Value)。
    • GQA 说:“太占地方了!咱们几门课共用一本教科书吧。”
    • 比如:语文和历史共用“文科书”,数学和物理共用“理科书”。
  • 关键点: 它的视野依然是全局的。 只要你把书存下来,哪怕是这学期第一天学的知识,GQA 依然能回头查到。
  • 本质: 压缩的是通道数(Heads),是为了省显存

2. Window Attention (Sliding Window Attention) —— 是在“只看重点”

  • 痛点: 文章太长,计算量爆炸(O(N2)O(N^2)O(N2)),算不过来。
  • 做法:
    • Window Attention 说:“别复习第一天学的内容了,肯定考不到。我们只复习最近一周的内容!
    • 这就好比拿着一个手电筒在长长的卷轴上移动,你只能看见光圈(窗口)里的字。
    • 比如:你在写第 10000 个字的时候,只能回头看见第 6000 到第 9999 个字。第 1 个字早就忘光了。
  • 关键点: 它的视野是局部的。 超过窗口大小的旧信息,它就看不见了(或者需要用其他技巧间接看)。
  • 本质: 限制的是序列长度(Sequence Length),是为了省计算量(把复杂度从平方级降到线性级)。

3. 为什么容易混淆?(罪魁祸首:Mistral)

之所以很多人会把这两个搞混,是因为著名的开源模型 Mistral 7B

Mistral 7B 这个模型是个“缝合怪”(褒义),它同时用了这两个技术

  1. 它用了 GQA:为了让 7B 的模型能在小显卡上跑,且推理快。
  2. 它用了 SWA (Sliding Window Attention):为了能处理比较长的上下文,但又不至于算得太慢。

所以大家在看 Mistral 的技术报告时,经常看到这两个词挨在一起,就容易觉得它们是一回事。其实它们是两个独立的“优化插件”。


4. 终极对比表

特性 GQA (分组查询注意力) Window Attention (窗口注意力)
核心动作 几个人共用一份资料 (KV共享) 只看最近的资料 (视野限制)
被砍掉的是啥 砍掉了KV Head的数量 (通道维度) 砍掉了太久远的记忆 (时间维度)
视野范围 Global (全局)
理论上能看到所有以前的词
Local (局部)
只能看到窗口内的词
主要解决 显存爆炸 (KV Cache占用) 计算太慢 (Attention矩阵太大)
典型代表 LLaMA-2, LLaMA-3 Longformer, Mistral (它俩都用了)

一句话总结:

  • GQA 是为了让你的书包(显存)能装下更多书,但书的内容不减。
  • Window Attention 是为了让你阅读速度变快,强行规定只准读最近的几页。

这下分得清清楚楚了吧?

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐