赞
踩
Attention is All You Need作为NLPer必须反复阅读和深刻理解的经典论文,提出了Transformer这样一个效果优异的特征抽取器,被广泛应用于后续的预训练模型。
网络上关于Transformer的优秀解读很多,本文仅记录了本人的一些思考和理解。
Transformer是基于经典的机器翻译Seq2Seq框架提出的,区别在于Encoder和Decoder中大量使用attention机制提取信息。
Encoder的底层为类似于词向量的embedding层,然后接6层Multi-Head Attention和Position Forward的堆叠。
在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是一个简单的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的输入。
为了信息的流动和BP的顺利,Transformer在各self-embedding和position forward中均采用了add&layer normalization的short-cut。
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进行屏蔽。
为了达到seq2seq中attention的效果,在每个Multi-Head self Attention和Position Forward模块之间,还引入了encode-decode attention,其中encoder的K,V来源于Encoder模块的最后一层,而Q来源于Decoder的上一层。
在每个token的推断中,采用经典的fc+softmax进行计算,为了缩减计算量同时避免直接取max的粗糙,Transformer采用了beam search的策略,输出序列的长度上限设置为输入序列长度长度+50。
Transformer中的的部分计算均为线性变换,模型的非线性体现在两个方面:
(1)FFN中的relu激活函数;
(2)Decoder中 fc+softmax的softmax操作。
论文从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}
n∗k∗din∗kout,可写成
O
(
k
∗
n
∗
d
2
)
O(k*n*d^2)
O(k∗n∗d2);
对于RNN,其沿着序列化操作,其计算复杂度为 n ∗ ( d i n ∗ d h + d h + d h ) n*(d_{in}*d_h+d_h+d_h) n∗(din∗dh+dh+dh),可写成 O ( n ∗ d 2 ) O(n*d^2) O(n∗d2)
对于self-attention,每两个token之间进行内积计算,其计算复杂度为 C n 2 ∗ d C_{n^2}*d Cn2∗d,可写成 O ( n 2 ∗ d ) O(n^2*d) O(n2∗d)
若考虑self-attention的local化,则可简化为 O ( k ∗ n ∗ d ) O(k*n*d) O(k∗n∗d)
(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)
Transformer在两个地方对embedding权重进行了共享。
(1)Decoder中embedding层和fc层网络的共享,从而方便了计算和迭代。
(2)encoder和decoder间的embedding权重共享。在5.1节English-Germain机器翻译数据集的训练中,采用了byte-pair的分词方式,此时源语言和目标语言间的token-embedding层是共享一张大词表的。
整个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对比了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)
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=dmodel−0.5∗min(stepnum−0.5,stepnum∗warmupsteps−1.5)
而warm-up也是bert等预训练模型进行fine-tune的标准策略。
为了提高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值。
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))的形式。
常见的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,其通过引入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】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。