总体来看,Transformer这个模型架构还是遵循着Encoder-Decoder的格式。此外,Transformer由注意力机制模块组成,因此在学习Transformer之前有必要对注意力机制有个了解(点这里)。
参考文档:
①Transformer模型的PyTorch实现
②Transformer 模型详解
③Transformer原理解读
③《Attention is All You Need》浅读(简介+代码)
1 Transformer结构
对注意力机制就有初步了解之后,就可以进行Transformer的学习了!
1.1Self-attention
Self-attention,又称自注意力,内部注意力,谷歌的这篇Transformer全是self-attention。自注意力就是,即在序列内部做注意力,寻找序列内部的联系(从Transformer的成功来看self-attention在NLP上还是很有作用的)。
与self-attention相对的是Context-attention,即发生在Encoder和Decoder之间的注意力,比如之前关于Seq2Seq中引入的注意力机制就是Context-attention。
Note:
- 之前的注意力机制中,涉及两个隐藏状态,分别是Encoder端和Decoder端的,即输入序列某个位置的隐藏状态和输出序列某个位置的隐藏状态。而self-attention就是说输出序列就是输入序列,计算自己的attention分数。
1.2 Scaled dot-product attention
在Transformer论文中,注意力函数选择的是缩放乘性注意力——Scaled Dot-Product,其表达式为:
Note:
- 表示矩阵的维数。
- 缩放因子是为了防止分子乘积太大的话,使得结果处于softmax函数梯度很小的地方,造成梯度消失,故缩减因子可以一定程度上减缓它。
- 这个注意力分数相当于的加权平均,通过和之间的运算得到权重。
- 和的计算表示为: 最终的运算结果可以表示为词之间的关系。
论文中还给出了相关图表:
这是什么?
Note:
- 是线性变换矩阵。
- 的每一行都表示一个Word。
Self-attention:
- 对于Encoder部分的第一层,矩阵X是输入通过Embeding和Positional encoding相加的结果,其余层都来自于上一层的输出。
- 对于Decoder部分的第一层。矩阵X是输出通过Embeding和Positional encoding相加的结果,其余层都来自于上一层的输出。
Encoder-Decoder-attention:
来自于Decoder上一层的输出,来自于Encoder的输出,即编码信息矩阵C:
.
Note:
- 三者的尺寸相同。
1.3 Multi-head self-attention
如果说上面的scaled dot-product attention是一个人在观察输入,那么Multi-head就是多个人站在不同角度去观察输入,并且不同人所得到的注意力是不同的。
之后通过线性映射分成份,对每一份使用scaled dot-product attention模块,最后将多个注意力聚合起来,再通过全连接层输出。
Note:
- Multi-head attention就相当于聚集了所有人对输入不同的观察力理解,它比单个注意力对输入的理解更加全面。
Multi-head attention公式如下:
Note:
- 。
- 论文中,。也就是说最后输入的scaled dot-product attention的向量维度是64。
- 无论是Encoder还是Decoder,经过Multi-head attention模块之后的输出和输入矩阵是想同维度的
.
1.4 Residual connection
Transformer结构中存在着残差连接,这起源于何凯明残差网络,残差网络是用于解决网络深度太大导致梯度回传消失的问题,具体的可以参考另一篇中关于残差网络部分。
1.5 Positional Encoding
到目前为止我们发现Transformer似乎没有表达序列位置信息的能力,要知道序列次序信息在NLP中是十分重要的,之前RNN结构可以天然利用次序信息,可放到Transformer里似乎没有办法了,那怎么办呢?
——Positional Encoding
谷歌在文章中又引入了位置编码,positional encoding来缓解Transformer的硬伤——无法对位置信息很好的建模。
具体来说,谷歌使用正弦和余弦来编码位置信息:
其中,为位置序号,为维度,为偶数时,一维用编码,否则用编码。
Note:
- 是位置向量的最大长度,和word embeding最大长度保持一致,便于相加。
- 使用正余弦编码的原因是它可以
表示不同位置之间的相对关系
,因为三角函数之间存在关系:也就是说,对于单词之间的位置偏移,可以表示为和的组合,这样位置向量就有了表示相对位置的能力。
1.6 Layer Normalization
不同于BN,Layer Normalization做的是层归一化,即对某一层的所有神经元输入进行归一化,或者说每个数求平均/方差。它在training和inference时没有区别,只需要对当前隐藏层计算mean and variance就行。不需要保存每层的moving average mean and variance,此外,其增加了gain和bias作为学习的参数。
Pytorch已经有相关实现:nn.LayerNorm
1.7 Masking
Transformer也需要用到掩码技术(Masking)去对某些值进行掩盖,使其不产生效果。
有2种模式,一种是Padding Mask,其在所有的Scaled Dot-Product Attention里都需要用到;另一种是Sequence Mask,其只在Decoder的Self Attention里用到。
1.7.1 Padding Mask
由于序列的长短不一,因此为了对齐,需要对较短的序列进行填充。在注意力机制中,我们会在缺省的位子上加上一个很大的负数,这样在注意力机制的softmax步骤中就会使得这些位子的注意力权重为0,使得我们的注意力不会放在这些位子上。
相对的Mask张量中,对于需填充位置为False,否则为True。
1.7.2 Sequence Mask
在RNN为原型的Seq2Seq中,我们在t时刻是看不到未来时刻的标签的,但这在Transformer中会出问题,为了让Decoder在解码过程中不会使标签过早的提前暴露,需要对输入进行一些mask。
Masking矩阵是一个和上三角值全为负无穷,下三角全为1的矩阵:
Sequence Mask需要在softmax运算之前使用:
掩码之后对每一行进行softmax,可以从上图看出,在预测第0个单词的时候,单词0对单词1、2、3、4的注意力全为0。
1.8 Position-wise Feed-Forward Networks
Transformer的模型结构中会有Position-wise Feed-Forward Networks的存在,这是一个两层全连接层中间接一个RELU非线性层构造而出的,表达式为:
实际中使用一个的卷积层来代替全连接层。输入输出维度均为512,中间层的维度为2048.具体设置如下:
1.9 Linear&Softmax层
在解码端,输出的注意力矩阵和输入矩阵是想同维度的,Transformer通过一个全连接层将输出进一步映射成(输入维度,词汇表)的格式,然后通过softmax对每一行进行处理,使得每一行概率和为1,每一行最大概率对应的词就是所预测的词。
2 总结
2.1 Transformer模型
下面总结下Transformer整个模型:
Encoder部分:
- 输入由添加的词向量和位置编码向量组成。
- 由个相同模块串联而成,每个模块由2个子层组成,分别是Multi-Head Attention层(采用自注意力机制),其输出的矩阵和输入矩阵想同纬度;此外还有Feed-Forward层,并且每个层都连接一个LayerNorm层。整个模块由残差结构相连。
- 输出是一个编码矩阵C,是给Decoder用的,它和输入矩阵的相同维度的。
Decoder部分:
- 输入由添加的词向量和位置编码向量组成。
- 由个相同模块串联而成,每个模块由3个子层组成,第一个子层是Masked Multi-Head Attention(采用自注意力机制),其引入了Sequence masking;第二个子层是Multi-Head Attention,和上述不同,它采用的是Context Attention,其来自于Encoder输出的编码信息矩阵C,这样做的好处在于每一位单词都可以利用到Encoder所有单词的信息;第三个子层是Feed-Forward层,每个层都连接一个LayerNorm层,并且都是残差结构。
- 输出的注意力矩阵经过线性层和Softmax层输出一个概率。
2.2 Transformer流程
了解整个模型之后,我们再结合图示和具体例子对整体流程有个更深一步的了解,详见Transformer流程详解,这是网上一个博主写的,很清晰详细,点赞!!!
版权声明:本文为博主Ton10原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/MR_kdcon/article/details/123363880