Attention is allyou need译文

摘要

显性序列转导模型(dominant sequence transduction model)基于复杂的RNN或CNN,其中包含编码器和解码器。表现最佳的模型也需通过注意力机制(attention mechanism)编码器和解码器。我们提出了一种新型的简单网络构架——transformer,它完全基于注意力机制,彻底放弃了循环和卷积。两项机器翻译任务的实验表明,这些模型的翻译质量更优,同时更并行,所需训练时间也大大减少。我们的模型在WMT2014英转德翻译任务中达到28.4BlUE,改进现有最佳结果(包括集成模型)2BLUE。在WMT2014英转法翻译任务中,在8块GPU上训练了3.5天后(只是现有文献所述最佳模型训练成本的一小部分),我们的模型获得了新的单模型*BLUE得分41.0分。我们把它成功应用到了有大量训练数据和有限训练数据的英语组别分析上,表明Transformer在其他任务上也泛化很好。

介绍

循环神经网络,特别是长短时记忆循环神经网络和门控循环神经网络,作为序列建模和转导问题(如语言建模和机器翻译)的最先进的方法,它的地位被牢固树立。为扩展循环语言模型和编码解码架构的界限,人们自此持续做出大量努力。

循环模型通常考虑沿输入输出序列的符号位置的计算。将符号位置与计算时间中的步骤对齐,它们生成一个隐藏状态序列hth_{t},作为先前隐藏状态ht1h_{t-1}和输入位置t的一个函数。这种固有连续性排除了训练样本的并行性,这一点对更长长度的序列至关重要,因为内存约束限制了跨示例的批处理。最近的工作已经实现通过分解技巧和有条件计算的方式显着提高计算效率,同时也改善后者的模型性能。然而,顺序计算的基本约束依然存在。

注意力机制已经成为各种任务中序列建模和转导模型的一个完整部分,允许建立依赖关系,而不考虑它们在输入或输出序列中的位置。然而,除了少数情况下,这种注意力机制与循环网络一起使用。

在这项工作中,我们提出Transformer,一种避免再现而完全依赖注意力机制来绘制输入和输出之间的全局依赖关系的模型结构。Transformer允许更多的并行化,在8个P100 GPU上训练仅12小时后,就可在翻译质量上达到最新技术水平。

背景

减少顺序计算的目标也构成了扩展神经GPU的基础,ByteNet和ConvS2S,所有这些都使用卷积神经网络作为基础建构块,为所有输入和输出位置并行地计算其隐藏表示。在这些模中,来自两个任意输入或输出位置的关联信号所需的操作数量随两信号位置间距离的增加而增加。对于ConvS2S是线性的,对于ByteNet是对数的。这使得学习远距离位置之间的依赖关系更加困难。在Transformer中它被减少到一定操作数量。尽管由于平均注意力加权位置,不得不以降低有效分辨率为代价,在 3.2 节中描述的多方注意力中可抵消此效应。

自我关注,有时被称为内部关注,是一种涉及单个序列不同位置以计算序列表示的关注机制。自我关注成功地用于各种任务,包括阅读理解,抽象概括,文字蕴涵和学习独立任务的句子表述。

端到端内存网络基于循环注意力机制而不是序列对齐循环,并且已经证明在简单语言问题回答和语言建模任务方面表现良好。

然而,据我们所知,Transformer是第一个完全依靠自我关注来计算其输入和输出的表示而不使用序列对齐的RNN或卷积。在以下部分中,我们将描述Transformer,激励
自我关注并讨论其相较其他模型的优势 。

模型架构

最具有竞争力的神经序列转导的模型有一个编码器-译码器结构。这里,编码器将符号表示的输入序列(x1, ,xn)(x_1,\cdots,x_n)映射到一个连续表示的序列z=(z1, ,zn)z=(z_1,\cdots,z_n)。给定z后解码器生成输出符号序列(y1, ,ym)(y_1,\cdots,y_m ),一次生成一个元素。 在每个步骤中,模型都是自回归的,在生成下一个符号时,将先前生成的符号作为附加输入。

Transformer遵循这种整体架构,使用堆叠自我关注和点导向(point-wise),编码器和解码器的完全连接层,分别如图 1 的左半部分和右半部分所示。
Attention is allyou need译文

编码器和解码器堆栈

  • 编码器:编码器由N = 6的相同层数的堆栈组成。每层有两个子层。 第一个是多首自我关注机制,第二个是简单的,位置导向(position-wise)的完全连接的前馈网络。 我们在每两个子层周围使用了一个剩余连接,然后是层规范化。 也就是说,每个子层的输出是LayerNorm(x+Sublayer(x))LayerNorm(x + Sublayer(x)),其中Sublayer(x)Sublayer(x)是由子层执行的函数本身。 为了促进这些剩余连接,模型中的所有子层以及嵌入层,产生维度dmodel=512d_{model} = 512的输出 。
  • 解码器:解码器也由N = 6的相同层数的堆栈组成。 除了在每个编码器层中的两个子层,解码器插入第三子层,来执行编码器堆栈输出的多首关注。与编码器类似,我们采用残余连接围绕每个子层,然后进行层标准化。我们也修改了解码器堆栈中的自我关注子层以防止当前位置出现在后续位置。这个掩蔽,结合输出嵌入被一个位置抵消的情况,确保了位置i的预测仅取决于小于i的位置处的已知输出。

注意力(关注)

一个注意力函数可以描述为从一个询问和一组关键字-取值对到输出的映射,其中询问,关键字,值和输出都是向量。 输出为这些值的加权和,其中分配给每个值的权重是通过带有相应关键字的询问的兼容性函数计算得到的。
Attention is allyou need译文
缩放的点积注意力(Scaled Dot-Product Attention)

我们特别关注“标度点-产出注意机制”(图 2) 。 输入包括查询和维度dkd_k的关键字,和查询和维度dvd_v的值。 我们计算带有所有关键字的询问的点积,对每个结果除以dk\sqrt{d_k},并应用一个softmax函数来获得值的权重。

在实践中,我们同时计算一组查询的注意力函数,打包进一矩阵Q。关键字和值也打包成矩阵K和V. 计算产出矩阵为:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

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

虽然对于值较小的dkd_k,两种机制的表现相似,但附加注意优于其他未缩放的值较大的dkd_k的点积注意。我们怀疑对于值大的dkd_k,点积量级大幅增大,将softmax函数推进极小梯度的区域\footnote{为了说明点积变大的原因,假设q和k的分量是独立随机的,均值为0,方差为1。然后他们的点积QK=i=1dkqikiQ\cdot K=\sum_{i=1}^{d_k}q_ik_i具有均值0和方差dkd_k.} . 为了抵消这种影响,我们将点积缩放1dk\frac{1}{\sqrt{d_k}}

多端注意(Multi-Head Attention)

我们发现对查询、关键字和值做不同的线性投影h次是有益的,其中学得的线性投影维度分别为dkd_kdkd_kdvd_v,而不是使用dmodeld_model维的查询、关键字和值的单一注意力函数。对每个投影版本的查询,关键字和值我们并行地执行注意函数,产生dvd_v维的输出值。这些是连结的并再次投影,得到最终值,如图 2 所示 。

多端注意允许模型共同关注来自不同位置的子空间的不同表示。只需一个注意端,平均抑制这种情况。
MultiHead(Q,K,V)=Concat(head1, ,headh)WOMultiHead(Q,K,V)=Concat(head_1,\cdots,head_h)W^O
where headi=Attention(QWiQ,KWIK,VWiV)where \ head_i=Attention(QW_i^Q,KW_I^K,VW_i^V)

其中投影是参数矩阵WiQRdmodel×dkW_i^Q\in \mathbb{R}^{d_{model}\times d_k},WiKRdmodel×dkW_i^K\in \mathbb{R}^{d_{model}\times d_k},
WiVRdmodel×dvW_i^V\in \mathbb{R}^{d_{model}\times d_v},WiORhdv×dmodelW_i^O\in \mathbb{R}^{hd_v\times d_{model}}

在这项工作中,我们采用h = 8个平行注意力层或端。 对于每一个我们均使用dk=dv=dmodel/h=64d_k=d_v=d_{model}/ h=64.由于每一端的维度减小,总计算成本类似于具有全维度的单端注力。