Attention Is All You Need

Attention Is All You Need

Abstract

主要的序列转导模型是基于复杂的循环或卷积神经网络,其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构,变压器,完全基于注意机制,完全取消递归和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更并行,需要的训练时间明显更少。我们的模型在WMT 2014英德翻译任务上实现了28.4 BLEU,比现有的最佳结果,包括集成,提高了超过2 BLEU。在WMT 2014英法翻译任务中,我们的模型在8个gpu上进行了3.5天的训练,建立了一个新的最先进的单模型BLEU分数41.0,这只是文献中最佳模型训练成本的一小部分。

Introduction

循环神经网络,特别是长短期记忆[12]和门控循环[7]神经网络,已经成为序列建模和转导问题的最先进的方法,如语言建模和机器翻译[29,2,5]。此后,许多努力继续推动循环语言模型和编解码器架构[31,21,13]的边界。

循环模型通常是沿着输入和输出序列的符号位置进行因素计算。将这些位置与计算时间中的步骤对齐,它们生成一系列隐藏状态 h t h_t ht,作为前一个隐藏状态 h t − 1 h_{t−1} ht1和位置 t t t的输入的函数。这种固有的顺序性质排除了训练示例中的并行化,这在较长的序列长度时变得至关重要,因为内存限制了示例之间的批处理。最近的工作通过[18]分解技巧和条件计算[26]显著提高了计算效率,同时也提高了模型的性能。然而,序列计算的基本约束仍然存在。

注意机制已经成为各种任务中引人注目的序列建模和转导模型的一个组成部分,允许对依赖关系进行建模,而不考虑它们在输入或输出序列[2,16]中的距离。然而,在除了少数情况下,所有[22],这种注意机制与循环网络一起使用。

在这项工作中,我们提出了Transformer,一个避免重复出现的模型架构,而是完全依赖于一个注意机制来绘制输入和输出之间的全局依赖关系。Transformer允许更多的并行化,在8个P100gpu上进行了短短12个小时的训练后,可以达到一种新的翻译质量技术状态。

Background

减少顺序计算的目标也形成了扩展神经GPU [20]、ByteNet [15]和ConvS2S [8]的基础,所有这些方法都使用卷积神经网络作为基本的构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增长,ConvS2S呈线性增长,ByteNet呈对数增长。这使得学习遥远位置[11]之间的依赖关系更加困难。在Transformer中,这被减少为恒定的操作次数,我们用第3.2节中所述的多头注意力来抵消这个效应。

自我注意,有时被称为内注意,是一种注意机制,将单个序列的不同位置联系起来,以计算序列的表示。自我注意已成功地应用于各种任务中,包括阅读理解、抽象摘要、文本隐含和学习任务独立的句子表征[4,22,23,19]。

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

然而,据我们所知,Transformer是第一个完全依赖于自我关注来计算其输入和输出的表示的转导模型,而不使用序列对齐的rnn或卷积。在下面的章节中,我们将描述变压器,激发自我关注,并讨论它相对于[14,15]和[8]等模型的优势。

Model Architecture

大多数竞争性的神经序列转导模型都有一个编码器-解码器结构的[5,2,29]。在这里,编码器将一个符号表示的输入序列 ( x 1 , . . . , x n ) (x_1,...,x_n) x1...xn映射到一个连续表示的序列 z = ( z 1 , . . . , z n ) z =(z_1,...,z_n) z=z1...zn。给定 z z z,解码器一次生成一个符号的输出序列 ( y 1 , . . . , y m ) (y_1,...,y_m) y1...ym。在每一步中,模型都是自回归的[9],在生成下一个符号时,使用之前生成的符号作为附加的输入。

Transformer遵循这种整体架构,对编码器和解码器使用堆叠的自注意层和点级的全连接层,分别如图1的左半部分和右半部分所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1JV203u2-1678690207368)(../../AppData/Roaming/Typora/typora-user-images/image-20230313092314235.png)]

编码器和解码器堆栈

编码器:编码器由N个=6个相同的层组成。每个层都有两个子层。第一种是一个多头的自我注意机制、第二种是一个简单的、位置级全连接前馈网络。我们在两个子层周围使用残差连接[10],然后进行层归一化[1]。也就是说,每个子层的输出是LayerNorm ( x + S u b l a y e r ( x ) ) (x +Sublayer(x)) (x+Sublayer(x)),其中Sublayer(x)是由子层本身实现的函数。为了方便这些剩余的连接,模型中的所有子层以及嵌入层都会产生尺寸 d m o d e l = 512 d_{model}= 512 dmodel=512的输出。

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

Attention

注意函数可以描述为将查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。输出计算为值的加权和,其中分配给每个值的权重由查询与相应键的兼容性函数计算。

Scaled Dot-Product Attention

我们将我们的特别关注称为“ Scaled Dot-Product Attention”(图2)。输入由维度 d k d_k dk的查询和键,以及维度 d v d_v dv的值组成。我们计算具有所有键的查询的点积,将每个键除以 d k \sqrt{d_k} dk ,并应用一个softmax函数来获得这些值的权重。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJZJ76UP-1678690207369)(../../AppData/Roaming/Typora/typora-user-images/image-20230313124718066.png)]
在实践中,我们同时计算一组查询上的注意函数,并被打包到一个矩阵q中。键和值也被打包到矩阵K和V中。我们将输出的矩阵计算为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y5aFWydA-1678690207369)(../../AppData/Roaming/Typora/typora-user-images/image-20230313104039977.png)]
两个最常用的注意函数是加性注意[2]和点积(乘法)注意。点积注意与我们的算法相同,除了 1 d k \frac{1}{\sqrt{d_k}} dk 1的比例因子。加法注意使用单隐层的前馈网络计算兼容性函数。虽然这两种方法在理论复杂性上相似,但在实践中,点积注意力在实践中更快,更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。

而对于较小的 d k d_k dk值,这两种机制的表现相似,在 d k d_k dk[3]值较大的情况下,附加注意优于点积注意。我们怀疑,对于 d k d_k dk的大值,点积的幅度变大,将softmax函数推到具有极小梯度的区域。为了抵消这种效应,我们用 1 d k \frac{1}{\sqrt{d_k}} dk 1来缩放点积。

Multi-Head Attention

我们发现,利用不同的键、值和值v维的线性投影,对 d k d_k dk的线性投影与 d k d_k dk、值和查询不同。在每个查询、键和值的投影版本上,我们会并行地执行注意函数,生成 d v d_v dv维输出值。这些值被连接起来并再次投影,从而得到最终的值,如图2所示。

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GseS8z7n-1678690207370)(../../AppData/Roaming/Typora/typora-user-images/image-20230313130520448.png)]

其中的投影是参数矩阵[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCM4W2u6-1678690207370)(../../AppData/Roaming/Typora/typora-user-images/image-20230313130737262.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1Eh99PW-1678690207371)(../../AppData/Roaming/Typora/typora-user-images/image-20230313130748340.png)]
在这项工作中,我们使用了 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。由于每个头部的维数降低,其总计算代价与全维的单头注意相似

Applications of Attention in our Model

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

在“编码器-解码器注意”层中,查询来自上一个解码器层,内存密钥和值来自编码器的输出。这允许解码器中的每个位置都参与输入序列中的所有位置。这模拟了序列到序列模型中典型的编码器-解码器注意机制,如[31,2,8]。

该编码器包含自我注意层。在自注意层中,所有的键、值和查询都来自同一个位置,在这种情况下,是编码器中上一层的输出。编码器中的每个位置都可以处理编码器上一层中的所有位置。

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

Position-wise Feed-Forward Networks

除了注意子层外,我们的编码器和解码器中的每个层都包含一个完全连接的前馈网络,它分别和相同地应用于每个位置。这由两个线性变换组成,中间有一个ReLU激活。
在这里插入图片描述
虽然线性转换在不同的位置上是相同的,但它们每层都使用不同的参数。另一种描述它的方法是用核大小为1的两个卷积。输入和输出的维数为 d m o d e l = 512 d_{model}= 512 dmodel=512,内层的维数为 d f f = 2048 d_{ff}=2048 dff=2048

Embeddings and Softmax

与其他序列转导模型类似,我们使用学习到的嵌入来将输入标记和输出标记转换为维数 d m o d e l d_model dmodel的向量。我们还使用通常的学习线性变换和softmax函数来转换解码器输出到预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层之间共享相同的权重矩阵和前软最大线性变换,类似于[24]。在嵌入层中,我们将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel

Positional Encoding

由于我们的模型不包含递归性和卷积,为了使模型利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们在输入嵌入中添加了“位置编码”。表1:不同层类型的最大路径长度、每一层的复杂性和最小顺序操作数。n为序列长度,d为表示维数,k为卷积的核大小,r为受限自注意条件下邻域的大小。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U32mytFd-1678690207372)(../../AppData/Roaming/Typora/typora-user-images/image-20230313135603117.png)]
编码器和解码器堆栈的底部。位置编码与嵌入具有相同的维数d模型,因此两者可以求和。有许多位置编码的选择,学习的和固定的[8]。

在这项工作中,我们使用不同频率的正弦和余弦函数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qWRCVKOZ-1678690207372)(../../AppData/Roaming/Typora/typora-user-images/image-20230313135643597.png)]
其中 p o s pos pos是位置, i i i是维度。也就是说,位置编码的每个维度都对应于一个正弦曲线。波长形成了一个从 2 π 2π 2π 10000 ⋅ 2 π 10000·2π 100002π的几何级数。我们选择这个函数是因为我们假设它允许模型容易地学习相对位置,因为对于任何固定的偏移量 k k k P E p o s + k PE_{pos+k} PEpos+k可以表示为 P E p o s PE_{pos} PEpos的线性函数。

我们还实验使用学习到的位置嵌入[8],发现这两个版本产生了几乎相同的结果(见表3行(E))。我们选择正弦版本,因为它可能允许模型推断比训练中遇到的序列长度。

Why Self-Attention

在本节中我们比较各个方面的自我注意层循环和卷积层常用映射一个可变长序列符号表示 ( x 1 . . . , x n ) (x_1...,x_n) x1...xn到另一个序列等长度 ( z 1 . . . , z n ), x i , z i ∈ R d (z_1...,z_n),x_i,z_i∈R^d z1...zn),xiziRd,如一个隐藏层在一个典型的序列转导编码器或解码器。为了激励我们使用自我注意,我们考虑了三个需求。

一个是每层的总计算复杂度。另一个是可以并行化的计算量,通过所需的最小顺序操作数量来衡量。第三个是网络中长期依赖关系之间的路径长度。学习长期依赖关系是许多序列转导任务中的一个关键挑战。影响学习这种依赖关系能力的一个关键因素是信号在网络中向前和向后穿过的路径的长度。在输入和输出序列中的任何位置组合之间的这些路径越短,就越容易学习长期依赖关系[11]。因此,我们也比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。

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

核宽度为 k < n k < n k<n的单个卷积层并不能连接所有的输入和输出位置对。在相邻核的情况下,这样做需要一堆 O ( n / k ) O(n/k) On/k卷积层,或者在扩展卷积[15]的情况下,需要 O ( l o g k ( n ) ) O(log_k(n)) Ologk(n),从而增加网络中任意两个位置之间的最长路径的长度。卷积层通常比循环层更昂贵,再乘以 k k k。然而,可分离卷积[6]大大降低了复杂度,达到 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) O(k·n·d + n·d ^2) Oknd+nd2。然而,即使使用 k = n k = n k=n,可分离卷积的复杂性也等于自注意层和点向前馈层的组合,这是我们在模型中采用的方法。

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

Training

本节描述了我们的模型的训练机制。

Training Data and Batching

我们在标准的WMT 2014英-德语数据集上进行了训练,该数据集包含约450万对句子对。句子使用字节对编码的[3]进行编码,它有大约37000个令牌的共享源数据词汇表。对于英法词汇,我们使用了明显更大的WMT 2014英法数据集,其中包含3600万个句子,并将标记分解为32000个字片词汇[31]。句子对按近似的序列长度组合在一起。每个训练批包含一组句子对,其中包含大约25000个源标记和25000个目标标记。

Hardware and Schedule

我们在一台使用8个NVIDIA P100gpu的机器上训练我们的模型。对于我们使用整个论文中描述的超参数的基础模型,每个训练步骤大约需要0.4秒。我们总共训练了基本模型10万步或12个小时。对于我们的大模型(如表3的底线描述),步长时间为1.0秒。这些大型模型接受了30万步(3.5天)的训练。

Optimizer

我们使用了Adam优化器[17]和 β 1 = 0.9 , β 2 = 0.98 β_1 = 0.9,β_2 = 0.98 β1=0.9β2=0.98 ε = 1 0 − 9 \varepsilon=10^{−9} ε=109。我们在整个训练过程中改变了学习率,计算公式如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LREMDJD4-1678690207373)(../../AppData/Roaming/Typora/typora-user-images/image-20230313142409808.png)]
这对应于第一个warmup_steps训练步骤的学习率线性增加,然后按步数的平方反比成比例降低。我们使用了warmup_steps = 4000。

Regularization

我们在培训过程中采用了三种类型的正规化:

残余Dropout:我们将辍学[27]应用于每个子层的输出,然后将其添加到子层输入并进行规范化。此外,我们还将Dropout应用于编码器和解码器堆栈中的嵌入和位置编码的和。对于基本模型,我们使用 P d r o p = 0.1 P_{drop}=0.1 Pdrop=0.1的速率.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ifOscSvQ-1678690207373)(../../AppData/Roaming/Typora/typora-user-images/image-20230313143108390.png)]

在训练过程中,我们采用了值 ε l s = 0.1 \varepsilon_{ls} = 0.1 εls=0.1 [30]的标签平滑处理。这伤害了perplexity,因为模型学会了更不确定,但提高了准确性和BLEU分数。

Results

Machine Translation

在WMT 2014英德翻译任务中,大变压器模型(表2中的变压器(大))比之前报道的最佳模型(包括集成)超过2.0 BLEU,建立了一个新的最先进的BLEU分数28.4。该模型的配置列于表3的底线中。在8个P100gpu上进行训练需要3.5天。即使是我们的基础模型也超过了之前发表的所有模型和集合,而训练成本只是任何竞争模型的一小部分。

在WMT 2014年的英法翻译任务中,我们的大模型获得了41.0分的BLEU分数,优于之前发布的所有单个模型,其训练成本不到之前最先进的模型的1/4。为英语到法语训练的变压器(大)模型使用了辍学率Pdrop = 0.1,而不是0.3。

对于基本模型,我们使用了一个通过将最后5个检查点平均得到的单一模型,这些检查点每隔10分钟编写一次。对于大型模型,我们取了最后20个检查点的平均值。我们使用光束大小为4和长度惩罚α = 0.6 [31]。这些超参数是在开发集上进行实验后选择的。这些超参数是在开发集上进行实验后选择的。我们将推理过程中的最大输出长度设置为输入长度+ 50,但在可能时尽早终止。

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

Model Variations

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FnbuIdTS-1678690207373)(../../AppData/Roaming/Typora/typora-user-images/image-20230313144824088.png)]

在表3行(B)中,我们观察到减少注意密钥大小dk会损害模型质量。这表明,确定兼容性并不容易,而一个比点产品更复杂的兼容性功能可能是有益的。我们在©和(D)行中进一步观察到,正如预期的那样,较大的模型更好,并且退出对于避免非常有助于过拟合。在第(E)行中,我们用学习到的位置嵌入[8]替换了我们的正弦位置编码,并观察到与基本模型几乎相同的结果。

Conclusion

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

对于翻译任务,变压器的训练速度可以比基于循环层或卷积层的架构要快得多。在WMT 2014英德语和WMT 2014英法翻译任务中,我们实现了一种新的艺术状态。在前一项任务中,我们最好的模型甚至优于所有之前报道的集成。

我们对基于注意力的模型的未来感到很兴奋,并计划将它们应用到其他任务中。我们计划将变压器扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意机制,以有效地处理大型输入和输出,如图像、音频和视频。减少时序化是我们的另一个研究目标。

我们用来训练和评估我们的模型的代码是可在 https://github.com/tensorflow/tensor2tensor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值