主要的序列转导模型基于复杂的递归或卷积神经网络,其中包括一个编码器和一个解码器。
表现最好的模型还通过注意机制连接编码器和解码器。
我们提出了一种新的简单网络结构:Transformer,完全基于注意机制,避免了重复和卷积。
在两个机器翻译任务上的实验表明,这些模型具有更高的质量,同时具有更强的并行性和更少的训练时间。
我们的模型在 WMT 2014 英德翻译任务中达到 28.4 BLEU ,比现有的最佳结果(包括集成)提高了 2 BLEU 以上。
在 WMT 2014 英法翻译任务中,我们的模型在 8 个 GPU 上训练 3.5 天后,建立了一个新的单模型最先进的 BLEU 分数为 41.8 ,这只是文献中最好模型训练成本的一小部分。
我们表明,通过成功地将其应用于具有大量和有限训练数据的英语选区解析,该转换器可以很好地推广到其他任务。
递归神经网络,特别是长短期记忆(《Long short-term memory》)和门选递归(《Empirical evaluation of gated recurrent neural networks on sequence modeling》)神经网络,已经作为序列建模和转导问题(如语言建模和机器翻译)的最先进的方法而被坚定地建立起来(《Outrageously large neural networks: The sparsely-gated mixture-of-experts layer》,《Neural machine translation by jointly learning to align and translate》,《Learning phrase representations using rnn encoder-decoder for statistical machine translation》)。
自那以后,许多努力不断地推动循环语言模型和编码器-解码器体系结构的边界(《Google s neural machine translation system: Bridging the gap between human and machine translation》,《Effective approaches to attentionbased neural machine translation》,《Exploring the limits of language modeling》)。
递归模型通常沿着输入和输出序列的符号位置进行因子计算。
将位置与计算时间中的步骤对齐,它们生成一系列隐藏状态 h t h_t ht ,作为前一个隐藏状态 h t − 1 h_{t-1} ht−1 和位置 t t t 的输入的函数。
这种固有的顺序性排除了训练示例中的并行化,当序列长度变长时,并行化就变得至关重要,因为内存约束限制了示例之间的批处理。
最近的工作通过分解技巧(《Factorization tricks for LSTM networks》)和条件计算(《Outrageously large neural networks: The sparsely-gated mixture-of-experts layer》)在计算效率上取得了显著的改进,同时也提高了后者的模型性能。
然而,顺序计算的基本约束仍然存在。
注意机制已经成为各种任务中强制序列建模和转导模型的重要组成部分,允许不考虑其在输入或输出序列中的距离的相关性建模(《Neural machine translation by jointly learning to align and translate》,《Structured attention networks》)。
然而,在(《A decomposable attention model》)之外的所有案例中,这种注意机制都与循环网络结合使用。
在这项工作中,我们提出了 Transformer ,一个避免递归的模型体系结构,而完全依赖于一个注意机制来绘制输入和输出之间的全局依赖关系。
Transformer 允许更多的并行化,并且在 8 个 P100 GPU 上经过 12 个小时的训练后,翻译质量达到了一个新的水平。
减少顺序计算的目标也构成了 Extended Neural GPU (《Can active memory replace attention》)、 ByteNet (《Neural machine translation in linear time》)和 ConvS2S (《Convolutional sequence to sequence learning》)的基础,它们都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。
在这些模型中,从两个任意输入或输出位置关联信号所需的操作数随着位置之间的距离增加而增加, ConvS2S 为线性, ByteNet 为对数。
这使得学习远距离位置(《Gradient flow in recurrent nets: the difficulty of learning long-term dependencies》)之间的依赖关系变得更加困难。
在 Transformer 中,这种情况被减少为一个恒定的操作数,尽管代价是由于平均注意力加权位置而降低了有效分辨率,正如第 3.2 节所述,我们用多头注意力抵消了这种影响。
自我注意,有时也称为内注意,是一种将单个序列的不同位置联系起来的注意机制,目的是为了计算序列的表示法。
自我注意已经成功地应用于阅读理解、抽象摘要、文本蕴涵和学习任务无关的句子表征等多种任务中(《Long short-term memory-networks for machine reading》,《A decomposable attention model》,《A deep reinforced model for abstractive summarization》,《A structured self-attentive sentence embedding》)。
端到端记忆网络是基于一种经常性的注意机制,而不是序列排列的经常性,并已被证明在简单语言问答和语言建模任务(《End-to-end memory networks》)上表现良好。
然而,据我们所知, Transformer 是第一个完全依靠自我注意来计算输入和输出表示的转导模型,而不使用序列对齐的 RNN 或卷积。
在下面的章节中,我们将描述 Transformer ,激发自我注意,并讨论它相对于(《Neural GPUs learn algorithms》,《Neural machine translation in linear time》)和(《Convolutional sequence to sequence learning》)等模型的优势。
大多数具有竞争力的神经序列转换模型都具有编码器-解码器结构(《Learning phrase representations using rnn encoder-decoder for statistical machine translation》,《Neural machine translation by jointly learning to align and translate》,《Sequence to sequence learning with neural networks》)。
这里,编码器映射一个符号表示的输入序列 ( x 1 , . . . , x n ) (x_1,...,x_n) (x1,...,xn) 到连续表示的序列 z = ( z 1 , . . . , z n ) \mathbf{z} = (z_1,...,z_n) z=(z1,...,zn) 。
给定 z \mathbf{z} z ,解码器然后生成一个输出序列 ( y 1 , . . . , y m ) (y_1,...,y_m) (y1,...,ym) 一次一个元素的符号。
在每个步骤中,模型都是自回归的(《Generating sequences with recurrent neural networks》),在生成下一个步骤时,使用之前生成的符号作为额外的输入。
Transformer 遵循这种总体架构,使用了编码器和解码器的堆叠自注意层和点向全连接层,分别如图 1 的左、右两部分所示。
编码器:
编码器由 N = 6 N = 6 N=6 个相同的层组成,每一层有两个子层。
第一种是多头自我注意机制,第二种是一个简单的、位置上全连接的前馈网络。
我们在两个子层周围使用一个残差连接(《Deep residual learning for image recognition》),然后进行层规范化(《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)) ,其中 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 的输出。
解码器:
解码器也由 N = 6 N = 6 N=6 个相同的层组成。
除了在每个编码器层的两个子层之外,解码器插入第三个子层,它对编码器堆栈的输出执行多头注意。
与编码器类似,我们在每个子层周围使用残差连接,然后进行层标准化。
我们还修改了译码器堆栈中的自我注意子层,以防止注意的位置影响到后续位置。
这种屏蔽,结合输出嵌入偏移一个位置的事实,确保位置 i i i 的预测只能依赖于小于 i i i 位置的已知输出。
注意函数可以被描述为将一个查询和一组键值对映射到一个输出,其中查询、键、值和输出都是向量。
输出计算为值的加权和,其中分配给每个值的权重由查询的兼容函数和相应的键计算。
我们将我们的特别注意称为 “比例点积注意” (图 2 )。
输入由维 d k d_k dk 的查询和键,维 d v d_v dv 的值组成。我们用所有键计算查询的点积,每一个键除以 d k \sqrt{d_k} dk ,并应用 softmax 函数来获得值的权重。
在实践中,我们同时计算一组查询的注意函数,并将其打包成一个矩阵 Q Q Q 。
键和值也被打包成矩阵 K K K 和 V V V 。
我们将输出矩阵计算为:
两种最常用的注意功能是加性注意(《Neural machine translation by jointly learning to align and translate》)和点积(乘法)注意。
点积注意与我们的算法是相同的,除了比例因子 1 d k \frac {1}{\sqrt{d_k}} dk1 。
加法注意使用一个带有单一隐含层的前馈网络来计算兼容性函数。
虽然这两种方法在理论复杂度上相似,但点积方法在实践中速度更快,空间效率更高,因为它可以使用高度优化的矩阵乘法代码实现。
当 d k d_k dk 值较小时,两种机制的注意表现相似,但当 d k d_k dk (《Massive exploration of neural machine translation architectures》)值较大时,加法注意优于没有标度的点积注意。
我们猜想,当 d k d_k dk 的值较大时,点积的大小变大,将 softmax 函数推入了梯度极小的区域。(为了说明为什么点积变大,假设 q q q 和 k k k 的分量是独立的随机变量,均值为 0 0 0 ,方差为 1 1 1 。然后它们的点积 q ⋅ k = ∑ i = 1 d k q i k i q \cdot k=\sum_{i=1}^{d_k} q_ik_i q⋅k=∑i=1dkqiki ,均值为 0 0 0 ,方差为 d k d_k dk 。)
为了抵消这种影响,我们将点积乘以 1 d k \frac {1}{\sqrt{d_k}} dk1 。
不同于使用 d m o d e l d_{model} dmodel 维度的键、值和查询来执行单一的注意功能,我们发现将查询、键和值用不同的线性投影 h h h 次是有益的,学习了对 d k d_k dk 、 d k d_k dk 和 d v d_v dv 维数的线性投影。
在每个查询、键和值的投影版本上,我们然后并行执行注意函数,生成 d v d_v dv 维输出值。
将它们连接起来并再次投影,得到最终的值,如图 2 所示。
多头注意允许模型共同注意来自不同位置的不同表示子空间的信息。用一个单一的注意头,平均抑制这个:
投影是参数矩阵 W i Q ∈ R d m o d e l × d k W_i^Q \in \mathbb{R}^{d_{model} \times d_k} WiQ∈Rdmodel×dk , W i K ∈ R d m o d e l × d k W_i^K \in \mathbb{R}^{d_{model} \times d_k} WiK∈Rdmodel×dk , W i V ∈ R d m o d e l × d v W_i^V \in \mathbb{R}^{d_{model} \times d_v} WiV∈Rdmodel×dv , W O ∈ R h d v × d m o d e l W^O \in \mathbb{R}^{hd_v \times d_{model}} WO∈Rhdv×dmodel 。
在这项工作中,我们使用了 h = 8 h = 8 h=8 个平行注意层,或称头部。对于每一个,我们使用 d k = d v = d m o d e l / h = 64 d_k=d_v=d_{model}/h=64 dk=dv=dmodel/h=64 。
由于每个头的降维,总计算成本与全维的单头关注近似。
Transformer 以三种不同的方式使用多头注意力:
∙ \bullet ∙ 在“编码器-解码器关注”层中,查询来自前一个解码器层,记忆键和值来自编码器的输出。
这允许译码器中的每个位置参加输入序列中的所有位置。
这模仿了序列对序列模型(如《Google s neural machine translation system: Bridging the gap between human and machine translation》,《Neural machine translation by jointly learning to align and translate》,《Convolutional sequence to sequence learning》)中典型的编码器-解码器注意机制。
∙ \bullet ∙ 编码器包含自我注意层。
在自我注意层中,所有的键、值和查询都来自同一个地方,在本例中是编码器上一层的输出。
编码器中的每个位置都可以处理编码器上一层中的所有位置。
∙ \bullet ∙ 同样,解码器中的自我注意层允许解码器中的每个位置关注到解码器中的所有位置,直到并包括该位置。
为了保持解码器的自回归特性,我们需要防止信息在解码器中向左流动。
通过屏蔽(设置为 − ∞ -\infty −∞ ) softmax 输入中与非法连接对应的所有值,我们在比例点积注意内部实现了这一点。参见图 2 。
除了注意子层,我们的编码器和解码器的每一层都包含一个完全连接的前馈网络,它分别和相同地应用于每个位置。
这包括两个线性转换,中间有一个 ReLU 激活。
虽然不同位置的线性变换是相同的,但它们在层与层之间使用不同的参数。
另一种描述方法是两个卷积,核大小为 1 1 1 。输入输出的维度为 d m o d e l = 512 d_{model} = 512 dmodel=512 ,内层的维度为 d f f = 2048 d_{ff} = 2048 dff=2048 。
类似于其他序列转换模型,我们使用学习嵌入将输入标记和输出标记转换为维度 d m o d e l d_{model} dmodel 的向量。
我们还使用常用的学习线性变换和 softmax 函数将解码器输出转换为预测的下一个令牌概率。
在我们的模型中,我们在两个嵌入层之间共享相同的权矩阵和 pre-softmax 线性变换,类似于(《Using the output embedding to improve language models》)。
在嵌入层中,我们将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel 。
由于我们的模型不包含递归和卷积,为了让模型利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。
为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了 “位置编码” 。
位置编码具有与嵌入相同的维数 d m o d e l d_{model} dmodel ,因此两者可以相加。
位置编码有多种选择,既有学习过的,也有固定的(《Convolutional sequence to sequence learning》)。
在这项工作中,我们使用不同频率的正弦和余弦函数:
p o s pos pos 是位置, i i i 是维数。
也就是说,位置编码的每个维度对应一个正弦信号。
这些波长形成了从 2 π 2π 2π 到 10000 ⋅ 2 π 10000·2π 10000⋅2π 的几何级数。
我们选择这个函数是因为我们假设它可以让模型很容易学会通过相对位置参加,因为对于任何固定偏移量 k k k , P E p o s + k PE_{pos+k} PEpos+k 可以表示为 P E p o s PE_{pos} PEpos 的线性函数。
我们也尝试使用学习过的位置嵌入(《Convolutional sequence to sequence learning》),并发现两个版本产生了几乎相同的结果。
我们选择正弦版本是因为它可以让模型推断出比训练过程中遇到的序列长度更长的序列。
在本节中,我们将自我注意层与通常用于映射一个可变长度符号表示序列 ( x 1 , . . . , x n ) (x_1,...,x_n) (x1,...,xn) 的循环层和卷积层进行比较。转换为另一个等长序列 ( z 1 , . . . , z n ) (z_1,...,z_n) (z1,...,zn) ,且 x i , z i ∈ R d x_i,z_i \in \mathbb{R}^d xi,zi∈Rd ,例如在一个典型的序列转换编码器或解码器中的一个隐藏层。
促使我们使用自我关注的原因,我们认为有三个需求。
一个是每层的总计算复杂度。
另一个是可以并行处理的计算量,可以通过所需的最小顺序操作数来衡量。
第三个是网络中远程依赖关系之间的路径长度。
在许多序列转换任务中,学习长期依赖关系是一个关键的挑战。
影响学习这种依赖关系能力的一个关键因素是网络中向前和向后信号必须遍历的路径长度。
输入和输出序列中任意位置组合之间的路径越短,就越容易了解长期依赖关系(《Gradient flow in recurrent nets: the difficulty of learning long-term dependencies》)。
因此,我们也比较了在由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。
如表 1 所示,自我注意层用固定数量的顺序执行操作连接所有位置,而循环层需要 O ( n ) O(n) O(n)个顺序操作。
在计算复杂性方面,自我注意层速度比周期性层当序列长度 n n n 小于表示维数 d d d ,这是最常使用的情况下与句子表示最先进的机器翻译模型,如 word-piece (《Google s neural machine translation system: Bridging the gap between human and machine translation》)和 byte-pair (《Neural machine translation of rare words with subword units》)表示。
为了提高涉及非常长的序列的任务的计算性能,自注意可以被限制为只考虑以各自输出位置为中心的输入序列中大小为 r r r 的邻域。
这将把最大路径长度增加到 O ( n / r ) O(n/r) O(n/r) 。我们计划在未来的工作中进一步研究这种方法。
单个卷积层的核宽度为 k < n k
这样做在相邻核的情况下需要 O ( n / k ) O(n/k) O(n/k) 个卷积层的堆栈,或者在扩展卷积(《Neural machine translation in linear time》)的情况下需要 O ( l o g k ( n ) ) O(log_k(n)) O(logk(n))个卷积层,增加网络中任意两个位置之间的最长路径的长度。
卷积层通常比递归层昂贵 k k k 倍。
然而,可分离卷积(《Xception: Deep learning with depthwise separable convolutions》)将复杂度大大降低到 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) O(k·n·d + n·d^2) O(k⋅n⋅d+n⋅d2) 。
然而,即使 k = n k = n k=n ,可分离卷积的复杂性也等于自我注意层和点向前馈层的组合,这是我们在模型中采用的方法。
作为附带的好处,自我关注可以产生更多可解释的模型。
独立的注意力头不仅清楚地学习执行不同的任务,许多似乎表现出与句子的句法和语义结构相关的行为。
本节描述我们的模型的训练机制。
我们使用标准的 WMT 2014 英语-德语数据集进行训练,该数据集包含约 450 万个句子对。
句子使用字节对编码(《Massive exploration of neural machine translation architectures》)进行编码,该编码有大约 37000 个标记的共享源-目标词汇表。
对于英语-法语,我们使用了更大的 WMT 2014 英语-法语数据集,该数据集包含 3600 万个句子,并将标记拆分为 32000 词块词汇(《Google s neural machine translation system: Bridging the gap between human and machine translation》)。
根据近似序列长度对句子对进行批处理。
每个训练批包含一组包含大约 25000 个源标记和 25000 个目标标记的句子对。
我们在一台拥有 8 个 NVIDIA P100 GPU 的机器上训练我们的模型。
对于使用本文中描述的超参数的基本模型,每个训练步骤大约需要 0.4 秒。
我们一共训练了基础模型 10 万步, 12 个小时。
对于我们的大型模型,步进时间是 1.0 秒。
大型模特接受了 30 万步( 3.5 天)的训练。
我们使用了 Adam 优化器(《Adam: A method for stochastic optimization》, β 1 = 0.9 β_1 = 0.9 β1=0.9 , β 2 = 0.98 β_2 = 0.98 β2=0.98 , ϵ = 1 0 − 9 \epsilon = 10^{-9} ϵ=10−9 。
根据这个公式,我们在整个训练过程中改变了学习速度:
这对应于在第一个 w a r m u p _ s t e p s warmup\_steps warmup_steps 训练步骤中线性增加学习速率,然后按步数的平方根的反比比例减少它。
我们使用的是 w a r m u p _ s t e p s = 4000 warmup\_steps = 4000 warmup_steps=4000 。
我们在训练中采用以下几种正则化方法:
残差丢弃:
我们将 dropout (《Dropout: a simple way to prevent neural networks from overfitting》)应用到每个子层的输出,然后将其添加到子层的输入并归一化。
此外,我们对编码器和解码器堆栈中的嵌入和位置编码的总和应用 dropout 。
对于基本模型,我们使用 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1 的比率。
标签平滑:
在训练过程中,我们采用了值 ϵ l s = 0.1 \epsilon_{ls} = 0.1 ϵls=0.1 (《Rethinking the inception architecture for computer vision》)的标签平滑。
这对复杂性造成了伤害,因为模型学会了更不确定,但提高了准确性和 BLEU 分数。
在 WMT 2014 英德翻译任务中,大型 transformer 模型(表 2 中的 Transformer (big) )比之前报道的最好的模型(包括 ensembles )高出 2.0 BLEU 以上,建立了一个新的最先进的 28.4 BLEU 得分。
表 3 的最后一行列出了该模型的配置。在 8 个 NVIDIA P100 GPU 的机器上训练 3.5 天。
甚至我们的基础模型也超过了所有以前发布的模型和集成,而训练成本只是任何竞争性模型的一小部分。
在 WMT 2014 英法翻译任务中,我们的大模型达到了 41.0 的 BLEU 分数,优于之前发布的所有单个模型,培训成本低于之前最先进模型的 1/4 。
为英语-法语训练的 Transformer (big) 模型使用的 dropout 比例 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1 ,而不是 0.3 0.3 0.3 。
对于基础模型,我们使用一个通过平均最近 5 个检查点(每 10 分钟编写一次)获得的模型。
对于大型模型,我们平均了最后 20 个检查点。
我们使用波束搜索,波束大小为 4 ,长度惩罚 α = 0.6 \alpha = 0.6 α=0.6 (《Google s neural machine translation system: Bridging the gap between human and machine translation》)。
这些超参数是在开发集上进行实验后选择的。
我们将推断期间的最大输出长度设置为输入长度 + 50 ,但在可能的情况下提前终止。
表 2 总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。
我们通过乘以训练时间、使用的 GPU 数量和每个 GPU 持续的单精度浮点容量来估计用于训练模型的浮点操作的数量。
为了评估 Transformer 不同组件的重要性,我们以不同的方式改变了我们的基础模型,在 newstest2013 开发集上测量了英语到德语翻译的性能变化。
我们使用了前一节中描述的束搜索,但没有使用检查点平均。
我们在表 3 中给出了这些结果。
在表 3(A) 中,我们在保持计算量不变的情况下,改变注意头的数量以及注意键和值维数,如 3.2.2 节所述。
虽然单头注意力比最好的设置差 0.9 BLUE ,但质量也会随着头的过多而下降。
在表 3(B) 中,我们发现减少注意键大小 d k d_k dk 会影响模型质量。
这表明确定兼容性并不容易,而一个比点积更复杂的兼容性函数可能是有益的。
我们进一步在 © 和 (D) 行中观察到,正如预期的那样,模型越大越好, dropout 对于避免过拟合非常有帮助。
在 (E) 行,我们用学习到的位置嵌入(《Convolutional sequence to sequence learning》)代替了我们的正弦位置编码,观察到的结果与基础模型几乎相同。
为了评估该 Transformer 是否可以推广到其他任务,我们进行了英语选区解析实验。
这项任务提出了具体的挑战:产出受到强烈的结构限制,而且远远长于投入。
此外, RNN 序列到序列模型在小数据区域(《Grammar as a foreign language》)中未能取得最先进的结果。
我们在 Penn Treebank (《Building a large annotated corpus of english: The penn treebank》)的华尔街日报( WSJ )部分训练了一个 d m o d e l = 1024 d_{model} = 1024 dmodel=1024 的四层转换器,大约 40K 训练句子。
我们也在半监督设置下训练它,使用更大的高置信度和 BerkleyParser 语料库,约 1700 万个句子(《Grammar as a foreign language》)。
我们为 WSJ 仅设置使用了 16K 代币词汇表,为半监督设置使用了 32K 代币词汇表。
我们只进行了少量的实验来选择退出,包括注意和残差(第 5.4 节),开发集上的学习速率和电子束尺寸,所有其他参数在英语到德语的基础翻译模型中保持不变。
在推断过程中,我们将最大输出长度增加到输入长度 + 300。我们使用了 21 尺寸和 α = 0.3 \alpha = 0.3 α=0.3 的波束,仅在华尔街日报和半监督设置。
表 4 中的结果显示,尽管缺乏特定于任务的调优,我们的模型的性能还是惊人地好,产生的结果比以前报告的所有模型都好(除了循环神经网络语法(《Recurrent neural
network grammars》))。
与 RNN 序列到序列模型(《Grammar as a foreign language》)[相比,即使仅在华尔街日报的 40K 个句子训练集上训练, Transformer 的性能也优于 BerkeleyParser (《Learning accurate, compact, and interpretable tree annotation》)。
在这项工作中,我们提出了 Transformer ,即完全基于注意的第一序列转换模型,用多头自我注意取代了编码器-解码器体系结构中最常用的循环层。
对于翻译任务, Transformer 的训练速度明显快于基于循环或卷积层的架构。
在 2014 年 WMT 英德翻译和 2014 年英法翻译任务中,我们都达到了一个新的水平。
在前一个任务中,我们最好的模型甚至比以前报告的所有集合都要好。
我们对基于注意力的模型的未来感到兴奋,并计划将其应用于其他任务。
我们计划将 Transformer 扩展到文本以外的输入和输出模式的问题,并研究局部的、受限制的注意力机制,以有效地处理大型输入和输出,如图像、音频和视频。
我们的另一个研究目标是减少生产的顺序性。
我们用来训练和评估我们的模型的代码可以在https://github.com/ tensorflow/tensor2tensor上找到。