【论文解析】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值,发现效果相当。为了方便,以及长文本的外插,采用简单的三角函数的表达形式:
P E ( p o s , 2 i ) = sin ⁡ ( p o s / 1000 0 2 i / d m o d e l ) ; P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s / 1000 0 2 i + 1 / d m o d e l ) PE_{(pos,2i)}=\sin(pos/10000^{2i/d_{model}});PE_{(pos,2i+1)}=\cos(pos/10000^{{2i+1}/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel);PE(pos,2i+1)=cos(pos/100002i+1/dmodel)在这里插入图片描述+ Multi-Head self Attention

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

每层的每个Head内均有待训练 W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV矩阵用于将embedding转化为对应的query,key和value(详见浅析NLP中的Attention技术),通过矩阵运算保证了计算速度: A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)={softmax}(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V

  • Position Forward

Position Forward是一个简单的2层全连接前向网络:
F F N ( x ) = max ⁡ ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=\max{(0,xW_1+b_1)}W_2+b_2 FFN(x)=max(0,xW1+b1)W2+b2

每一层的每个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)三种特征抽取器的计算性能,其中 n n n为序列长度, d d d为embedding维度, k k k为CNN的kernel大小, r r r为local self-attention的window size。
在这里插入图片描述(1)complexity per layer
可以理解为每层网络的计算复杂度。
对于CNN,考虑TextCNN操作,其计算复杂度为 n ∗ k ∗ d i n ∗ k o u t n*k*d_{in}*k_{out} nkdinkout,可写成 O ( k ∗ n ∗ d 2 ) O(k*n*d^2) O(knd2)

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

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

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

(2)Sequence operation

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

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

(3)maximum path length

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

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

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

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

而对于local化的self-attention,其output取决于窗口大小为r的sequence,对应的maximum path length可写成 O ( n / r ) 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操作。
在这里插入图片描述

2.5 position embedding的选择

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

P E ( p o s + k , 2 i ) = sin ⁡ ( ( p o s + k ) / 1000 0 2 i / d m o d e l ) = sin ⁡ ( p o s / 1000 0 2 i / d m o d e l ) cos ⁡ ( k / 1000 0 2 i / d m o d e l ) + cos ⁡ ( p o s / 1000 0 2 i / d m o d e l ) sin ⁡ ( k / 1000 0 2 i / d m o d e l ) 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}}) 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)

2.6 优化器设置

Transformer在基于机器翻译任务进行训练时,优化器采用了Adam,lr的更新采用了自定义的warm-up策略:
L r = d m o d e l − 0.5 ∗ min ⁡ ( s t e p n u m − 0.5 , s t e p n u m ∗ w a r m u p s t e p s − 1.5 ) Lr=d_{model}^{-0.5}*\min(step_{num}^{-0.5},step_{num}*warmup_{steps}^{-1.5}) Lr=dmodel0.5min(stepnum0.5,stepnumwarmupsteps1.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值。

2.8 Layer Normalization

Layer Normalization是作用于每个时序样本的归一化方法,其作用主要体现在:
(1)作用于非线性激活函数前,能够将输入拉离激活函数非饱(防止梯度消失)和非线性区域(保证非线性);
(2)保证样本输入的同分布。

在CNN类模型中,常用的归一化方法是Batch Normalization,即统计和学习跨样本各通道内的归一化方法;RNN类模型中,或者更一般的讲,在序列问题中,由于序列的天然时序性以及序列长度的不一致性,采用Layer Normalization更为合理。

Transformer在各层的MultiHead-Attention和FFN中均采用了Layer Normalization的技术,同时配以skip-connection,以提高信息的流通通道,提高模型的可训练性。

至于Layer Normalization的作用顺序定论,在Transformer原文中采用 L N ( x + S u b l a y e r ( x ) ) LN(x+Sublayer(x)) LN(x+Sublayer(x))的形式,但在tensor2tensor源代码中则采用了 x + L N ( S u b l a y e r ( x ) ) x+LN(Sublayer(x)) x+LN(Sublayer(x))的形式。

2.8 Sacled Dot-Product Attention

常见的attention计算方法分为:
(1)multi-相乘计算: s c o r e ( s i , t j ) = < W 1 s i , W 2 t j > score(s_i,t_j)=<W_1s_i,W_2t_j> score(si,tj)=<W1si,W2tj>
(2)add-相加计算: s c o r e ( s i , t j ) = < v , t a n h ( W 1 s i + W 2 t j ) > score(s_i,t_j)=<v,tanh(W_1s_i+W_2t_j)> score(si,tj)=<v,tanh(W1si+W2tj)>

两者参数量和整体计算量相当,但考虑到multi-相乘计算有成熟的加速算法,因此Transformer采用了前者。值得注意的是,Transformer在朴素的相乘计算基础上,引入了缩放因子,即: s c o r e ( s i , t j ) = < W 1 s i , W 2 t j > ( d k ) score(s_i,t_j)=\frac{<W_1s_i,W_2t_j>}{\sqrt{(d_k})} score(si,tj)=(dk )<W1si,W2tj>其中 d k d_k dk为各位置的特征维度。

三、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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值