Group Query Attention (GQA) 机制详解以及手动实现计算

Group Query Attention (GQA) 机制详解

1. GQA的定义

Grouped-Query Attention (GQA) 是对 Multi-Head Attention (MHA) 和 Multi-Query Attention (MQA) 的扩展。通过提供计算效率和模型表达能力之间的灵活权衡,实现了查询头的分组。GQA将查询头分成了G个组,每个组共享一个公共的键(K)和值(V)投影。

2. GQA的变体

GQA有三种变体:

  • GQA-1:一个单独的组,等同于 Multi-Query Attention (MQA)。
  • GQA-H:组数等于头数,基本上与 Multi-Head Attention (MHA) 相同。
  • GQA-G:一个中间配置,具有G个组,平衡了效率和表达能力。
3. GQA的优势

使用G个组可以减少存储每个头的键和值所需的内存开销,特别是在具有大的上下文窗口或批次大小的情况下。GQA提供了对模型质量和效率的细致控制。

4. GQA的实现

GQA的最简形式可以通过实现 GroupedQueryAttention 类来实现。GroupedQueryAttention 类继承自 Attention 类,重写了 forward 方法,其中使用了 MultiQueryAttention 类的实例来处理每个组的查询。通过将每个组的结果拼接起来,然后与投影矩阵进行矩阵乘法运算,最终得到 GQA 的输出。[1]

pytorch 示例实现:

假设我们有以下初始化的query, key, value:

# shapes: (batch_size, seq_len, num_heads, head_dim)
query = torch.randn(1, 256, 8, 64)
key = torch.randn(1, 256, 2, 64)
value = torch.randn(1, 256, 2, 64)
1. 确定分组数量

首先,我们需要确定将查询头分为多少组。在这个例子中,我们有8个查询头,而键和值的头数为2,所以我们可以将查询头分为4组,每组有2个查询头。

2. 对查询进行分组

然后,我们将查询头分组。我们可以使用 torch.chunk 函数将查询张量沿着头维度分割成4个组,每个组有2个头。

query_groups = torch.chunk(query, 4, dim=2)  # shape of each group: (1, 256, 2, 64)
3. 计算注意力分数

对于每一个查询组,我们计算它与键的注意力分数。我们首先计算查询组和键的点积,然后通过 torch.softmax 函数得到注意力分数。

attention_scores = []
for query_group in query_groups:score = torch.matmul(query_group, key.transpose(-2, -1))  # shape: (1, 256, 2, 256)score = torch.softmax(score, dim=-1)attention_scores.append(score)
4. 计算注意力输出

接下来,我们使用注意力分数对值进行加权求和,得到每一个查询组的注意力输出。

attention_scores = []
for query_group in query_groups:score = torch.matmul(query_group, key.transpose(-2, -1))  # shape: (1, 256, 2, 256)score = torch.softmax(score, dim=-1)attention_scores.append(score)
5. 拼接输出

最后,我们将所有查询组的注意力输出拼接起来,得到最终的 Grouped Query Attention 的输出。

attention_outputs = []
for score in attention_scores:output = torch.matmul(score, value)  # shape: (1, 256, 2, 64)attention_outputs.append(output)

这就是 Grouped Query Attention 的实现过程。在这个过程中,我们将查询头分组,然后对每一个查询组分别计算注意力分数和输出,最后将所有查询组的输出拼接起来。这样可以减少存储每个头的键和值所需的内存开销,特别是在具有大的上下文窗口或批次大小的情况下。


  1. Grouped-Query Attention (GQA) - The Large Language Model Playbook

  2. 安全验证 - 知乎
  3. 安全验证 - 知乎
  4. 安全验证 - 知乎
  5. Grouped-Query Attention (GQA) - The Large Language Model Playbook

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/651517.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个2099试用码!JetBrains 2024 版

程序员痛点: 好用的编程工具收费太贵 无法找到好且免费的编程资料(书或者视频) 今天我们话几分钟分享一个激活方法,一次学习,终身受益 一分钟激活全家桶旗下所有软件 支持更新 Stage 1.下载安装 toolbox-app&…

【论文阅读】《Octopus v2: On-device language model for super agent》,端侧大模型的应用案例

今年LLM的发展趋势之一,就是端侧LLM快速发展,超级APP入口之争异常激烈。不过,端侧LLM如何应用,不知道细节就很难理解。正好,《Octopus v2: On-device language model for super agent》这篇文章可以解惑。 对比部署在…

【小浩算法cpp题解】判断环形链表

目录 前言我的思路思路一 (哈希表记录链表的访问):思路二 (双指针,快指针在前,慢指针在后): 我的代码运行结果 前言 前几天我写的代码,都是把所有的内容写在main函数里&…

GPB | RegVar:基于深度神经网络的非编码区突变功能预测新方法

Genomics, Proteomics & Bioinformatics (GPB)发表了由军事医学研究院辐射医学研究所张成岗研究员、周钢桥研究员和卢一鸣副研究员团队完成的题为“RegVar: Tissue-specific Prioritization of Noncoding Regulatory Variants”的方法文章。我们的“…

Spring事务回滚核心源码解读

记一次Springboot事务超时不回滚的分析过程 在Springboot中,我用的xml进行事务管理,DataSourceTransactionManager作为事务管理器,配置了事务控制在Service层;在事务管理器中,配置了defaultTimeout事务超时时间为5秒&…

IEC 62680新规上线,慧能泰设备端PD协议芯片带你勇闯欧盟

2022年12月7日,欧盟发布了Directive (EU) 2022/2380,强化了通用充电器的规定,并计划于2024年12月28日起,在所有欧盟国家强制执行该指令。此修订主要针对新生产的手机、平板、相机、耳机、游戏机、音箱、电子书、键盘、鼠标、导航仪…

使用knuth Durstenfeld Shuffle置乱关键区域

示意图 使用knuth Durstenfeld Shuffle置乱关键区域。比较典型的就是当我们对图像进行小波变换后,能量主要集中在左上角。 将图像进行排列,将关键区域置于整个序列的末尾,从末尾开始逐个交换,完成置换。 为了演示方便&#xff0c…

第 3 篇 : Netty离线消息处理(可跳过)

说明 仅是个人的不成熟想法, 未深入研究验证 1. 修改 NettyServerHandler类 package com.hahashou.netty.server.config;import com.alibaba.fastjson.JSON; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHan…

CRM客户管理系统盘点2024:16款顶级系统PK赛,寻找最佳利器

客户关系管理系统(CRM)在企业数字化转型的过程中扮演着至关重要的角色。选择一个高效、功能丰富的CRM客户管理系统,对于确保企业未来健康、稳定的发展至关重要。当前市场上存在着众多的CRM客户管理系统件,每个软件都有其独特的功能…

C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码

C#开发的全套成熟的LIS系统源码JavaScriptSQLserver 2012区域云LIS系统源码 医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标…

攻防世界 easyphp

本题主要利用的知识点是php绕过 一、PHP代码分析 首先先看一下代码 我们需要利用get方式上传3个参数a,b,c,这3个分别需要满足不同的条件: a:设置a值;值大于6000000;长度不超过3; b:设置b值;MD…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台,供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心,最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…