摘要
以往的循环神经网络如LSTM和GRU,在序列建模和翻译问题中已经成为最先进的方法,但由于其循环结构,导致无法并行化计算,且难以对长序列的全局关系建模。故本文提出Transformer,一种非递归式的模型架构,完全依靠注意力机制来获取序列输入和输出之间的全局依赖关系,且Transformer允许并行化计算。具体为:
-
提出自注意力机制,是一种为了方便计算序列表示而关联单个序列的不同位置的注意力机制
-
基于循环注意力机制的端到端网络,已被证明在简单语言问答和语言建模任务上表现良好
-
第一个完全使用自注意力来计算序列输入输出的表示转换关系的模型
架构
Transformer采用编码器-解码器结构,编码器将输入序列 ( x 1 , … , x n ) (x_1,\dots,x_n) (x1,…,xn)映射为表示 z = ( z 1 , … , z n ) z = (z_1,\dots,z_n) z=(z1,…,zn),解码器再将 z z z生成为输出序列 ( y 1 , … , y m ) (y_1, \dots, y_m) (y1,…,ym)。解码器生成下一个元素时,会将之前生成的元素作为额外的输入,且每次只生成一个元素,该过程称为自回归。编码器和解码器使用堆叠的自注意力和全连接层,如上图。
Encoder and Decoder Stacks
Encoder
编码器由 N = 6 N = 6 N=6个相同结构层的堆栈组成,每一层都有两个子层,分别为多头自注意力机制(MSA)和全连接前馈神经网络(FFN)。其中,每个子层都采用残差连接进行层归一化,即,每个子层的输出为:
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))
其中 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
解码器也由 N = 6 N = 6 N=6个相同结构层的堆栈组成。每个解码器层除了有MSA、FFN两个子层外,还在中间插入第三个子层,该子层会对编码器的输出执行多头交叉注意力。与编码器类似,解码器层的每个子层也采用残差连接进行层归一化。其次,会对解码器中的所有自注意力子 层添加掩码屏蔽,防止当前位置的自注意力关注后续位置的输入,确保对位置 i i i的预测只能依赖于位置小于 i i i的已知输出。
Attention
注意力函数会将query和一组key-value对映射到输出,query、key、value和输出都是向量。其中,输出定义为以value为值、以query和对应的key经过兼容性函数计算的结果为权重的加权和。
Scaled Dot-Product Attention
缩放点积注意力的输入有维度为 d k d_k dk的query、key以及维度 d v d_v dv的value。首先计算单个query与所有key的点积,并分别除以 d k \sqrt d_k dk,随后应用softmax获得 value的权重并与value做点积计算得到加权和。
在实践中,会同时计算一组query的注意力函数。将给定的一组query打包成矩阵Q,key和value分别打包成矩阵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(dkQKT)V
两个常用的注意力函数是加性注意力和点积注意力。点积注意力使用点积操作为兼容性函数(如上式,除了缩放因子 1 d k \frac 1 {\sqrt {d_k}} dk