当前位置: 首页 > article >正文

GQA(Grouped Query Attention):分组注意力机制的原理与实践《一》

GQA(Grouped Query Attention)是近年来在大语言模型中广泛应用的一种注意力机制优化方法,最初由 Google 在 2023 年提出。它是对 Multi-Query Attention (MQA) 的扩展,旨在平衡模型性能与计算效率。


🌟 GQA 是什么?

简单定义:

GQA 是一种将查询头(Query Heads)分组,并共享键(Key)和值(Value)头的注意力机制变体

它试图在 标准的多头注意力(MHA)多查询注意力(MQA) 之间找到一个折中点:

注意力类型Query HeadsKey/Value Heads共享情况
MHA多个多个不共享
GQA多个少于 Query 的多个分组共享
MQA多个1完全共享

🧠 原理详解

1. 回顾标准 Multi-Head Attention (MHA)

在标准的 Transformer 中:

  • 每个 token 的 QKV 都是由输入线性变换得到。
  • 如果有 H 个 attention heads,则每个 head 都有自己的 QKV 向量。

公式如下:

Q = X W Q , K = X W K , V = X W V Q = XW_Q, \quad K = XW_K, \quad V = XW_V Q=XWQ,K=XWK,V=XWV

其中 $ W_Q, W_K, W_V $ 是可学习参数。

每个 head 的 Q/K/V 是从这些矩阵中切出来的。


2. 引入 GQA:Query 分组 + Key/Value 共享

在 GQA 中:

  • Query heads 被分成若干组(比如 4 组)
  • 每组共享一组 Key 和 Value 向量(即每组对应一个 K 和 V)

例如:

  • 总共 32 个 query heads
  • 分成 4 组,每组 8 个 heads
  • 每组使用相同的 Key 和 Value 向量
  • 所以只需要 4 组 K/V,而不是 32 组

这样做的好处是:

  • 减少了 Key/Value 的数量,降低了内存占用(尤其是 KV Cache)
  • 保留了比 MQA 更多的表达能力

⚙️ GQA 的优势

优势描述
推理速度更快更少的 Key/Value 向量意味着更小的 KV Cache,减少解码时的内存访问延迟
内存占用更低特别是在批量生成或长文本生成时,KV Cache 占用显著降低
比 MQA 表现更好相比完全共享 Key/Value 的 MQA,GQA 保留了部分多样性,模型表现通常更优
适合部署对硬件资源友好,特别适合在有限算力设备上运行的大模型

🔍 示例说明(来自 Llama 3)

Llama 3 使用了 GQA 技术来提升推理效率。

  • 总共 32 个 query heads
  • 只使用了 8 个 key/value heads(即每组 4 个 queries 共享一个 key/value)

这意味着:

  • 每个 group 包含 4 个 query heads
  • 这些 query 共享同一个 key 和 value

这样可以保持大部分 MHA 的表达能力,同时节省内存和计算开销。


📈 MHA vs GQA vs MQA 性能对比(大致)

指标MHAGQAMQA
表达能力最强中等最弱
推理速度较慢最快
内存占用(KV Cache)最高中等最低
部署友好度一般最高

🧩 应用场景

GQA 特别适用于以下场景:

  • 大模型推理优化(如 Llama 3、PaLM 2、Gemini Nano)
  • 移动端/边缘端部署
  • 需要长上下文处理的任务
  • 大批量生成任务

💡 总结

项目GQA
类型注意力机制变体
核心思想Query 分组 + Key/Value 共享
优点提升推理速度、降低内存消耗、兼顾模型表现
缺点表达能力略低于 MHA
应用大语言模型部署、高效推理系统

http://www.lryc.cn/news/2399229.html

相关文章:

  • 【深度学习优化算法】02:凸性
  • JAVA国际版一对一视频交友视频聊天系统源码支持H5+APP
  • 策略公开了:年化494%,夏普比率5.86,最大回撤7% | 大模型查询akshare,附代码
  • 【C++】string类的模拟实现(详解)
  • 业界宽松内存模型的不统一而导致的软件问题, gcc, linux kernel, JVM
  • 多模态大语言模型arxiv论文略读(101)
  • 量化Quantization初步之--带量化(QAT)的XOR异或pyTorch版250501
  • Linux Maven Install
  • #Java篇:学习node后端之sql常用操作
  • 电网“逆流”怎么办?如何实现分布式光伏发电全部自发自用?
  • 如何查看电脑电池性能
  • kubernetes》》k8s》》kubectl proxy 命令后面加一个
  • 深入理解Linux系统进程切换
  • 网络安全运维实训室建设方案
  • DBeaver 连接mysql报错:CLIENT_PLUGIN_AUTH is required
  • 联通专线赋能,亿林网络裸金属服务器:中小企业 IT 架构升级优选方案
  • Web3时代的数据保护挑战与应对策略
  • Qwen3与MCP协议:重塑大气科学的智能研究范式
  • CppCon 2015 学习:Benchmarking C++ Code
  • URL 结构说明+路由(接口)的认识
  • 省赛中药检测模型调优
  • linux 故障处置通用流程-36计+1计
  • ​BEV和OCC学习-3:mmdet3d 坐标系
  • [蓝桥杯]图形排版
  • 【Linux仓库】冯诺依曼体系结构与操作系统【进程·壹】
  • CloudFront 加速详解:AWS CDN 怎么用?
  • 《高级架构师》------- 考后感想
  • 【iOS】YYModel源码解析
  • C++算法训练营 Day6 哈希表(1)
  • 【C语言编译与链接】--翻译环境和运行环境,预处理,编译,汇编,链接