文献库

Attention Is All You Need

摘要

主流的序列转换模型基于复杂的循环神经网络或卷积神经网络,这些网络通常包含一个编码器和一个解码器。性能最佳的模型还通过注意力机制连接编码器和解码器。我们提出了一种新的简单网络架构——Transformer,它完全基于注意力机制,彻底摒弃了循环和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优,同时具有更高的可并行性,并且训练所需时间显著减少。我们的模型在WMT 2014英德翻译任务上达到了28.4 BLEU,比现有的最佳结果(包括集成模型)提高了超过2 BLEU。在WMT 2014英法翻译任务上,我们的模型在8块GPU上训练3.5天后,建立了新的单模型最先进BLEU分数41.8,这仅是文献中最佳模型训练成本的一小部分。我们通过将Transformer成功应用于英语成分句法分析(无论是使用大规模还是有限训练数据),证明了其能够很好地泛化到其他任务。

1 引言

循环神经网络,特别是长短期记忆网络[13]和门控循环神经网络[7],已被牢固确立为序列建模和转换问题(如语言建模和机器翻译[35, 2, 5])中最先进的方法。此后,众多努力不断推动循环语言模型和编码器-解码器架构的发展[38, 24, 15]。

循环模型通常沿着输入和输出序列的符号位置进行因子化计算。通过将位置与计算时间的步骤对齐,它们生成一个隐藏状态序列 ht,h _ { t } ,,该序列是前一个隐藏状态 ht1h _ { t - 1 } 和位置t处输入的函数。这种固有的顺序特性阻碍了训练样本内的并行化,这在序列长度较长时变得至关重要,因为内存限制约束了跨样本的批处理。最近的工作通过因式分解技巧[21]和条件计算[32]在计算效率上取得了显著改进,后者还提升了模型性能。然而,顺序计算的根本限制仍然存在。

注意力机制已成为各种任务中引人注目的序列建模和转换模型不可或缺的组成部分,它允许建模依赖关系,而无需考虑其在输入或输出序列中的距离[2, 19]。然而,在除少数情况[27]外,这种注意力机制通常与循环网络结合使用。

在这项工作中,我们提出了Transformer,一种摒弃循环并完全依赖注意力机制来捕捉输入和输出之间全局依赖关系的模型架构。Transformer允许显著更高的并行化,并且在8块P100 GPU上训练仅十二小时后即可达到翻译质量的新高度。

2 背景

减少顺序计算的目标也是扩展神经GPU [16]、ByteNet [18]和ConvS2S [9]的基础,它们都使用卷积神经网络作为基本构建块,并行地为所有输入和输出位置计算隐藏表示。在这些模型中,关联来自两个任意输入或输出位置信号所需操作数随位置间距离增长,对于ConvS2S是线性的,对于ByteNet是对数级的。这使得学习远距离位置之间的依赖关系更加困难[12]。在Transformer中,这被减少为常数数量的操作,尽管代价是由于平均注意力加权位置而导致有效分辨率降低,我们通过第3.2节中描述的多头注意力来抵消这种影响。

自注意力,有时称为内部注意力,是一种注意力机制,它关联单个序列的不同位置以计算该序列的表示。自注意力已成功用于各种任务,包括阅读理解、抽象摘要、文本蕴含和学习与任务无关的句子表示[4, 27, 28, 22]。

端到端记忆网络基于循环注意力机制而非序列对齐的循环,并已被证明在简单语言问答和语言建模任务上表现良好[34]。

然而,据我们所知,Transformer是第一个完全依赖自注意力来计算其输入和输出表示,而不使用序列对齐的RNN或卷积的转换模型。在以下章节中,我们将描述Transformer,阐述自注意力的动机,并讨论其相对于[17, 18]和[9]等模型的优势。

3 模型架构

大多数有竞争力的神经序列转换模型都具有编码器-解码器结构[5, 2, 35]。在这里,编码器将输入符号表示序列 (x1,...,xn)( x _ { 1 } , . . . , x _ { n } ) 映射到连续表示序列 z= (z1,...,zn)\textbf{z} = ~ ( z _ { 1 } , . . . , z _ { n } )。给定z,解码器然后一次生成一个元素的输出符号序列 (y1,...,ym)\left( y _ { 1 } , . . . , y _ { m } \right)。在每一步,模型都是自回归的[10],在生成下一个符号时,将先前生成的符号作为额外输入。


图1:Transformer - 模型架构。

Transformer遵循这一总体架构,对编码器和解码器都使用堆叠的自注意力和逐点全连接层,分别如图1的左右两半所示。

3.1 编码器和解码器堆栈

编码器:编码器由 N=6N = 6 个相同层的堆栈组成。每层有两个子层。第一个是多头自注意力机制,第二个是简单的、逐位置的全连接前馈网络。我们在每个子层周围采用残差连接[11],然后进行层归一化[1]。也就是说,每个子层的输出是 LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。为促进这些残差连接,模型中的所有子层以及嵌入层都产生维度为 dmodel=512d _ { \mathrm{model} } = 5 1 2 的输出。

解码器:解码器也由 N=6N = 6 个相同层的堆栈组成。除了每个编码器层中的两个子层外,解码器还插入了第三个子层,该子层对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围采用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种掩蔽,加上输出嵌入偏移一个位置的事实,确保位置i的预测只能依赖于位置小于i的已知输出。

3.2 注意力

注意力函数可以描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出计算为值的加权和


图2:(左)缩放点积注意力。(右)多头注意力由多个并行运行的注意力层组成。

其中分配给每个值的权重由查询与相应键的兼容性函数计算。

3.2.1 缩放点积注意力

我们将我们的特定注意力称为“缩放点积注意力”(图2)。输入包括维度为 dkd _ { k } 的查询和键,以及维度为 dvd _ { v } 的值。我们计算查询与所有键的点积,每个都除以 dk\sqrt { d _ { k } },并应用softmax函数以获得值的权重。

在实践中,我们同时在一组查询上计算注意力函数,将它们打包成一个矩阵 QQ。键和值也分别打包成矩阵K和V。我们计算输出矩阵为:

Attention(Q,K,V)=softmax(QKTdk)V(1)\mathrm{Attention} ( Q , K , V ) = \mathrm{softmax} ( \frac { Q K ^ { T } } { \sqrt { d _ { k } } } ) V\tag{1}

两种最常用的注意力函数是加性注意力[2]和点积(乘法)注意力。点积注意力与我们的算法相同,除了缩放因子 1dk\frac { 1 } { \sqrt { d _ { k } } }。加性注意力使用具有单个隐藏层的前馈网络计算兼容性函数。虽然两者在理论复杂性上相似,但点积注意力在实践中更快且更节省空间,因为它可以使用高度优化的矩阵乘法代码实现。

虽然对于较小的 dkd _ { k } 值,这两种机制的性能相似,但对于较大的 dkd _ { k } 值,加性注意力优于未缩放的点积注意力[3]。我们推测,对于较大的 dkd _ { k } 值,点积的幅度会变大,将softmax函数推入梯度极小的区域4。为了抵消这种影响,我们通过 1dk\frac { 1 } { \sqrt { d _ { k } } } 缩放点积。

3.2.2 多头注意力

我们发现,与其使用 dmodeld _ { \mathrm{model} } 维的键、值和查询执行单个注意力函数,不如将查询、键和值分别用不同的、学习到的线性投影h次,投影到 dk,dkd _ { k } , d _ { k }dvd _ { v } 维度。然后,我们对这些投影后的查询、键和值并行执行注意力函数,产生 dvd _ { v } 维的输出值。这些值被连接起来并再次投影,产生最终值,如图2所示。

多头注意力允许模型在不同位置共同关注来自不同表示子空间的信息。使用单个注意力头,平均会抑制这一点。

MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhere headi=Attention(QWiQ,KWiK,VWiV)\begin{array} { r } { \begin{array} { r l } & { \mathrm{MultiHead} ( Q , K , V ) = \mathrm{Concat} ( \mathrm{head} _ { 1 } , . . . , \mathrm{head} _ { \mathrm{h} } ) W ^ { O } } \\ & { \qquad \mathrm { w h e r e ~ h e a d } _ { \mathrm{i} } = \mathrm{Attention} ( Q W _ { i } ^ { Q } , K W _ { i } ^ { K } , V W _ { i } ^ { V } ) } \end{array} } \end{array}

其中投影是参数矩阵 WiQRdmodel×dk,WiKRdmodel×dk,WiVRdmodel×dı\begin{array} { r } { W _ { i } ^ { Q } \in \mathbb{R} ^ { d _ { \operatorname*{model} } \times d _ { k } } , W _ { i } ^ { K } \in \mathbb{R} ^ { d _ { \operatorname*{model} } \times d _ { k } } , W _ { i } ^ { V } \in \mathbb{R} ^ { d _ { \operatorname*{model} } \times d _ { \imath } } } \end{array}WORhˉdv×dmodelW ^ { O } \in \mathbb R ^ { \bar { h } d _ { v } \times d _ { \mathrm{model} } }

在这项工作中,我们采用 h := :8h \ : = \ : 8 个并行注意力层或头。对于每个头,我们使用 dk=dv=dmodel/h=6˙4d _ { k } = d _ { v } = d _ { \mathrm{model} } / h \stackrel { } { = } \dot { 6 } 4。由于每个头的维度降低,总计算成本与全维度的单头注意力相似。

3.2.3 注意力在我们模型中的应用

Transformer以三种不同方式使用多头注意力:

• 在“编码器-解码器注意力”层中,查询来自前一个解码器层,记忆键和值来自编码器的输出。这允许解码器中的每个位置关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意力机制,如[38, 2, 9]。

• 编码器包含自注意力层。在自注意力层中,所有的键、值和查询都来自同一个地方,在这种情况下,是编码器中前一层的输出。编码器中的每个位置都可以关注编码器前一层中的所有位置。

• 类似地,解码器中的自注意力层允许解码器中的每个位置关注解码器中直到并包括该位置的所有位置。我们需要防止解码器中的左向信息流以保持自回归属性。我们在缩放点积注意力内部通过掩蔽(设置为−∞)softmax输入中对应于非法连接的所有值来实现这一点。参见图2。

3.3 逐位置前馈网络

除了注意力子层之外,我们编码器和解码器中的每一层都包含一个全连接前馈网络,该网络分别且相同地应用于每个位置。这包括两个线性变换,中间有一个ReLU激活。

FFN(x)=max(0,xW1+b1)W2+b2(2)\mathrm{FFN} ( x ) = \operatorname*{max} ( 0 , x W _ { 1 } + b _ { 1 } ) W _ { 2 } + b _ { 2 }\tag{2}

虽然线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。另一种描述方式是将其视为两个核大小为1的卷积。输入和输出的维度为 dmodel=512d _ { \mathrm{model} } = 5 1 2,内层维度为 dff=2048d _ { f f } = 2 0 4 8

3.4 嵌入和Softmax

与其他序列转换模型类似,我们使用学习到的嵌入将输入词元和输出词元转换为维度为 dmodeld _ { \mathrm{model} } 的向量。我们还使用通常的学习线性变换和softmax函数将解码器输出转换为预测的下一个词元概率。在我们的模型中,我们在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵,类似于[30]。在嵌入层中,我们将这些权重乘以 dmodel\sqrt { d _ { \mathrm { { m o d e l } } } }

表1:不同层类型的最大路径长度、每层复杂度和最小顺序操作数。n是序列长度,d是表示维度,k是卷积的核大小,r是受限自注意力中的邻域大小。

3.5 位置编码

由于我们的模型不包含循环和卷积,为了让模型利用序列的顺序,我们必须注入一些关于词元在序列中相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加“位置编码”。位置编码与嵌入具有相同的维度 dmodeld _ { \mathrm{model} },因此两者可以相加。位置编码有多种选择,包括学习到的和固定的[9]。

在这项工作中,我们使用不同频率的正弦和余弦函数:

PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)\begin{array} { r } { P E _ { ( p o s , 2 i ) } = s i n ( p o s / 1 0 0 0 0 ^ { 2 i / d _ { \mathrm{model} } } ) } \\ { P E _ { ( p o s , 2 i + 1 ) } = c o s ( p o s / 1 0 0 0 0 ^ { 2 i / d _ { \mathrm{model} } } ) } \end{array}

其中pos是位置,i是维度。也就是说,位置编码的每个维度对应于一个正弦波。波长形成从 2π2 \pi100002π1 0 0 0 0 \cdot 2 \pi 的几何级数。我们选择这个函数是因为我们假设它能让模型容易地通过相对位置学习注意力,因为对于任何固定的偏移k,PEpos+kP E _ { p o s + k } 可以表示为 PEposP E _ { p o s } 的线性函数。

我们还尝试使用学习到的位置嵌入[9]代替,并发现两种版本产生了几乎相同的结果(参见表3行(E))。我们选择正弦版本是因为它可能允许模型外推到比训练期间遇到的序列长度更长的序列。

4 为什么选择自注意力

在本节中,我们将自注意力层与通常用于将一个可变长度符号表示序列 (x1,...,xn)( x _ { 1 } , . . . , x _ { n } ) 映射到另一个等长序列 (z1,...,zn)\left( z _ { 1 } , . . . , z _ { n } \right) 的循环层和卷积层的各个方面进行比较,其中 xi,ziRdx _ { i } , z _ { i } \in \mathbb{R} ^ { d },例如典型序列转换编码器或解码器中的隐藏层。为了说明我们使用自注意力的动机,我们考虑三个期望的特性。

一是每层的总计算复杂度。二是可以并行化的计算量,以所需的最小顺序操作数来衡量。

三是网络中长距离依赖之间的路径长度。学习长距离依赖是许多序列转换任务中的关键挑战。影响学习此类依赖能力的一个关键因素是前向和后向信号在网络中必须 traversed 的路径长度。输入和输出序列中任意位置组合之间的路径越短,学习长距离依赖就越容易[12]。因此,我们还比较了由不同类型层组成的网络中任意两个输入和输出位置之间的最大路径长度。

如表1所示,自注意力层以恒定数量的顺序执行操作连接所有位置,而循环层需要 O(n)O ( n ) 个顺序操作。在计算复杂度方面,当序列长度n小于表示维度d时,自注意力层比循环层更快,这在机器翻译中最先进的模型使用的句子表示中很常见,例如词片[38]和字节对[31]表示。为了提高涉及非常长序列的任务的计算性能,自注意力可以限制为仅考虑输入序列中以相应输出位置为中心的、大小为r的邻域。这会将最大路径长度增加到 O(n/r)O ( n / r )。我们计划在未来的工作中进一步研究这种方法。

核宽度为 k<k < n 的单个卷积层不能连接所有输入和输出位置对。要做到这一点,在连续核的情况下需要堆叠 O(n/k)O ( n / k ) 个卷积层,或者在膨胀卷积的情况下需要 O(logk(n))O ( l o g _ { k } ( n ) ) 个[18],这增加了网络中任意两个位置之间最长路径的长度。卷积层通常比循环层更昂贵,成本因子为k。然而,可分离卷积[6]显著降低了复杂度,降至 O(knd+nd2)\overset { \cdot } { O ( k \cdot n \cdot d + n \cdot d ^ { 2 } ) }。然而,即使 k=nk = n,可分离卷积的复杂度也等于自注意力层和逐点前馈层的组合,这正是我们在模型中采用的方法。

作为附带好处,自注意力可以产生更具可解释性的模型。我们检查了模型的注意力分布,并在附录中展示和讨论了示例。不仅单个注意力头清楚地学习执行不同的任务,而且许多头似乎表现出与句子的句法和语义结构相关的行为。

5 训练

本节描述我们模型的训练方案。

5.1 训练数据和批处理

我们在标准的WMT 2014英德数据集上训练,该数据集包含约450万个句子对。句子使用字节对编码[3]进行编码,该编码具有约37000个词元的共享源-目标词汇表。对于英法,我们使用了更大的WMT 2014英法数据集,包含3600万个句子,并将词元分割成32000个词片的词汇表[38]。句子对按近似序列长度进行批处理。每个训练批次包含一组句子对,包含约25000个源词元和25000个目标词元。

5.2 硬件和时间安排

我们在一台配备8块NVIDIA P100 GPU的机器上训练模型。对于使用本文各处描述的超参数的base模型,每个训练步骤大约需要0.4秒。我们总共训练了base模型100,000步或12小时。对于big模型(在表3底行描述),步进时间为1.0秒。big模型训练了300,000步(3.5天)。

5.3 优化器

我们使用了Adam优化器[20],参数为 β1=0.9,β2=0.98\beta _ { 1 } = 0 . 9 , \beta _ { 2 } = 0 . 9 8ϵ=109\epsilon = 10^ { - 9 }。我们在训练过程中根据以下公式调整学习率:

lrate=dmodel0.5min(stepnum0.5,stepnumwarmupsteps1.5)(3)l r a t e = d _ { \mathrm{model} } ^ { - 0 . 5 } \cdot \mathrm{min} ( s t e p _ { - } n u m ^ { - 0 . 5 } , s t e p _ { - } n u m \cdot w a r m u p _ { - } s t e p s ^ { - 1 . 5 } )\tag{3}

这对应于在前warmup_steps训练步骤中线性增加学习率,此后按步数的平方根倒数成比例减少。我们使用了warmup .steps=4000. s t e p s = 4 0 0 0

5.4 正则化

我们在训练过程中采用了三种正则化方式:

表 2:Transformer 在英语-德语和英语-法语 newstest2014 测试集上,以远低于先前模型的训练成本,取得了优于先前最先进模型的 BLEU 分数。

残差 Dropout 我们在每个子层的输出上应用 dropout [33],然后将其添加到子层输入并进行归一化。此外,我们在编码器和解码器堆栈中,对嵌入和位置编码的总和也应用了 dropout。对于基础模型,我们使用的 dropout 率为 Pdrop=0.1P _ { d r o p } = 0 . 1

标签平滑 在训练过程中,我们采用了值为 ϵls=0.1[36]\epsilon _ { l s } = 0 . 1 [ 3 6 ] 的标签平滑技术。这会降低困惑度,因为模型学会了更加不确定,但提高了准确率和 BLEU 分数。

6 结果

6.1 机器翻译

在 WMT 2014 英语-德语翻译任务上,大型 Transformer 模型(表 2 中的 Transformer (大型))比之前报告的最佳模型(包括集成模型)高出超过 2.0 BLEU,确立了 28.4 的新最先进 BLEU 分数。该模型的配置列在表 3 的最后一行。训练在 8 个 P100 GPU 上耗时 3.5 天。即使是我们的基础模型也超越了所有先前发布的模型和集成模型,而训练成本仅是任何竞争模型的一小部分。

在 WMT 2014 英语-法语翻译任务上,我们的大型模型取得了 41.0 的 BLEU 分数,超越了所有先前发布的单一模型,而训练成本不到先前最先进模型的 1/4。用于英语-法语训练的 Transformer (大型) 模型使用了 dropout 率 Pdrop=0.1P _ { d r o p } = 0 . 1,而不是 0.3。

对于基础模型,我们使用了最后 5 个检查点的平均模型,这些检查点每 10 分钟写入一次。对于大型模型,我们平均了最后 20 个检查点。我们使用了波束大小为 4 的波束搜索和长度惩罚 α=0.6[38]\alpha = 0 . 6 [ 3 8 ]。这些超参数是在开发集上进行实验后选择的。我们在推理期间将最大输出长度设置为输入长度 + 50,但在可能的情况下会提前终止 [38]。

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

6.2 模型变体

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

表 3:Transformer 架构的变体。未列出的值与基础模型相同。所有指标均在英语-德语翻译开发集 newstest2013 上测得。列出的困惑度是根据我们的字节对编码得到的每词片(wordpiece)困惑度,不应与每词困惑度进行比较。

在表 3 的第 (A) 行中,我们改变了注意力头数以及注意力键和值的维度,同时保持计算量不变,如第 3.2.2 节所述。虽然单头注意力比最佳设置差 0.9 BLEU,但注意力头过多时质量也会下降。

在表 3 的第 (B) 行中,我们观察到减小注意力键大小 dkd _ { k } 会损害模型质量。这表明确定兼容性并不容易,并且比点积更复杂的兼容性函数可能是有益的。我们还在第 (C) 和 (D) 行中观察到,正如预期的那样,更大的模型更好,并且 dropout 对于避免过拟合非常有帮助。在第 (E) 行中,我们将正弦位置编码替换为学习到的位置嵌入 [9],并观察到与基础模型几乎相同的结果。

6.3 英语成分句法分析

为了评估 Transformer 是否可以推广到其他任务,我们对英语成分句法分析进行了实验。这项任务提出了特殊的挑战:输出受到强结构约束,并且明显长于输入。此外,RNN 序列到序列模型在小数据场景下未能达到最先进的结果 [37]。

我们在 Penn Treebank [25] 的华尔街日报 (WSJ) 部分训练了一个 4 层 transformer,其中 dmodel=1024d _ { m o d e l } = 1 0 2 4,大约有 40K 个训练句子。我们还在半监督设置下对其进行了训练,使用了来自 [37] 的更大的高置信度和 BerkleyParser 语料库,大约有 1700 万个句子 [37]。对于仅 WSJ 设置,我们使用了 16K 个词元的词汇表;对于半监督设置,使用了 32K 个词元的词汇表。

我们只进行了少量实验来在第 22 节开发集上选择 dropout(包括注意力和残差,见第 5.4 节)、学习率和波束大小,所有其他参数与英语-德语基础翻译模型保持不变。在推理期间,我们将最大输出长度增加到输入长度 + 300。对于仅 WSJ 和半监督设置,我们都使用了波束大小 21 和 α = 0.3。

表 4:Transformer 能够很好地泛化到英语成分句法分析(结果在 WSJ 的第 23 节上)

我们在表 4 中的结果表明,尽管缺乏针对特定任务的调整,我们的模型表现得出奇地好,除了循环神经网络文法 [8] 之外,其结果优于所有先前报告的模型。

与 RNN 序列到序列模型 [37] 相比,即使仅在包含 40K 个句子的 WSJ 训练集上训练,Transformer 也优于 Berkeley-Parser [29]。

7 结论

在这项工作中,我们提出了 Transformer,这是第一个完全基于注意力的序列转换模型,用多头自注意力取代了编码器-解码器架构中最常用的循环层。

对于翻译任务,Transformer 的训练速度明显快于基于循环或卷积层的架构。在 WMT 2014 英语-德语和 WMT 2014 英语-法语翻译任务上,我们都取得了新的最先进成果。在前一个任务中,我们最好的模型甚至超越了所有先前报告的集成模型。

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

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

致谢 我们感谢 Nal Kalchbrenner 和 Stephan Gouws 富有成果的评论、修正和启发。