新闻中心

大模型中常用的注意力机制GQA详解以及Pytorch代码实现

2024-04-03
浏览次数:
返回列表

组查询注意力(grouped query attention)是大型语言模型中的一种多查询注意力力方法,它的目标是在保持 mqa 速度的同时实现 mha 的质量。grouped query attention 将查询分组,每个组内的查询共享相同的注意力权重,这有助于降低计算复杂度和提高推理速度。

这篇文章中,我们将解释GQA的思想以及如何将其转化为代码。

GQA是在论文 GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints paper.中提出,这是一个相当简单和干净的想法,并且建立在多头注意力之上。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

大模型中常用的注意力机制GQA详解以及Pytorch代码实现

GQA

标准多头注意层(MHA)由H个查询头、键头和值头组成。每个头都有D个维度。Pytorch的代码如下:

from torch.nn.functional import scaled_dot_product_attention  # shapes: (batch_size, seq_len, num_heads, head_dim) query = torch.randn(1, 256, 8, 64) key = torch.randn(1, 256, 8, 64) value = torch.randn(1, 256, 8, 64)  output = scaled_dot_product_attention(query, key, value) print(output.shape) # torch.Size([1, 256, 8, 64])

对于每个查询头,都有一个对应的键。这个过程如下图所示:

大模型中常用的注意力机制GQA详解以及Pytorch代码实现

而GQA将查询头分成G组,每组共享一个键和值。可以表示为:

大模型中常用的注意力机制GQA详解以及Pytorch代码实现

使用可视化的表达就能非常清楚地了解GQA的工作原理,就像我们上面说的那样。GQA是一个相当简单和干净的想法。

Pytorch代码实现

让我们编写代码将这种将查询头划分为G组,每个组共享一个键和值。我们可以使用einops库有效地执行对张量的复杂操作。

首先,定义查询、键和值。然后设置注意力头的数量,数量是随意的,但是要保证num_heads_for_query % num_heads_for_key = 0,也就是说要能够整除。我们的定义如下:

import torch  # 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)  num_head_groups = query.shape[2] // key.shape[2] print(num_head_groups) # each group is of size 4 since there are 2 kv_heads

为了提高效率,交换seq_len和num_heads维度,einops可以像下面这样简单地完成:

from einops import rearrange  query = rearrange(query, "b n h d -> b h n d") key = rearrange(key, "b s h d -> b h s d") value = rearrange(value, "b s h d -> b h s d")

然后就是需要在查询矩阵中引入”分组“的概念。

from einops import rearrange query = rearrange(query, "b (h g) n d -> b g h n d", g=num_head_groups) print(query.shape) # torch.Size([1, 4, 2, 256, 64])

上面的代码我们将二维重塑为二维:对于我们定义的张量,原始维度8(查询的头数)现在被分成两组(以匹配键和值中的头数),每组大小为4。

最后最难的部分是计算注意力的分数。但其实它可以在一行中通过insum操作完成的

from einops import einsum, rearrange # g stands for the number of groups # h stands for the hidden dim # n and s are equal and stands for sequence length scores = einsum(query, key, "b g h n d, b h s d -> b h n s") print(scores.shape) # torch.Size([1, 2, 256, 256])

scores张量和上面的value张量的形状是一样的。我们看看到底是怎么操作的

einsum帮我们做了两件事:

易标AI 易标AI

告别低效手工,迎接AI标书新时代!3分钟智能生成,行业唯一具备查重功能,自动避雷废标项

易标AI 135 查看详情 易标AI

1、一个查询和键的矩阵乘法。在我们的例子中,这些张量的形状是(1,4,2,256,64)和(1,2,256,64),所以沿着最后两个维度的矩阵乘法得到(1,4,2,256,256)。

2、对第二个维度(维度g)上的元素求和——如果在指定的输出形状中省略了维度,einsum将自动完成这项工作,这样的求和是用来匹配键和值中的头的数量。

最后是注意分数与值的标准乘法:

import torch.nn.functional as F  scale = query.size(-1) ** 0.5 attention = F.softmax(similarity / scale, dim=-1)  # here we do just a standard matrix multiplication out = einsum(attention, value, "b h n s, b h s d -> b h n d")  # finally, just reshape back to the (batch_size, seq_len, num_kv_heads, hidden_dim) out = rearrange(out, "b h n d -> b n h d") print(out.shape) # torch.Size([1, 256, 2, 64])

这样最简单的GQA实现就完成了,只需要不到16行python代码:

大模型中常用的注意力机制GQA详解以及Pytorch代码实现

最后再简单提一句MQA:多查询注意(MQA)是另一种简化MHA的流行方法。所有查询将共享相同的键和值。原理图如下:

大模型中常用的注意力机制GQA详解以及Pytorch代码实现

可以看到,MQA和MHA都可以从GQA推导出来。具有单个键和值的GQA相当于MQA,而具有与头数量相等的组的GQA相当于MHA。

GQA的好处是什么?

GQA是最佳性能(MQA)和最佳模型质量(MHA)之间的一个很好的权衡。

下图显示,使用GQA,可以获得与MHA几乎相同的模型质量,同时将处理时间提高3倍,达到MQA的性能。这对于高负载系统来说可能是必不可少的。

大模型中常用的注意力机制GQA详解以及Pytorch代码实现

在pytorch中没有GQA的官方实现。所以我找到了一个比较好的非官方实现,有兴趣的可以试试:

https://www.php.cn/link/5b52e27a9d5bf294f5b593c4c071500e

GQA论文:

https://www.php.cn/link/e4ba31fba036a999321d5460f7f2d1d1

以上就是大模型中常用的注意力机制GQA详解以及Pytorch代码实现的详细内容,更多请关注其它相关文章!


# 大型语言模型  # 广州企业推广网站建设  # seo注册什么公司好  # 猪八戒营销策划推广  # 花都汽车网站建设培训  # 大连优秀网站建设  # 推广营销如何做得更好呢  # 叶县附近网站推广电话  # 威海营销推广策划费用  # 很好  # 艺术风格  # 机中  # 是一个  # 如何设置  # 每组  # 都有  # 是在  # 有什么  # 多线程  # follow  # python  # gqa  # pytorch  # 韶关慧抖销seo优化  # 厦门湖里品牌营销推广 


相关栏目: 【 行业资讯67740 】 【 技术百科0 】 【 网络运营39195


相关推荐: 哪里要用typescript  power在坐标轴中是什么意思  360n7lite怎么设置动态壁纸  课程伴侣电脑怎么登录  为什么都用typescript  尼桑越野车中控前power是什么意思  typescript和node学哪个  一分钟等于多少秒  内在市盈率是什么意思  access 如何输入命令  ping命令如何看问题  怎么打印数组j*a  苹果16哪些功能好用  苹果16有哪些bug  单片机速度怎么看  play的三人称单数和过去式  datediff快捷函数怎么用  单身交友必备软件  typescript性能如何  typescript是做什么用的  manager是什么意思  夸克前缀后缀什么意思啊  春运抢票多久能知道成功  12306退票手续费最新规定  typescript为什么能运行  市盈率回落是什么意思  vivo手机nfc功能是什么意思  车子上面nfc功能是什么意思  哪些编程软件需用typescript  linux如何合并分区命令  春运抢票软件哪个最好用  如何用命令行连接本地数据库  在遥控器中power是什么意思  单片机蓝牙怎么开启设备  恋爱软件免费聊天不收费的有哪些  老电脑如何装固态硬盘  春运抢票失败怎么抢  adb 命令如何后台运行  i5 6500怎么装win7  系统如何装在固态硬盘  春运抢票极速版怎么抢票  显卡上面TYPE-C是什么接口  爱奇艺视频怎么下载到手机u盘怎么转换格式方法  笔记本如何使用固态硬盘  typescript中如何定义json  摩托车上power是什么意思  交管12123协议头不完整怎么解决  爱奇艺fun会员可以几个人用?  什么是域名解析地址  j*a数组怎么比较abc 

搜索