引言
google 在2017年发布的一篇论文,即是transformer,原文地址:Attention Is All You Need
总结前面的工作,更加正式的定义了attention。此前,无论是基于序列还是卷积的网络,大都是在decoder端引入attention,可以称之为decoder attention机制,这种机制主要用来处理的是对齐问题。
而google这篇论文,直接在encoder端就引入了attention机制,同时在decoder端也实现了同样的一套attention结构,这个部分可以理解为是对文本语义表征的提取。
传统的利用序列的模型,需要一步步的由前往后计算出序列的表征,这样就存在长距离的依赖问题,同时当前词语能够获取到上下文信息其实比较有限,毕竟类似RNN这样的模型,本质上属于马尔可夫模型。
或者利用卷积网络,通过层叠卷积层来扩大感受野,从而获取全文信息。但是文本的处理不同于图像,图像从点到线再到组合,需要关注的特征都是在局部扩展而来,而文本在表征语义时,需要获取的信息可能来自距离很远的另一个词,所以也存在问题。
相比以上两者,直接通过attention的方式获取全局语义,这种做法就来的更加有效率。
模型
transformer的整体模型如下图所示:
整体上保持了Encoder-Decoder的机制,与前面工作一致的是在Decoder端也attend了Encoder的输出作为输入,最后通过softmax归一化概率矩阵。
Encoder and Decoder Stacks
Encoder
Encoder由N个层堆叠而成,N=6,其中的每个层都拥有两个子层。第一个子层称为Multi-head self-attention,第二个子层称为Position-wise Feed-Forward Networks。
同时,在这两个子层中还加入残差网络和layer normalization,所以每个子层的可以描述为以下公式:
L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x + Sublayer(x)) LayerNorm(x+Sublayer(x))
其中 x x x为残差, S u b l a y e r ( x ) Sublayer(x) Sublayer(x)即是通过子层得到的输出,两者的维度均为 d m o d e l = 512 d_{model} = 512 dmodel=512
Decoder
Decoder与前面一样,也是由N=6个层堆叠而成,这里每个层都拥有三个子层。其中前两个层与Encoder类似,需要注意的是为了防止序列获取未来信息,所以在attention时对未来信息加上了掩码。第三个层则是attend了Encoder的输出,类似在前面工作中提出过的align方式,需要注意这里N=6个层都需要attend前面Encoder的输出,所以与Encoder的N=6个层是一一对应的attend的值为stack后的最终结果。
类似的,Decoder中也加入残差网络和layer normalization。
Scaled Dot-Product Attention
在前面的工作中,一般将Attention作为一个序列化编码的结果进行处理,在本论文中,作者给出了一个更一般的模式:
对于attention,可以将其形容为Q(query)、K(key)、V(value)三者的某种函数表达,比如在论文Neural Machine Translation by Jointly Learning to Align and Translate中, Q = H t − 1 Q=H_{t-1} Q=Ht−1, K = V = { h 1 , . . . , h t } K=V=\{h_1,...,h_t\} K=V={
h1,...,ht},其中 H H H为decoder隐层输出, h h h为encoder隐层输出。
在具体的任务中,Q、K、V可以有不同的表达方式,一般化的公式如下:
其中 Q ∈ R n ∗ d k Q∈R^{n*d_k} Q∈Rn∗dk, K ∈ R m ∗ d k K∈R^{m*d_k} K∈R