摘要

现在主流的序列转换模型都是基于复杂的循环神经网络或者卷积神经网络。这些神经网络中都包含一个编码器和一个解码器。表现最好的模型使用一个注意力机制把编码器和解码器连接起来。我们提出了一个简单的网络结构。Transformer,它只基于注意力机制。它完全不用卷积网络和循环神经网络。在两个机器翻译的任务里显示出这些模型在结果上更优,同时它的并行化程度更高,需要的训练时间显著减少。我们的模型在WMT 2014 英语-德语的翻译任务重BLEU成绩达到了28.4。它超越了当时最佳的模型BLEU结果2分,其中也包括聚合模型,在WMT 2014 英语-法语的翻译任务中,我们用8个GPU,训练了3.5天,用单一模型就达到了最佳成绩,BLEU得分41.8。这个训练时间只是当时文献记载最好模型的一小部分。我们也展示了Transformer基于英语成分句法分析,成功的将其应用到其他任务中,不论数据集大或者小。

简介

在序列模型和类似语言模型和语言翻译这样的转换问题中,循环神经网络,包括LSTM,GRU等已经牢牢的占据着最领先的地位。很多努力都是在推进RNN模型和Encoder,Decoder架构的极限。

RNN模型通常计算时会考虑输入和输出元素的位置。在计算的每一步里都会对齐输入输出的位置,他们会通过之前的隐藏状态h_{t-1}和当前时刻的输入t,生成一个隐藏状态的h_{t}序列。这种内在的序列特性就让它不能在训练时进行并行化。当序列更长时这个问题尤为突出,因为内存限制了batch的大小。最近的一些因子分解的技巧和条件计算的工作让RNN在计算效率方面取得了重大的进展,但是顺序计算的本质没有改变。
Attension机制已经成为现在一些著名的序列模型和转换模型里在各种任务中不可或缺的一部分。它使得可以对序列里的依赖建模,而不考虑他们在input和output里的距离。除了少数情况,这种attension机制都和RNN一起使用。
在这篇论文里,我们提出Transformor模型,我们避免使用RNN,取而代之的是完全依赖一种Attention机制去构建一个全局的输入和输出之间的依赖关系。这个Transformer模型显著的提升了并行化程度,并且在8个P100 GPU下训练12个小时后,在翻译质量上达到了新的高度。

2 背景

同样为了减少顺序计算也是我们这个模型的初衷:Extended Neural GPU,ByteNet和ConvS2S。他们都是用卷积神经网络作为构建的基本块,这样就可以为输入输出位置并行的计算隐藏表示。在这些模型中,关联任意输入和输出位置信号的操作所需要的操作次数都是随着信号之间的距离增加而增加。ConvS2S是线性的,ByteNet是对数增加。这使得学习较远距离的依赖关系变得困难。在Transformer里,这个计算变成了一个常数,尽管由于对Attention权重化的位置取平均降低了模型的有效性,但是通过多头机制又得到了补偿。

Self-attention,也叫做intra-attention,是一种把单个序列不同位置关联起来得到这个序列的表征。Self-attention已经成功用到了各种任务,包括阅读理解,摘要概括,文本蕴含和学习与任务无关的句子的表征。

端到端的基于循环Attention的记忆网络已经取代基于序列对齐的循环网络,在简单语言问答和语言模型的任务中,取得了更好的成绩。

据我们所知,Transformer模型是第一个完全依赖于自注意力模型去计算它输入和输出的表征,而不依赖序列对齐的RNN或者卷积。在下边的章节里,我们将会描述Transformer模型,引出self-attention,并讨论它的优点。

3 模型结构

大部分的神经网络转换模型都是一个encoder-decoder结构,编码器将一个输入的符号表示序列\left ( x_1,...x_n \right )转化为一个连续的表征Z=\left ( z_1,...z_n \right ),有了Z,然后解码器一次生成一个的输出一个序列\left ( y_1,...y_m \right ) 在每一步,模型都是自回归的,它会消费前边生成的符号,把它作为输入来生成下一个符号。

Transformer遵循这种整体架构,在编码和解码器它都采用自注意层和每个元素级别的全连接层堆叠在一起。如上图所示。

3.1 编码器和解码器堆栈

编码器
编码器由6个完全相同的层构成,每个层有两个子层。第一个子层是一个多头自注意机制层,第二个子层是一个简单的元素级别的全连接层。在每个子层里我们再用一个残差连接,后边接一个layer normalization。也就是说每一个子层的输出都是 LayerNorm(x+Sublayer(x)),SubLayer(x)就是每个子层自己的实现。为了方便残差层的连接,所有的子层,包括嵌入层,输出的维度都是dmodel=512.

解码器
解码器也是由N=6个同样的层堆叠而成。和encoder层的两个子层不一样的是,decoder每个层里加入了第三个子层,它的作用是在encoder的堆栈的输出上做多头注意力。和encoder类似,我们在每一个子层上做残差连接。然后再做layer normalization。再解码器的堆叠上,我们同时也修改了自注意力子层来防止注意到当前输入后边的位置。这个遮掩,结合了这样的事实,输出的词嵌入总是错一个位置,保证了在对位置i进行预测的时候只能依赖已经知道的小于i的输出。

3.2 Attension

一个注意力方程可以被描述成将一个query,和一组key-value对映射到一个output。这里的query,keys,values,output都是vector。output是value值的加权和,对于每个value的权重是有一个query与对应的key的匹配函数来决定的。

3.2.1 缩放的点积注意力

我们把我们的特殊的注意力机制叫做“缩放的点积注意力”。输入由维度同为d_k的querys和keys,以及维度为d_v的values构成。我们把每一个query和所有的keys计算点积,然后对每个结果都除以\sqrt{d_k},最后应用softmax去获得应用在values上的weight。(对于一个词来说,用它的query和序列里其他的词的key去点积除以\sqrt{d_k},就得到和序列长度相等的一个数组,对数据里的值用softmax后的值作为序列里每个词的weight,乘以序列里每个词的value,则为当前位置的输出的value)

实际上,我们会同时计算一组query的注意力方程的值,我们把所有的query放到一个矩阵Q里,同时所有的key和value也有打包到K和V矩阵里。我们向如下这样计算方程的输出:

Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_k}})V

两个最常见的注意力函数是加法attention和点积(乘法)attention。我们用的就是点积attention,唯一不同的是我们除了一个\sqrt{d_k}。加法attention用一个只有一个隐藏层的前馈神经网络来计算Q和K的兼容性。两个函数的理论复杂度相似,点积注意力模型更快,并且更省空间,应为它可以通过高度优化的矩阵乘法代码来实现。

d_k值比较小的时候,这两种机制的性能相似。当d_k值较大的时候,加法attention比点积attention的性能好,我们怀疑,因为维度的增加,点积值大幅增加,将softmax的值推向了梯度很小的区域。为了抵消这种影响,我们给点积结果除以d_k

3.2.2 多头注意力

图二(上)缩放版的点积attention,(下)多头attention,多个并行运行的attention构成。

与只利用单个维度为d_model-dimension的key,value和query来做一个注意力函数,我们发现可以通过将queries,keys和values进行h次的线性映射到d_k,d_k,d_v维度效果更好。在每一个映射中的query,key和value,我们都是并行进行的。产生一个d_v维度的输出向量。再把这些输出连接到一起,再次映射,得到最后的value。如图二所示。

多头的attention机制让不同的attention注意到不同位置的不同表示子空间。如果只有一个头,它们的均值会削弱这个信息。
MultiHead(Q,K,V) = Concat(head_1,...,head_h)W^O
where head_i = Attention(Q{W_i}^Q,K{W_i}^K,V{W_i}^V)
这些映射都是通过一些参数矩阵完成的,{W_i}^Q\in \mathbb{R}^{d_{model}*d_k},{W_i}^K\in \mathbb{R}^{d_{model}*d_k},{W_i}^V\in \mathbb{R}^{d_{model}*d_k},W^O\in \mathbb{R}^{hd_{v}*d_{model}}

我们用了h=8个并行的attention层,或者说是head。每一个的维度d_k=d_v=d_model/h=64,因为我们降低了每个head的维度,所以总体的计算代价和对所有维度只用单一attention的计算量类似。

3.2.3 Attenstion在我们模型中的应用

Transformer中使用多头注意力有3种不同的用法:

  • 在“编码器-解码器 attention”层,query来自解码器上边的层,而key和value来自encoder的输出。这让解码器的每一个位置都可以注意到输入序列里的每一个位置。这也是有些sequence-to-sequence模型里标准的编码器-解码器注意力机制。
  • 编码器层包含了self-attention层。在一个只注意层,所有的keys,values和queries都来自同一个地方。也就是encoder上一层的输出。encoder的每一个位置都可以注意到encoder上一层的所有位置。
  • 类似的,self-attention层在解码层也允许解码器的每个位置注意到解码器的开始位置直到当前位置的值。我们需要阻止解码器中的左向信息流来保证解码器的自回归性。我们是在缩放的点积 attention那里实现的。通过把不能看到的位置在softmax里设置为-∞来屏蔽。如图二所示

Position-Wise 前向网络

除了attention子层外,编码器和解码器的每一个层都包含一个全连接的前馈网络。它是对每一个位置独立进行的。它包含两个线性转化,中间有一个ReLU。
 FFN(x)=max(0,xW_1+b_1)W_2+b_2

因为线性转化在不同的位置之间是相同的,层和层之间的参数是不同的。也可以说这是一个kernel size 为1的两个卷积。输出和输出的维数都是d_model=512,中间层的维度为d_{ff}=2048

Enbeddings 和 Softmax

和其他的序列转化模型一样,我们用已经学好的embedding来对输入和输出的词符转化为维度为d_{model}的向量。我们也用普通的线性变化和softmax函数把decoder的输出转化为下一个词的概率。在我们的模型里,在两个嵌入层和pre-softmax的线性变换层我们使用同样的权重矩阵。在embedding层,我们给每个权重乘以\sqrt{d_{model}}

位置编码

因为我们的模型没有包含RNN也没有CNN,为了让模型可以用到序列的顺序信息。我们必须加入些信息来表示词符在序列的相对或者绝对位置信息。为了这个目的,我们在encoder和decoder堆栈底层对embeddings的输入加上了位置编码。位置编码和embedding一样,维度都是d_{model}.所以两个可以进行相加。对于位置编码有很多可能的形式,比如固定的,或者学得的。

在我们的模型里,我们用不同频率的sine和cosine函数:
PE(pos,2i)=sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})
PE(pos,2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})

其中pos是位置,i是维度,也就是说位置编码每个维度对应于一个正弦曲线。这些波长形成一个几何级数,从2π到1000*2π。 我们选择这个函数是因为我们假设它允许模型很容易学习对相对位置的关注,因为对任意确定的偏移k,PE_{pos+k}可以表示为PE_{pos}的线性函数。

我们还对比了其他的位置嵌入方法,得到的结果差不多,我们这里选择正弦曲线,因为它可以允许模型推断比训练期间更长的序列。。

为什么选择 Self-Attention

这一节,我们从多个方面比较自注意层和RNN,CNN的区别。RNN,CNN通常被用来映射一个符号表征向量的变长序列\left ( x_1,...,x_n\right )到另一个等长的序列\left ( z_1,...,z_n\right )其中,x,z都是维度的d的向量,比如在一个典型的序列转化模型中的编码器或者解码器中的一个隐藏层。我们用自注意力模型,主要是考虑了如下三个方面:
一个是每层中计算的复杂度,二是可以被并行计算的量,以最小需要顺序执行的量来衡量。
第三个是网络中长距离依赖的路径长度。在很多序列转化问题中,学习长距离依赖是一个关键的问题。一个主要的影响这种学习依赖能力的因素是前向或者后向传导时需要在网络中经过的距离。输入和输出序列中任意位置组合之间这些路径越短,学习远距离依赖就越容易。因此我们比较了不同类型的网络中任意两个输入和输出位置之间最大路径长度:

表1:最大路径长度,层的复杂度和不同层类型最小的序列操作数。n是序列长度。d是表征的维度。k是卷积核的个数,r是self-attention中邻域的大小。

图层类型 每层复杂度 顺序操作 最大路径长度
Self-Attention O(n^2d) O(1) O(1)
循环 O(nd^2) O(n) O(n)
卷积 O(knd^2) O(1) O(log_k(n))
Self-Attention(受限) O(rnd) O(1) O(n/r)

如表一所示,一个自注意力层对所有位置的顺序计算都是固定数目的。而一个RNN需要O(N)的顺序计算。对于计算的复杂度,当序列顺序n比表示层的维度d小的时候,self-Attention层的计算比rnn快,这也是最常见的情况。目前最有效的模型使用的句子表征方法,比如word-piece和byte-pair表征法。为了改进引入非常长的序列的计算性能,self-attention可以通过限制在以输出位置为中心的输入序列中考虑的邻域r。 这会将最大路径长度增加到O(n ∕ r)。 我们计划在未来的工作中进一步调查这种方法。

单一的kernel宽度 k < n 的情况下,并不会连接所有的输入,输出对。如果想要连接所有输入,输出对,对于contiguous kernel,需要O(n/k)层的堆叠。对于dilated 卷积,需要O(log_k(n))的堆叠。它们增加了连接任意两个位置之间的网络路径。卷积层通常比RNN更昂贵k倍。Separable 卷积可以降低计算的复杂度到O(knd+nd^2)。即使k=n,separable 卷积的复杂度也等同于self-attention层和point-wise前向网络的组合,即我们的模型采用的方法。

另一个好处是,self-attention可以产生出更具有解释性的模型,我们从我们的模型中研究注意力的分布。每个attention head不仅清楚地学习到执行不同的任务,许多似乎展现与句子的句法和语义结构的行为。

5 训练

这一部分我们介绍我们模型的训练方法。

5.1 训练数据和Batching

我们在标准的WMT2014 英语-德语 数据集(包含450万的句子对),句子是通过byte-pair来编码的。它有一个共享的37000个符号的source-target词汇表。 对于英语-法语翻译,我们使用大得多的WMT 2014英法数据集,它包含3600万个句子,并将词符分成32000个word-piece词汇表。 序列长度相近的句子一起进行批处理。 每个训练批次的句子对包含大约25000个源词符和25000个目标词符。

5.2 硬件和时间

我们在一台具有8个NVIDIA P100 GPU的机器上训练我们的模型。 使用本文描述的超参数的基础模型,每个训练步骤耗时约0.4秒。 我们的基础模型共训练了10万步或12小时。对于我们的大模型,每步运行1秒,大模型训练了30万步(3.5天)。

5.3 优化器

我们使用Adam 优化器,\beta_1=0.9,\beta_2=0.98,\epsilon=10^{-9}。我们根据如下的公式在训练过程中改变学习率。
lrate=d_{model}^{-0.5}\cdot min(step\_num^{-0.5},step\_num\cdot warmup\_steps^{-1.5} )
这对应于在第一次warmup_steps 步骤中线性地增加学习速率,并且随后将其与步骤数的平方根成比例地减小。 我们使用warmup_steps = 4000。

5.4 正则化

在训练过程中,我们用了3中不同类型的正则化:

残差丢弃 我们将丢弃应用到每个子层的输出,在将它与子层的输入相加和规范化之前。 此外,在编码器和解码器堆栈中,我们将丢弃应用到嵌入和位置编码的和。 对于基本模型,我们使用p_{drop}=0.1
Label Smoothing 在训练中,我们用了label smoothing,\epsilon _{ls}=0.1这让模型不易理解,因为模型学得更加不确定,但提高了准确性和BLEU得分。

6 结果

6.1 机器翻译

在WMT 2014英语-德语翻译任务中,大型transformer模型(表2中的Transformer (big))比以前报道的最佳模型(包括整合模型)高出2.0 个BLEU以上,确立了一个全新的最高BLEU分数为28.4。 该模型的配置列在表3的底部。 训练在8 个P100 GPU上花费3.5 天。 即使我们的基础模型也超过了以前发布的所有模型和整合模型,且训练成本只是这些模型的一小部分。

在WMT 2014英语-法语翻译任务中,我们的大型模型的BLEU得分为41.0,超过了之前发布的所有单一模型,训练成本低于先前最先进模型的1 ∕ 4 。 英语-法语的Transformer (big) 模型使用丢弃率为P_{drop} = 0.1,而不是0.3。

对于基础模型,我们使用的单个模型来自最后5个检查点的平均值,这些检查点每10分钟写一次。 对于大型模型,我们对最后20个检查点进行了平均。 我们使用beam search,beam大小为4 ,长度惩罚α = 0.6。 这些超参数是在开发集上进行实验后选定的。 在推断时,我们设置最大输出长度为输入长度+50,但在可能时尽早终止。

表2总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型体系结构进行了比较。 我们通过将训练时间、所使用的GPU的数量以及每个GPU的持续单精度浮点能力的估计相乘来估计用于训练模型的浮点运算的数量。

6.2 模型的变体

为了评估Transformer不同组件的重要性,我们以不同的方式改变我们的基础模型,测量开发集newstest2013上英文-德文翻译的性能变化。 我们使用前一节所述的beam搜索,但没有平均检查点。 我们在表中列出这些结果 .

在表3的行(A)中,我们改变attention head的数量和attention key和value的维度,保持计算量不变,如3.2.2节所述。 虽然只有一个head attention比最佳设置差0.9 BLEU,但质量也随着head太多而下降。

在表3行(B)中,我们观察到减小key的大小dk会有损模型质量。 这表明确定兼容性并不容易,并且比点积更复杂的兼容性函数可能更有用。 我们在行(C)和(D)中进一步观察到,如预期的那样,更大的模型更好,并且丢弃对避免过度拟合非常有帮助。 在行(E)中,我们用学习到的位置嵌入来替换我们的正弦位置编码,并观察到与基本模型几乎相同的结果。

英文成分句法分析

为了检验Transformer是否可以适用于其他任务,我们在英文成分句法分析上做了实验。这项任务提出特别的挑战:输出受到很强的结构性约束,并且比输入要长很多。 此外,RNN序列到序列模型还没有能够在小数据中获得最好的结果。

我们用d_{model} = 1024 在Penn Treebank的Wall Street Journal(WSJ)部分训练了一个4层transformer,约40K个训练句子。 我们还使用更大的高置信度和BerkleyParser语料库,在半监督环境中对其进行了训练,大约17M个句子。 我们使用了一个16K词符的词汇表作为WSJ唯一设置,和一个32K词符的词汇表用于半监督设置。

我们做了少量的实验去选择dropout,attention和残差,学习率和Section 22 开发集上的 beam size。 其他参数都同English-German的翻译模型一样,在推断过程中,我们将最大输出长度增加到输入长度+300。 对于WSJ和半监督设置,我们都使用beam大小21 和α = 0.3 。

表4中我们的结果表明,尽管缺少特定任务的调优,我们的模型表现得非常好,得到的结果比之前报告的除循环神经网络语法之外的所有模型都好。

与RNN序列到序列模型相比,即使仅在WSJ训练40K句子组训练时,Transformer也胜过BerkeleyParser。

结论

在这项工作中,我们提出了Transformer,第一个完全基于关注的序列转导模型,用multi-headed self-attention取代了编码器-解码器架构中最常用的循环层。

对于翻译任务,Transformer可以比基于循环或卷积层的体系结构训练更快。 在WMT 2014英语-德语和WMT 2014英语-法语翻译任务中,我们取得了最好的结果。 在前面的任务中,我们最好的模型甚至胜过以前报道过的所有整合模型。

我们对基于attention的模型的未来感到兴奋,并计划将它们应用于其他任务。 我们计划将Transformer扩展到除文本之外的涉及输入和输出模式的问题,并调查局部的、受限attention机制以有效处理大型输入和输出,如图像、音频和视频。 让生成具有更少的顺序性是我们的另一个研究目标。

我们用于训练和评估模型的代码可以在https://github.com/tensorflow/tensor2tensor上找到。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: