文章目录

  • 题目
  • 注意力机制
  • 多头注意力机制
  • 为什么要使用多头注意力机制
  • 代码实现

题目

transformer学习之多头注意力机制

注意力机制

详细了解 ➡️ 注意力机制

之前我们也学习过了Seq2Seq,知道了把注意力机制加入到它后会使模型学习的更有效率,那么现在到了全部都由注意力机制构成的Transformer,它和Seq2Seq中加入的注意力有什么不同呢?

不同点

Seq2Seq里的Attention Transformer
s(Q,K)=QTKs(Q,K)=Q^TKs(Q,K)=QTK s(Q,K)=QTKdks(Q,K)=\frac{Q^TK}{\sqrt{d_k}}s(Q,K)=dk​​QTK​
单一头注意力机制 多头注意力机制

多头注意力机制


!!!多头注意力机制在encoder和decoder中的机制是不一样的。
因为在decoder中要根据前面的信息进行预测输出,所以就必须把当前单词后的信息给隐藏掉,需要使用Mask来进行遮挡。

注意上图的mask是opt【可选的】

就好比,你要猜测你的好友去哪里玩了,你让他说关键词你来猜,如果你已经知道地址了就用不着猜了,对吧!所以需要要在朋友说出答案前猜出!

具体实现过程,请看后续~
这里只需要知道,两者是不同的。

多头它的意思就是使用不同的W参数

i.e.假设一句话有10个单词,使用8头注意力机制

那么Q的参数矩阵就有8个,分别为WQ={WQ1,WQ2,WQ3,WQ4...WQ8}W_Q =\{W_{Q1},W_{Q2},W_{Q3},W_{Q4}...W_{Q8}\}WQ​={WQ1​,WQ2​,WQ3​,WQ4​...WQ8​}
同理
K的参数矩阵就有8个,分别为WK={WK1,WK2,WK3,WK4...WK8}W_K =\{W_{K1},W_{K2},W_{K3},W_{K4}...W_{K8}\}WK​={WK1​,WK2​,WK3​,WK4​...WK8​}
V的参数矩阵就有8个,分别为WV={WV1,WV2,WV3,WV4...WV8}W_V=\{W_{V1},W_{V2},W_{V3},W_{V4}...W_{V8}\}WV​={WV1​,WV2​,WV3​,WV4​...WV8​}


下图是一头注意力机制下WQ,WK,WVW_Q,W_K,W_VWQ​,WK​,WV​的计算


下图是多头注意力机制下WQ,WK,WVW_Q,W_K,W_VWQ​,WK​,WV​的计算
平铺展开

立体叠放

为什么要使用多头注意力机制

好处

  1. 论文作者在实验中得到证明,多头注意力机制下的实现效果更好
  2. 多头,意味着对同一个单词进行多次映射,每当映射到一个空间时,这个单词就被赋予了新的含义,使得Transformer注意到子空间的信息。

代码实现

实现的是下图所示代码

class MultiHead(nn.Module):def __init__(self, n_head, model_dim, drop_rate):# n_head 有几层注意力机制# model_dim 模型的维度# drop_rate 随机丢弃率super().__init__()self.head_dim = model_dim // n_head     # 32//4=8self.wq = nn.Linear(model_dim, n_head * self.head_dim)  # [4*8]self.wk = nn.Linear(model_dim, n_head * self.head_dim)self.wv = nn.Linear(model_dim, n_head * self.head_dim)self.o_dense = nn.Linear(model_dim, model_dim)self.o_drop = nn.Dropout(drop_rate)self.layer_norm = nn.LayerNorm(model_dim)def forward(self, q, k, v, mask, training):# residual connect# q=k=v=[batch_size,seq_len, emb_dim]=[32,11,32]residual = q    # 残差# linear projectionkey = self.wk(k)    # [batch_size,seq_len, num_heads * head_dim]value = self.wv(v)  # [batch_size,seq_len, num_heads * head_dim]query = self.wq(q)  # [batch_size,seq_len, num_heads * head_dim]# 将头分离出来# [step,n_head,n,head_dim] = [batch_size,头的数量,seq_len,每个头的维度]query = self.split_heads(query) # [32,4,11,8]key = self.split_heads(key)     # [32,4,11,8]value = self.split_heads(value) # [32,4,11,8]# 自注意力机制 点乘 context = self.scaled_dot_product_attention(query, key, value, mask)    # [batch_size,seq_len, model_dim]# 再经过一个线性变化o = self.o_dense(context)       # [batch_size,seq_len, model_dim]# 随机使得一些权重失效o = self.o_drop(o)# layer normalizationo = self.layer_norm(residual+o)return odef split_heads(self, x):x = torch.reshape(x, (x.shape[0], x.shape[1], self.n_head, self.head_dim))# x = [step,n_head,n,head_dim]return x.permute(0, 2, 1, 3)def scaled_dot_product_attention(self, q, k, v, mask=None):# [32,4,11,11]# dk = 8dk = torch.tensor(k.shape[-1]).type(torch.float)score = torch.matmul(q, k.permute(0, 1, 3, 2)) / (torch.sqrt(dk) + 1e-8)                 # [step, n_head, n, n]=[32, 4, 11, 11]if mask is not None:score = score.masked_fill_(mask, -np.inf)self.attention = softmax(score, dim=-1)     # [32, 4, 11, 11]context = torch.matmul(self.attention, v)   # [step, num_head, n, head_dim]context = context.permute(0, 2, 1, 3)       # [batch_size,seq_len, num_head, head_dim]context = context.reshape((context.shape[0], context.shape[1], -1))return context                              # [batch_size,seq_len, model_dim]

注意:
代码在实现过程中并不是用的我上述讲的方法【用n_head个W矩阵进行乘积】

它是利用一个单词的维度【dim=32】将其分为4个头【n_head】,每个头的维度为8,这样做的好处是避免多次循环,可以一次性完成运算。

实现过程如下图所示

transformer学习之多头注意力机制相关推荐

  1. Pytorch:Transformer(Encoder编码器-Decoder解码器、多头注意力机制、多头自注意力机制、掩码张量、前馈全连接层、规范化层、子层连接结构、pyitcast) part1

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  2. 【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

    目录 前言 一.注意力机制:Attention 二.自注意力机制:Self-Attention 三.多头注意力机制:Multi-Head Self-Attention 四.位置编码:Positiona ...

  3. 动手学深度学习(五十)——多头注意力机制

    文章目录 1. 为什么用多头注意力机制 2. 什么是多头注意力机制 3. 多头注意力机制模型和理论计算 4. 动手实现多头注意力机制层 小结 练习 1. 为什么用多头注意力机制 所谓自注意力机制就是通 ...

  4. 通过7个版本的attention的变形,搞懂transformer多头注意力机制

    --1-- Transformer模型架构 Transformer 由两个独立的模块组成,即Encoder和Decoder Encoder 编码器是一个堆叠N个相同的层.每层由两个子层组成,第一个是多 ...

  5. 【深度学习】04-01-自注意力机制(Self-attention)-李宏毅老师2122深度学习课程笔记

    04-01-自注意力机制Self-attention 模型输入 文字处理 语音处理 Graph 模型输出 类型一:一对一(Sequence Labeling) 类型二:多对一 类型三:多对多(由模型自 ...

  6. 深度学习中一些注意力机制的介绍以及pytorch代码实现

    文章目录 前言 注意力机制 软注意力机制 代码实现 硬注意力机制 多头注意力机制 代码实现 参考 前言 因为最近看论文发现同一个模型用了不同的注意力机制计算方法,因此懵了好久,原来注意力机制也是多种多 ...

  7. 【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码

    文章目录 自注意力(Self-Attention) 例子 Self-Attention vs Convolution Self-Attention vs RNN 交叉注意力(Cross Attenti ...

  8. 【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)

    作者 | 蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attention小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的注意力机制(二) 四万字全面详解 ...

  9. 融合多头注意力机制的网络恶意流量检测

    摘要 [目的]现有的网络恶意流量检测方法依赖统计特征进行建模,忽略了网络流量本身所具备的时序特征,通过对时序特征的提取.学习.建模,可以进一步提高网络恶意流量检测精度.[方法]将网络流量以会话为基本单 ...

最新文章

  1. 吴恩达神经网络和深度学习——第四周笔记
  2. Python 元组 (tuple)
  3. 学习笔记:ORACLE 性能优化求生指南
  4. [luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)
  5. 获取iOS任意线程调用堆栈(五)完整实现:BSBacktraceLogger
  6. 火柴棒等式(洛谷-P1149)
  7. oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...
  8. Amazon S3 API
  9. 解锁lintcode-猫和狗的问题
  10. 傅里叶变换进行图像变换Matlab实现
  11. 继续:个人微信的自动收款解决(思路)
  12. python版--百度人工智能接口(AIP)的调用方法
  13. 【读书笔记】AMBA 2 AHB、AMBA 3 AHB(AHB_Lite)和AMBA 5 AHB协议比较
  14. 三国杀:智能电视迎来对垒时代
  15. python中列表的操作
  16. 腾讯服务器系统崩溃 请稍后再试,麻烦版主进来一下!腾讯手游助手隔几分钟就崩溃,重装系统也不好使不知道什么原因。求解决!!...
  17. latex插图编号_LaTeX入门(八)——图片
  18. 什么是数学的核心素养?
  19. 5-8 打印直角三角形图案
  20. 虚拟主机和云服务器哪个划算,个人网站选择虚拟主机还是云服务器 区别和适用建议...

热门文章

  1. 系统安全认证设计实现
  2. 计算机考研面试自我介绍范文英语,研究生复试英文自我介绍范文
  3. 云原生k8s的前世今生--Docker
  4. Wifi模块—源码分析Wifi启动2(Android P)
  5. iOS 程序员眼中的 Emoji
  6. Mysql快速入门 在python、java使用
  7. 科技推动,服务创新,科里思特承办莆田市首期茶叶技术培训班活动
  8. Maven问题之Lastupdated
  9. Python 条件判断 If
  10. python 与Mysql ,Mongodb以及Redis的交互