缓存与效果的取舍之——MHA到GQA(详细代码实现)
创作时间:
作者:
@小白创作中心
缓存与效果的取舍之——MHA到GQA(详细代码实现)
引用
CSDN
1.
https://m.blog.csdn.net/u010712012/article/details/145801580
在深度学习领域,Transformer模型因其卓越的性能和广泛的应用而备受关注。其中,注意力机制是Transformer模型的核心组成部分,而MHA(Multi-Head Attention)和GQA(Grouped-Query Attention)则是两种重要的注意力机制实现方式。本文将通过代码实现的方式,详细讲解这两种机制的工作原理及其在缓存与效果之间的取舍问题。
Multi-Head Attention
原始Transformer中的注意力机制也是MHA,每个head的head_size将变为原始embed_size的1/num_head,类似于group卷积,建立了很多个交流通道,每个通道关注的信息细节不同,也就是每个头可以关注到序列中不同子空间的特征。
import torch
from torch import nn
class MultiHeadAttention(torch.nn.Module):
def __init__(self, hidden_size, num_heads):
super(MultiHeadAttention, self).__init__()
self.num_heads = num_heads
self.head_dim = hidden_size // num_heads
# 初始化QKV投影矩阵
self.q_linear = nn.Linear(hidden_size, hidden_size)
self.k_linear = nn.Linear(hidden_size, hidden_size)
self.v_linear = nn.Linear(hidden_size, hidden_size)
## 输出线性层
self.o_linear = nn.Linear(hidden_size, hidden_size)
def forward(self, hidden_state, attention_mask=None):
batch_size = hidden_state.size()[0]
query = self.q_linear(hidden_state)
key = self.k_linear(hidden_state)
value = self.v_linear(hidden_state)
## 计算注意力分数
attention_scores = torch.matmul(query, key.transpose(-1, -2)) / torch.sqrt(torch.tensor(self.head_dim))
if attention_mask != None:
attention_scores += attention_scores * -1e9
## 对注意力分数进行归一化
attention_probs = torch.softmax(attention_scores, dim=-1)
output = torch.matmul(attention_probs, value)
## 对注意力输出进行拼接
output = output.transpose(-1, -2).contiguous().view(batch_size, -1, self.head_dim * self.num_heads)
output = self.o_linear(output)
return output
def split_head(self, x):
batch_size = x.size()[0]
return x.review(batch_size, -1, self.num_heads, self.head_dim).transpose(1,2)
Grouped-Query Attention
GQA将query分成g组,每组的query共享KV,这种设计在保持模型效果的同时,有效地平衡了缓存需求。
import torch.nn.functional as F
class GroupQueryAttention(nn.Module):
def __init__(self, embed_dim=512, num_heads=8, groups=2, dropout=0.1):
super().__init__()
self.embed_dim = embed_dim
self.num_heads = num_heads
self.groups = groups
self.head_dim = embed_dim // num_heads
self.group_heads = num_heads // groups
self.q_proj = nn.Linear(embed_dim, embed_dim)
self.k_proj = nn.Linear(embed_dim, self.groups * self.head_dim)
self.v_proj = nn.Linear(embed_dim, self.groups * self.head_dim)
self.out_proj = nn.Linear(embed_dim, embed_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, x, key_padding_mask=None):
batch_size, seq_len, _ = x.size()
q = self.q_proj(x)
k = self.k_proj(x)
v = self.v_proj(x)
q = q.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
k = k.view(batch_size, seq_len, self.groups, self.head_dim).permute(0,2,3,1)
v = v.view(batch_size, seq_len, self.groups, self.head_dim).transpose(1,2)
k = k.unsqueeze(2).expand(-1, -1, self.group_heads, -1, -1).contiguous()
k = k.view(batch_size, self.num_heads, self.head_dim, seq_len)
v = v.unsqueeze(2).expand(-1, -1, self.group_heads, -1, -1).contiguous()
v = v.view(batch_size, self.num_heads, seq_len, self.head_dim)
attn_scores = torch.matmul(q,k)
attn_scores = attn_scores / (self.head_dim ** 0.5)
if key_padding_mask is not None:
mask = key_padding_mask.view(batch_size, 1, 1, seq_len)
attn_scores = attn_scores.masked_fill(mask, float('-inf'))
attn_weights = F.softmax(attn_scores, dim = -1)
attn_weights = self.dropout(attn_weights)
output = torch.matmul(attn_weights, v)
output = output.transpose(1,2).contiguous().view(batch_size, seq_len, -1)
return self.out_proj(output)
if __name__ == "__main__":
batch_size = 2
seq_len = 10
d_model = 512
num_heads = 8
groups = 2
gqa = GroupQueryAttention(d_model, num_heads, groups)
x = torch.randn(batch_size, seq_len, d_model)
output = gqa(x)
通过对比MHA和GQA的实现,我们可以更深入地理解它们在缓存与效果之间的权衡。MHA通过多个head来捕捉不同子空间的特征,而GQA则通过分组的方式在保持效果的同时减少计算量和缓存需求。这些机制的选择和优化对于构建高效且高性能的Transformer模型至关重要。
热门推荐
二等座89元起,杭州西站至上海列车最新票价和班次信息来了
四种常见的毕业论文章节标题写作技巧
重疾险需要健康告知吗?有哪些内容
重要通胀数据公布!
SUV轿车选购指南:轻松做决策
如何鉴别珍珠的真假?最简单的方法是什么?答案来了!
治疗鼻炎最方便最有效的方法
什么是近零能耗建筑(NZEB)?
吃黑芝麻也有禁忌?10個黑芝麻營養優點+芝麻能「改善便祕、幫助睡眠」超強大
宝宝两岁了不怎么会说话,是哪些原因?如何训练?家长必看!
财产保全知多少
指甲盖前端发黄怎么回事
7天自驾游攻略:从长沙到恩施的行程安排与景点推荐
探讨可控硅光耦在新能源领域的创新应用
预算超支的对策:优化软件项目的成本管理
‘法定丈夫’的法律身份与权益保障:解构现代家庭中的权利平衡
工欲善其事,必先利其器——什么样的牙刷更好用
别让牙刷成口腔“杀手”:多久换一次你真清楚?
健身的您,蛋白粉选对了吗?
中国商用车龙头出现!2024年行业新排位:五菱第6,重庆长安第3
湘南学院是什么水平 好不好考
学术成果评价与业绩考核中的可能误区与测不准现象
大麻合法化两年,突然宣布终结:“戏剧性”转折背后,泰国付出了什么代价?
噪音污染投诉指南:了解相关法规与处理方式
阿托品不是防近视“神药”
恢复手机桌面壁纸的步骤与技巧
明日方舟游戏内神射手模组详细效果及功能全面一览
如何选择塔罗牌占卦:从牌义到占卜技巧的全面指南
沙棘油对心脑血管的作用
沙棘原浆:降压奇兵还是养生神话?