本文阅读初衷是了解到paddlehub的enire是借鉴了这篇文章的算法。因此决定来看一下这篇经典论文。
CNN和RNN是现在主流的序列预测模型。这类序列预测模型包含一个编码器和一个解码器。性能最优的模型是通过一个注意力机制连接编码器和解码器的模型。我们在这里提出一个新的模型架构,the Transformer。它依赖于注意力机制,不需要recurrence 和convolutions。在两个机器翻译任务中实验显示:该算法训练耗时更少。
传统的RNN网络,由于前后的依赖性,因此无法实现并行计算。本算法提出的“Transformer”打破了不能并行计算的缺点,从而加快了计算速度。 因此,主要优势就是“并行”。
自注意力机制(Self-attention),有时也叫做内部注意力机制。是一种关注单序列不同位置之间关系的注意力机制。目的是为了计算序列的表示序列。自注意力机制已经被用在阅读理解、内容概述等多任务中。 基于循环注意力机制的端到端记忆网络被证明在简单语言问答和语言建模任务中表现较好。据我们所知,Transformer是第一个完全依靠自注意力机制而没有使用 sequencealigned RNNs 或者 convolution去计算输入输出序列的网络。在下面的章节中,我们将就Transformer在模型方面的优势展开讨论。
大多数自然语言转换模型都包含一个encoder-decoder结构,模型的输入是一个离散符号序列(symbol)x=(x1,x2,⋯,xn)x=(x1,x2,⋯,xn),encoder负责将它映射成连续值序列z=(z1,z2,⋯,zn)z=(z1,z2,⋯,zn)。而给定zz,decoder负责生成一个输出符号序列y=(y1,y2,⋯,ym)y=(y1,y2,⋯,ym)。模型是自回归的,即之前生成的输出会作为额外的输入,用于生成下一个输出。 然而The Transformer的架构如下图所示。使用的是堆栈式的自注意力机制和point-wise
编码器:编码层由六个相同的层堆砌而成。每一个层又包含两个子层(Multi-Head Attention and position wise fully connected feed-forward network).我们使用residual connection来连接每两个子层,紧跟着进行标准化处理。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是由子层本身实现的功能。 为了促进这些residual connection,模型中的所有子层以及嵌入层均产生尺寸为dmodel = 512的输出。 解码器:解码器同样是由六层组成。不同的是,解码层每层有三个子层。在编码器堆栈的输出上执行multi-head attention。与编码器一样,我们使用残差连接每一个子层,然后进行标准化处理。我们也修改了解码器堆栈的自注意力机制的子层,防止它对后续位置的关注。这种修改,确保预测对位置 i i i 的预测只与之前的位置预测有关,与后续的无关。
注意力机制,可以看作是一个query与一组键值对映射到输出的过程。query\keys\values\output都是向量。output是values的加权和。其中,分配给每个值的权重是通过query和相应key之间的函数计算得到的。
3.2.1 Scaled Dot-Product Attention(点积注意力机制)
上图的左侧为ScaledDot-ProductAttention 图,输入是由Q(query)、K(keys,一个 d k d_{k} dk维的向量)、V(values,一个 d v d_{v} dv维的向量)组成。我们用所有的keys来计算query的结果,然后除以 d k \sqrt{d_{k}} dk ,结果通过一个softmax函数得到V的权重。 实际中,可同时计算一组query,为矩阵Q,keys和values同理,分别为K、V。输入公式如下。 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
3.2.1 Multi-Head Attention
上图的右侧为Multi-Head Attention。假设,有h个query组合成Q,那么最后concat层就是将h个dv维向量进行拼接。有兴趣的可以根据上面的公式做一下推导。
3.2.3 Applications of Attention in our Model
The Transformer uses multi-head attention in three different ways:
K和Q来自编码器的输出,Q来自解码器的上一个输出。这使得解码器中的每个位置都可以参与输入序列中的所有位置。编码器包含self-attention层。在一个self-attention层中,所有的键、值和查询都来自编码器中前一层的输出。这样encoder的每个位置都能去关注前一层encoder输出的所有位置。类似地,解码器中的自我注意层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。该层的计算公式如下 F F N ( x ) = m a x ( 0 , x W 1 + b ( i ) ) W 2 + b 2 FFN(x)=max(0,xW_{1}+b_(i))W_{2}+b_{2} FFN(x)=max(0,xW1+b(i))W2+b2 如上式所示,两个线性函数中加入一个relu激活函数。
