一、自注意力机制(Self-Attention)
1.1基础原理
可以将Self-Attention看作是一个模块,输入可以是数据,也可以是网络中的隐藏层。将数据输入到该模块后,输出对应个数的向量,再将其结果输入至全连接网络(Fully Connected, FC),最后输出标签。以上过程可以重复多次。值得注意的一点是,Self-Attention的每一个输出都考虑了全局信息,即每个输出都与所有的输入相关,原理图见下:
图1 Self-Attention原理图
其中,为输入向量或隐藏层,为输出向量。由于每个输出与所有输入有关,那么我们需要考虑每个输入之间的关联性(Attention Score)。用于Transformer中的关联性计算模组被称为Dot-Product,因此我们也可将该注意力机制称为Scaled Dot-Product Attention。它是将需要计算关联性的2个输入向量分别乘以2个不同的权重矩阵得到2个新向量,之后将2个新向量点乘便可以得到输入向量之间的关联性,计算模组示意图见下:
图2 Dot-Product示意图
图2中为输入向量,为权重矩阵(后面的也是),是人为设置的。以第一个输出为例,Scaled Dot-Product Attention的整体架构见下:
图3 Scaled Dot-Product Attention整体架构
可以看到,若要得到输出向量,则需要计算出第个输入向量自己和自己的关联性,以及它和其它所有输入向量的关联性。以图3中计算第一个输出向量为例,。得到三个向量后,将与点乘后可以得到第一个输入向量与其他输入向量(包括自己)之间的关联性。之后将其进行Softmax,得到,计算公式为:
(1)
将与相乘,再将所有结果相加,便可得到输出向量:
(2)
可以看出,若两个输入向量间的关联性较大,则就更影响结果。
我们可以将所有的输入向量堆叠成一个矩阵,矩阵中的每一行代表一个样本,人为设置权重矩阵,便可以通过下式计算出相应的(query)、(key)、(value)矩阵:
(3)
、、三个矩阵可分别看作
三类向量的堆叠。这里,query、key、value的概念其实来源于推荐系统。基本原理是:给定一个query,计算query与key的相关性,然后根据query与key的相关性去找到最合适的value。
得到上述三个矩阵后,便可以用中每个向量与中每个向量点乘得到关联性矩阵,即;之后对其进行归一化处理,即,其中为矩阵的维度,归一化的目的主要是为了训练时的梯度能够稳定,防止梯度爆炸;最后通过Softmax函数,再与矩阵相乘,便可以得到Scaled Dot-Product Attention的输出结果,流程图如下:
图4 Scaled Dot-Product Attention计算流程图
图4中MatMul表示矩阵乘积。整理后可以得到输出矩阵为:
(4)
1.2多头注意力机制(Multi-Head Attention)
Multi-Head Attention是在Self-Attention的基础上,使用多组权重矩阵 、、得到多组、、矩阵,然后每组分别计算得到输出矩阵,最后将得到的多个输出矩阵进行拼接,最后再和一个新的权重矩阵相乘得到最终的输出矩阵。计算公式见下:
(5)
其中Concat指的是矩阵拼接函数。Transformer中使用了8组不同的、、,,即.
1.3 位置编码(Positional Encoding)
由于Transformer中不包含递归和卷积,且Self-Attention无法获取位置信息,为了让模型能够利用输入序列的顺序,必须注入一些相对或绝对位置的信息,因此在输入中嵌入了位置编码。在实际应用中可以通过数据训练学习得到位置编码;Transformer中使用的是正余弦位置编码,通过使用不同频率的正弦、余弦函数生成,之后和对应位置的向量相加,因此位置向量的维度必须和对应的输入向量的维度相同。位置编码计算公式见下:
(6)
表示输入向量在总输入的绝对位置,表示该位置的输入向量的维度,表示该向量的第几维度。
二、Transformer原理
2.1模型结构
Transformer的结构图如图5所示,主要由输入、编码器(Encoder)、解码器(Decoder)和输出4部分构成。
图5 Transformer结构图
编码器和解码器均由6个相同的结构堆栈而成,即。
2.2输入结构
从图5中可以看到,Encoder的输入为添加了位置编码的输入向量,Decoder的输入为编码器的输出和添加了位置编码的Transformer的输出,位置编码见公式(6)。其中,Decoder中第二个子层Multi-Head Attention的输入矩阵来自于Decoder中第一个Multi-Head Attention的输出;输入、矩阵来自于Encoder的输出。
2.3 Encoder结构
每个Encoder内部都包含2个子层:第1层是Multi-Head Attention,第2层是全连接位置前馈网络(Position wise fully connected feed forward Network)。并且每一个子层都用残差连接,然后进行层归一化(Layer Normalization, LN)。
Add&Norm中Add表示残差块,其基本结构如下:
图6 残差块基本结构图
其中,是残差块的输入,当输入为时其学习到特征为,则最终输出。加入残差块的目的是为了防止在训练中发生退化的问题。而Norm表示层归一化,对于一个输入的向量,如,经过归一化后得到,则:
(7)
其中为该向量的均值,为该向量的方差。这里需要注意,Layer Normalization与Batch Normalization不同。LN是在同一个样本中的不同神经元之间进行归一化,而BN是在同一个batch中不同样本之间的同一位置的神经元之间进行归一化。归一化的目的是加快训练速度,并提高训练的稳定性。
全连接位置前馈网络的公式见下:
(8)
其中为Multi-Head Attention的输出矩阵,矩阵中的每一个样本都单独经过完全相同的前馈神经网络。可以看到,该网络包括2个线性转换,中间有一个ReLU激活函数,即该网络将Multi-Head Attention的输出映射到更高维的空间中,然后通过ReLU激活函数进行筛选,筛选完后再变换到原来的维度。
因此,Transformer中的Encoder的整体流程为:输入的、、矩阵进入含有残差结构的Multi-Head Attention,对输出进行Layer Normalization后,再输入到含有残差结构的全连接位置前馈网络中,再对输出进行Layer Normalization,得到将会输入Decoder中的、矩阵,它们将被输入到Decoder中的第2个子层。
2.4 Decoder结构
每个Decoder除了含有Encoder中的2个子层之外,还含有第3个子层,对Encoder堆栈的输出执行Multi-Head Attention。与Encoder中类似,Decoder中的每个子层也使用残差结构连接,然后进行层归一化。但是,Decoder中所含的Encoder中的Multi-Head Attention子层多加了掩码,即mask码。
Masked Multi-Head Attention中的掩码会对某些值进行掩盖,使其再参数更新时不产生效果。Mask码包括Padding-Mask 和Sequence-Mask。Padding-Mask的作用是对输入序列进行对齐,即给较短的序列后面补0,把较长序列的多余的部分直接舍弃,因为这些填充的位置,其实是没有什么意义的,所以我们的Attention机制不应该把注意力放在这些位置上,具体的做法是把这些位置上的值加上一个非常大的负数(),这样经过Softmax后这些位置的概率就会接近0;Sequence-Mask的作用是使Decoder的输出仅依赖于当前时刻之前的输出,具体的做法是产生一个上三角矩阵,上三角的值全为0,将这个上三角矩阵作用在输入矩阵的每个向量上。
因此,Transformer中的Decoder的整体流程为:输入的、、矩阵进入含有残差结构的Masked Multi-Head Attention,对输出进行Layer Normalization后,输出作为下一个子层Multi-Head Attention的矩阵,而、矩阵由Encoder的输出提供。最后再将Multi-Head Attention的输出输入到含有残差结构的全连接位置前馈网络中,再对输出进行Layer Normalization。
2.5输出结构
Transformer的输出首先经过一次线性变换,然后Softmax得到输出的概率分布。
参考文献
[1] K. He, X. Zhang, S. Ren and J. Sun, "Deep Residual Learning for Image Recognition," 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Las Vegas, NV, USA, 2016, pp. 770-778, doi: 10.1109/CVPR.2016.90.
[2] Vaswani, Ashish et al. “Attention is All you Need.” Neural Information Processing Systems (2017).