Transformer是近两三年非常火的一种适用于NLP领域的一种模型,本质上是Encoder-Decoder结构,所以多应用在机器翻译(输入一个句子输出一个句子)、语音识别(输入语音输出文字)、问答系统等领域。本文基于Attention is all you need这篇论文,讲解Transformer的结构,涉及到的图片均为论文中或经典图片,参数值均来自论文,具体问题可以具体调整超参数。
Transformer的组成模块分为:Attention(包括multi-head self-Attention & context-Attention),Normalization(使用的是layer Norm,区别于Batch Norm),mask(padding mask & sequence mask),positional encoding,feed forword network(FFN)。
1、总体结构
Transformer的总架构如下图所示:
这是典型的Transformer结构,简单来说,Transformer = 预训练(input) + Encoder*N + 预训练(output) + Decoder*N+output。
模型的运行步骤为:
① 对Input做Embedding,可以使用Word2Vec等工具,维度为512维,Embedding过后结合positional encoding,它记录了输入单词的位置信息。
② 预处理后的输入向量经过多头Attention层处理,加入残差、规则化,数据给到FFN(全连接层),再加入残差、规则化。如此反复,经过6个这样的Encoder(即Nx=6x),编码部分结束。
③ 编码部分的第一个Decoder的第一个Attention接受的是来自Outputs的信息,其余的均接受来自Encoder和上一层Decoder的信息。最终的output的串行生成的,每生成一个,就放到Decoder最下面的outputs座位Decoder的输入。
④ Decoder也是6个,最终的输出要经过线性层和Softmax得到最终输出。
要注意的是,Encoder和Decoder的结构是相同的,但不共享权重;在Encoder部分,每个单词在Attention层的路径具有依赖关系,串行执行,在FFN层不具有依赖关系,并行执行。
2、Attention
在这个结构中,存在这样几个Attention,有:self-attention & context attention & scaled dot-product attention & multi-headed attention。要说明的是scaled dot-product attention和multi-headed attention是两种attention的计算方法,后面会介绍,前两个Attention均使用的是这两种计算方法。
2.1 scaled dot-product attention
这种Attention的计算公式为:
以第一个Encoder为例对流程解释如下:
① 为Encoder的每个单词创建如下的三个向量:Query vector , Key vector , Value vector。这三个向量由输入的Embedding乘以三个向量矩阵得到。要注意的是,Embedding向量维度为512,Q K V向量维度是64。
② 计算Score:对于每个词,计算它自身的与所有的的乘积。
③ 计算Attention:按上面Attention的公式,将Score除以一个定值(这个操作称为“scaled”),进行Softmax变换,使所有Score之和为1。最后乘以对应位置的,得到该单词的Attention。
这就是scaled dot-product attention这种机制的计算方法,Transformer架构中的两种Attention都使用的是这种计算方法,不同的是二者的Q K V的来源有些差异。
注:为什么Softmax中要除以一个根号?论文中给出的原因是本来和都是均值为0、方差为1的变量,假设二者分布相互独立,他们乘积的分布就是均值为0、方差为,除以根号使得Softmax内的值保持均值为0、方差为1利于梯度计算。如果不加根号会使得计算收敛很慢,因为Softmax中的值处于梯度消失区。
进一步思考:为什么很多Attention中没有Scaled这一步?Attention分为两种,前面那种是乘法,还有加法的一种:。实验表明,加法虽然看起来简单但计算起来并没有快多少(tanh相当于一个完整的隐层),在维度较高时确实更好,但如果加上Scaled也差不多。Transformer中选择乘法是为了计算更快,维度大的话就加上Scaled。
2.2 multi-headed attention
多头注意力机制也是一种处理的技巧,主要提高了Attention层的性能。因为上面介绍的self-attention虽然包含了其余位置的编码,但主导的还是自身位置的单词,而有时我们更需要关注其他位置,比如机器翻译中的代词具体指代哪个主语。
多头注意力机制是把Q K V三个矩阵通过h个线性变换投影,然后进行h次self-attention的计算,最后再把h个计算结果拼接起来。
2.3 self-attention & context attention
在Encoder的self-attention中,Q K V均是上一层Encoder的输出,对于第一个Encoder来说,他们就是输入的Embedding与positional encoding之和。
在Decoder的self-attention中,Q K V也是上一层Decoder的输出,对于第一个Decoder来说,他们是输入的Embedding与positional encoding之和。要注意的是,这部分我们不希望获取到后面时刻的数据,只想考虑已经预测出来的信息,所以要进行sequence masking(后面讲到)。
在Encoder-Decoder attention(即context attention)中,Q是Decoder上一层的输出,K V是Encoder的输出。
3、Layer Normalization
Transformer中使用的是LN,并非BN(Batch Normalization)。什么是Norm规范化,一般地,可以用下面公式来表达:
公式一为规范化处理前,公式二为处理后。规范化是对数据分布的调整,比如本身数据是正态分布,调整后的数据分布就是标准正态分布,相当于调整了均值和方差。这样做的意义一是让激活值落入激活函数敏感区间,梯度更新变大,训练加快,二是消除极端值,提升训练稳定性。
Transformer使用的是LN,而不是BN。首先看二者的区别如图:
LN是对每个样本自身进行规范化,BN是对一个批次的数据在同一维度上规范化,是跨样本的。在CNN任务中,BatchSize较大,并且训练时全局记录了样本均值和方差,适用于BN。而时序问题中,对每个神经元进行统计是不现实的。LN的限制相对来说就小很多,即时BatchSize=1也无妨。
4、mask
mask分为两种,一是padding mask,二是sequence mask,这两种在Transformer中出现的位置不同:padding mask在所有scaled dot-product attention中均出现,sequence mask仅在decoder的self-attention中出现。
4.1 padding mask
由于每个batch的输入序列的长度不同,padding mask被用来对齐序列长度,简单来说就是短序列向长序列对齐,对齐的方法就是补0。补充上的地方是没有意义的,那么Attention就不应该给以关注。实际上,我们并不是直接在相应位置上补充0,而是补充-inf(负无穷),这样在Softmax之后,这些位置的概率就接近0了。
在处理过程中,padding mask是一个bool张量,false的地方就是补0的地方。
4.2 sequence mask
前面提到,sequence mask的作用是不让decoder看到当前时刻以后的信息,所以要把后面那部分信息完全遮盖住。具体的做法是,产生一个上三角矩阵,上三角的值均为1,下三角和对角线均为0。
在decoder的self-attention部分,sequence mask 和 padding mask同时作用,二者相加作为mask。
5、positional encoding
RNN处理序列问题是天然有序的,而Transformer消除了这种时序上的依赖。以机器翻译为例,输出要是一个完整的合理的句子,就需要对输入数据处理时加入位置信息,否则可能输出结果的每个字是对的,但组成不了一句话。positional encoding是对输入信息的位置进行编码,再和输入的Embedding相加。
positional encoding使用的是正余弦编码:
在偶数位置,使用公式一正弦编码,奇数位置使用公式二余弦编码。由于正余弦函数的特性,这种编码既是绝对位置编码,也包含了相对位置编码的信息。
相对位置编码信息主要依赖于三角函数和角公式:
6、FFN
FFN 是一个全连接网络,顺序上先线性变换,再ReLU非线性变换,再线性变换,公式如下:
参考文献: