算法面试之transformer的Attention和多头自注意力机制

本文探讨了Transformer中的Attention机制,包括CNN和RNN的局限性,重点解析了self-attention的工作原理,解释了除以dk的作用、相似度计算方式。此外,详细阐述了多头注意力的意义,它允许模型捕获不同特征,类似CNN中的多卷积核。文中还介绍了Transformer中三处应用multi-head attention的场景,并对比了self-attention与多头注意力的区别。
摘要由CSDN通过智能技术生成

1.Attention

1.1 CNN

CNN的卷积操作可以提取重要特征,我觉得这也算是Attention的思想,但是CNN的卷积感受视野是局部的,需要通过叠加多层卷积区去扩大视野,然而实际情况是CNN做NLP问题就是做不深,做到2到3层卷积层就做不上去了;

另外,Max Pooling直接提取数值最大的特征,也像是hard attention的思想,直接选中某个特征。Max Pooling的操作逻辑是:从一个卷积核获得的特征向量里只选中并保留最强的那一个特征,所以到了Pooling层,位置信息就被扔掉了。

1.2 RNN

基于RNN的Attention-based Model来解决seq2seq的问题的弊端是:无论是encoder还是decoder,每一时刻都必须等上一个时刻计算完来之后才能进行,因此无法采用并行计算。

1.3 self-attention

提出来一个self-attention layer,可以取代RNN,还可以并行计算。
可以发现词与词之间的权重关系。
在这里插入图片描述
我们可以把a_1,a_2,a_3,a_4想象成四个要去攻打敌人的英雄
把v_1,v_2,v_3,v_4看成每个英雄各自拥有的技能
q_1,q_2,q_3,q_4是它们学习技能的能力
k_1,k_2,k_3,k_4是他们把自身技能教给其他英雄的能力
那么对于英雄a_1 来说,用q_1和k_i进行匹配得到这个英雄学到每个英雄的技能的概率,再乘以v_i就是这个英雄最终能够学习到的所有技能。
经过这样一个学习过程之后,每个英雄都吸收了其他英雄的技能,得到了强化。
Self-Attention内部的运算具有什么样的含义呢?我们从单个词编码的过程慢慢理解:
在这里插入图片描述
这里有一个MASK,对padding的词或者decoder对后词,softmax前把对应位置置为负无穷。

1.3.1 除以dk的作用

在这里插入图片描述
从图可以看出,自注意力机制的核心过程就是通过Q和K计算得到注意力权重;然后再作用于V得到整个权重和输出。具体的,对于输入Q、K和V来说,其输出向量的计算公式为:
在这里插入图片描述
Q, V, K分别表示输入句子的Queries, Keys, Values矩阵,矩阵的每一行为每一个词对应的向量Query, Key, Value向量。Transformer同样也具有十分高效的并行计算能力

在这里插入图片描述

1.3.2 相似度计算方式

在做attention的时候,我们需要计算query和某个key的分数(相似度),常用方法有:
在这里插入图片描述

1.3.3 at vs sa

在这里插入图片描述

2.多头注意力

2.1 意义

在这里插入图片描述
类似于CNN多个卷积核,不同注意力学习关注不同的东西
可以类比CNN中同时使用多个滤波器的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到左边侧重于邻近单词的attention,右边侧重于稍远一点单词的attention。沿用上面英雄的例子的话可以理解成,每个英雄的技能可以分解成8个不同的子技能。

在这里插入图片描述

2.2 细节

对于每一个Self-Attention,均有独立维护的三个线性映射矩阵WVi、WKi及WQi(不同Self-Attention模块之间的权值不共享)
通过将输入的矩阵X与三个映射矩阵相乘,得到Self-Attetnion的三个输入Queries、Keys和Values
这V, Q, K三个矩阵的输入X是完全一样的(均为输入句子的Input Embedding + Positional Encoding或是上一层Transformer的输出),这一点从整个的Encoder模型中也可以看出来。
在论文中,作者对于8个Self-Attention的输出,进行简单的拼接,并通过与一个映射矩阵WO
与其相乘(目的是对输出矩阵进行压缩),从而得到整个Multi-Head Attention的输出

在这里插入图片描述
在这里插入图片描述

2.3 三处multi-head attention

Transformer在三处用到来multi-head attention:
第一个是encoder中的self-attention,这里所有的keys、values,和queries都来自encoder的前一层输出,因此encoder中的每个位置都能与所有位置进行attention的计算。
第二个是decoder中的self-attention,同样是对输入做attention的计算,但这里是一个生成的过程,因此每个时刻t只能获得当前时刻以前的输入对其进行计算,即前面提到的mask的过程。
第三个是decoder中的encoder-decoder attention,这里queries来自decoder的前一层,keys和values来自encoder的输入,因此每个位置都能参与所有位置的attention计算。

在这里插入图片描述
上一篇:算法面试之transformer的结构和位置编码
下一篇:算法面试之transformer的Mask和并行性

注:本专题大部分内容来自于总结,若有侵权请联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CxFt

很高兴可以帮到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值