【论文解析】Transformer浅析(Attention is All You Need)
Attention is All You Need作为NLPer必须反复阅读和深刻理解的经典论文,提出了Transformer这样一个效果优异的特征抽取器,被广泛应用于后续的预训练模型。
网络上关于Transformer的优秀解读很多,本文仅记录了本人的一些思考和理解。
一、模型架构解读
Transformer是基于经典的机器翻译Seq2Seq框架提出的,区别在于Encoder和Decoder中大量使用attention机制提取信息。
1.1 Encoder
Encoder的底层为类似于词向量的embedding层,然后接6层Multi-Head Attention和Position Forward的堆叠。
- Embedding
在Transformer中,embedding包括两部分:预训练的词向量,以及表示token位置信息的position embedding。因为self-attention机制本身并不考虑词序的影响,因此必须引入position embedding。论文对比了预定义的position embedding和学习得到的embedding值,发现效果相当。为了方便,以及长文本的外插,采用简单的三角函数的表达形式:+ Multi-Head self Attention
通过self-attention的方式得到输入sequence中各token间的信息,同时采用多头机制保证了子空间特征抽取的多样性。
每层的每个Head内均有待训练矩阵用于将embedding转化为对应的query,key和value(详见浅析NLP中的Attention技术),通过矩阵运算保证了计算速度:
- Position Forward
Position Forward是一个简单的2层全连接前向网络:
每一层的每个Head的Attention后接着的Position Forward权重共享,分别作用于各token。然后将各head同一个token得到的结果进行拼接,作为下一层encoder的输入。
- add&layer normalization
为了信息的流动和BP的顺利,Transformer在各self-embedding和position forward中均采用了add&layer normalization的short-cut。
1.2 Decoder
Decoder的整体结构和Encoder非常类似,同样是embedding层,然后接6层Multi-Head Attention和Position Forward的堆叠,最后再接一个LC+softmax层用于每个时间步output token的计算。
- 相同模块
其中,Embedding、Multi-Head self Attention、Position Forward和 add&layer normalization的基本机制与Encoder基本相同。但值得注意的是Decoder阶段是序列的生成过程,其无法进行并行,同时在self-attention时必须仅对已知token进行计算,而对后续位置的token进行屏蔽。
- encode-decode attention
为了达到seq2seq中attention的效果,在每个Multi-Head self Attention和Position Forward模块之间,还引入了encode-decode attention,其中encoder的K,V来源于Encoder模块的最后一层,而Q来源于Decoder的上一层。
- fc+softmax
在每个token的推断中,采用经典的fc+softmax进行计算,为了缩减计算量同时避免直接取max的粗糙,Transformer采用了beam search的策略,输出序列的长度上限设置为输入序列长度长度+50。
二、一些容易忽略的细节
2.1 非线性计算
Transformer中的的部分计算均为线性变换,模型的非线性体现在两个方面:
(1)FFN中的relu**函数;
(2)Decoder中 fc+softmax的softmax操作。
2.2 计算复杂度
论文从complexity per layer、sequence operations和maximum path length三个维度对比了CNN、RNN和self-attention(包括global和local)三种特征抽取器的计算性能,其中为序列长度,为embedding维度,为CNN的kernel大小,为local self-attention的window size。(1)complexity per layer
可以理解为每层网络的计算复杂度。
对于CNN,考虑TextCNN操作,其计算复杂度为,可写成;
对于RNN,其沿着序列化操作,其计算复杂度为,可写成
对于self-attention,每两个token之间进行内积计算,其计算复杂度为,可写成
若考虑self-attention的local化,则可简化为
(2)Sequence operation
即算法所计算涉及到的序列长度,其越长表示可并行化程度越差。
除了RNN网络,无论CNN还是self-attention均不涉及序列操作,所以均为。
(3)maximum path length
即数据在前向或反向中涉及到的相关神经元的长度,类似于CNN中的感受野。
对于CNN,如果采用空洞卷积,可写成
对于RNN,为整个序列长度,可写成
对于self-attention,其无视距离,可写成
而对于local化的self-attention,其output取决于窗口大小为r的sequence,对应的maximum path length可写成
2.3 embedding权重共享
Transformer在两个地方对embedding权重进行了共享。
(1)Decoder中embedding层和fc层网络的共享,从而方便了计算和迭代。
(2)encoder和decoder间的embedding权重共享。在5.1节English-Germain机器翻译数据集的训练中,采用了byte-pair的分词方式,此时源语言和目标语言间的token-embedding层是共享一张大词表的。
2.4 attention中的mask操作
整个Transformer中包含三种类型的attention:
(1)Encoder的self-attention;
(2)Decoder中的self-attention;
(3)Decoder中的encode-decoder attention。
这三种类型的attention均涉及到mask操作,但目的并不相同。
在Encoder的self-attention,考虑到batch的并行化,通常会进行padding,因此会对序列中mask=0的token进行mask后在进行attention score的softmax归一化。
在Decoder中的self-attention,为了避免预测时后续tokens的影所以必须令后续tokens的mask=0,其具体做法为构造一个三角矩阵。
在Decoder中的encode-decoder attention中,涉及到decoder中当前token与整个encoder的sequence的计算,所以encoder仍然需要考虑mask。
综上,无论对于哪个类型的attention,在进行sotmax归一化前,都需要考虑mask操作。
2.5 position embedding的选择
Transformer对比了position embedding的效果,选择了三角函数的预定义模型。之所以这样选择,文章解释是为了让相对位置下的token间可以进行线性计算,用公式来解释就是:
2.6 优化器设置
Transformer在基于机器翻译任务进行训练时,优化器采用了Adam,lr的更新采用了自定义的warm-up策略:
而warm-up也是bert等预训练模型进行fine-tune的标准策略。
2.7 正则化设置
为了提高Transformer的泛化能力,Transformer训练时采用了大量的正则化策略:
(1)在Encoder和Decoder的Embedding输入层中均采用了drop out;
(2)在各Multi-Head Attention以及Position Forward进行Add&Normalization前,均对对应的输出值进行了drop out;
(3)在Decoder的predict阶段,采用了label smoothing的策略,降低了输出的置信度,虽然perplexity值有所降低,但提高了准确率和 BLEU值。
三、Transformer的优势
回过头来看Transformer,其通过引入self-attention机制,具有明显的优势:
(1)长距离的信息捕捉。虽然RNN通过gate的引入,能在一定上改善长距离依赖,但自回归模型的梯度消失/爆炸仍限制了RNN模型的使用。而CNN模型的专场在于捕捉local特征,虽然可以通过空洞卷积和层次化的结构扩大感受野,但对于长距离的信息捕捉仍然较弱。而self-attention直接摆脱了距离的限制,能够很好的捕捉远距离的文本信息关系。
(2)计算上的优势。RNN的另外一大缺点在于自回归模型无法实现并行计算,而self-attention的自交互式计算则没有这个问题,可以非常方便的进行并行计算。此外,一般embedding的维度是大于文本长度的,所以transformre的计算量更小。
(3)性能上的优势。由于Transformer的self-attention对每两个token间的信息进行了交互,同时multi-head的方式也能够从各sub-space捕获更多的特征细节,所以用Transformer作为特征抽取器的模型在各种下游任务上的表现均明显优于传统的CNN和RNN模型。所以,Transformer在后续GPT、Bert、XLNet等预训练模型上的大火也就不难理解了。
【Reference】