【论文解析】Transformer浅析(Attention is All You Need)

Attention is All You Need作为NLPer必须反复阅读和深刻理解的经典论文,提出了Transformer这样一个效果优异的特征抽取器,被广泛应用于后续的预训练模型。

网络上关于Transformer的优秀解读很多,本文仅记录了本人的一些思考和理解。

一、模型架构解读

Transformer是基于经典的机器翻译Seq2Seq框架提出的,区别在于Encoder和Decoder中大量使用attention机制提取信息。
【论文解析】Transformer浅析(Attention is All You Need)

1.1 Encoder

Encoder的底层为类似于词向量的embedding层,然后接6层Multi-Head Attention和Position Forward的堆叠。

  • Embedding

在Transformer中,embedding包括两部分:预训练的词向量,以及表示token位置信息的position embedding。因为self-attention机制本身并不考虑词序的影响,因此必须引入position embedding。论文对比了预定义的position embedding和学习得到的embedding值,发现效果相当。为了方便,以及长文本的外插,采用简单的三角函数的表达形式:
PE(pos,2i)=sin(pos/100002i/dmodel);PE(pos,2i+1)=cos(pos/100002i+1/dmodel)PE_{(pos,2i)}=\sin(pos/10000^{2i/d_{model}});PE_{(pos,2i+1)}=\cos(pos/10000^{{2i+1}/d_{model}})【论文解析】Transformer浅析(Attention is All You Need)+ Multi-Head self Attention

通过self-attention的方式得到输入sequence中各token间的信息,同时采用多头机制保证了子空间特征抽取的多样性。

每层的每个Head内均有待训练WQ,WK,WVW^Q,W^K,W^V矩阵用于将embedding转化为对应的query,key和value(详见浅析NLP中的Attention技术),通过矩阵运算保证了计算速度:Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)={softmax}(\frac{QK^T}{\sqrt{d_k}})V

  • Position Forward

Position Forward是一个简单的2层全连接前向网络:
FFN(x)=max(0,xW1+b1)W2+b2FFN(x)=\max{(0,xW_1+b_1)}W_2+b_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)三种特征抽取器的计算性能,其中nn为序列长度,dd为embedding维度,kk为CNN的kernel大小,rr为local self-attention的window size。
【论文解析】Transformer浅析(Attention is All You Need)(1)complexity per layer
可以理解为每层网络的计算复杂度。
对于CNN,考虑TextCNN操作,其计算复杂度为nkdinkoutn*k*d_{in}*k_{out},可写成O(knd2)O(k*n*d^2)

对于RNN,其沿着序列化操作,其计算复杂度为n(dindh+dh+dh)n*(d_{in}*d_h+d_h+d_h),可写成O(nd2)O(n*d^2)

对于self-attention,每两个token之间进行内积计算,其计算复杂度为Cn2dC_{n^2}*d,可写成O(n2d)O(n^2*d)

若考虑self-attention的local化,则可简化为O(knd)O(k*n*d)

(2)Sequence operation

即算法所计算涉及到的序列长度,其越长表示可并行化程度越差。

除了RNN网络,无论CNN还是self-attention均不涉及序列操作,所以均为O(1)O(1)

(3)maximum path length

即数据在前向或反向中涉及到的相关神经元的长度,类似于CNN中的感受野。

对于CNN,如果采用空洞卷积,可写成O(logkn)O(\log_kn)

对于RNN,为整个序列长度,可写成O(n)O(n)

对于self-attention,其无视距离,可写成O(1)O(1)

而对于local化的self-attention,其output取决于窗口大小为r的sequence,对应的maximum path length可写成O(n/r)O(n/r)

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操作。
【论文解析】Transformer浅析(Attention is All You Need)

2.5 position embedding的选择

Transformer对比了position embedding的效果,选择了三角函数的预定义模型。之所以这样选择,文章解释是为了让相对位置下的token间可以进行线性计算,用公式来解释就是:

PE(pos+k,2i)=sin((pos+k)/100002i/dmodel)=sin(pos/100002i/dmodel)cos(k/100002i/dmodel)+cos(pos/100002i/dmodel)sin(k/100002i/dmodel)PE_{(pos+k,2i)}=\sin((pos+k)/10000^{2i/d_{model}})=\sin(pos/10000^{2i/d_{model}})\cos(k/10000^{2i/d_{model}})+\cos(pos/10000^{2i/d_{model}})\sin(k/10000^{2i/d_{model}})

2.6 优化器设置

Transformer在基于机器翻译任务进行训练时,优化器采用了Adam,lr的更新采用了自定义的warm-up策略:
Lr=dmodel0.5min(stepnum0.5,stepnumwarmupsteps1.5)Lr=d_{model}^{-0.5}*\min(step_{num}^{-0.5},step_{num}*warmup_{steps}^{-1.5})

而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】

  1. The Illustrated Transformer