主流的序列转换模型是基于复杂的循环神经网络(RNN)或卷积神经网络(CNN),包括编码器和解码器。表现最好的模型还通过注意力机制连接编码器和解码器。我们提出了一种新的简单网络架构——Transformer,完全基于注意力机制,完全免除了循环神经网络和卷积神经网络。在两个机器翻译任务上的实验表名,这些模型在质量上更优,同时可并行化程度更高,并且需要的训练时间更短。我们的模型在WMT 2014英德翻译任务中实现了28.4 BLEU,比现有的最佳结果(包括集成)提高了2 BLEU以上。在2014年的WMT英法翻译任务中,我们的模型在8个gpu上培训3.5天后,建立了一个新的单模型最先进的BLEU评分41.8,这只是文献中最好的模型培训成本的一小部分。我们证明了该转换器可以很好地推广到其他任务中,成功地应用于具有大量和有限训练数据的英语选区解析。
递归神经网络,特别是长短时记忆[13]和门控递归[7]神经网络,作为序列建模和语言建模、机器翻译等转换问题的最先进的方法已被牢固地建立起来[35,2,5]。此后,大量的工作一直在不断地推进循环语言模型和编码器-解码器架构的边界。
递归模型通常根据输入和输出序列的符号位置进行因子计算。调整位置步骤计算时间,他们生成一个隐藏的状态序列 h t h_{t} ht,通过函数根据前面的隐藏状态 h t − 1 h_{t-1} ht−1和位置 t t t的输入计算。这个固有的顺序自然排除了在训练样本上进行并行化,这在长序列的长度变得非常关键,因为内存约束限制批处理的样本数量。最近的工作已经通过因数分解技巧[21]和条件计算[32]显著提高了计算效率,同时也提高了后者的模型性能。然而,顺序计算的基本约束仍然存在。
注意力机制已经成为各种任务中引人注目的序列建模和转导模型的组成部分,允许对依赖项进行建模,而不考虑它们在输入或输出序列中的距离[2,19]。然而,除了少数情况外,在所有例子中,这种注意机制都是与循环神经网络结合使用的。
在这项工作中,我们提出了Transformer,这个模型架构避免了循环,而是完全依赖于一种注意力机制来绘制输入和输出之间的全局依赖关系。Transformer允许显著地更多的并行化,经过短短12小时的培训,在8个P100 gpu,就可以在翻译质量上达到最先进的水平。
减少顺序计算的目标也是Extended Neural GPU、ByteNet和ConvS2S的基础,它们都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号关联起来所需的操作数按照位置之间的距离增加的,对于ConvS2S是线性增长的,对于ByteNet是对数级增长的。这使得学习远程位置之间的依赖关系变得更加困难。在Transformer中,这被减少为固定数量的操作,尽管代价是由于平均注意加权位置而降低了有效分辨率,正如3.2节中所述,我们通过多头注意来抵消这一影响。
Self-attention,有时也称为intra-attention,是一种将单个序列的不同位置关联起来以计算序列表示的注意力机制。Self-attention在阅读理解、抽象摘要、篇章蕴涵和学习任务独立的句子表征等多种任务中得到了成功的应用。
端到端memory network是一种基于递归注意机制而非序列对齐递归的记忆网络,在简单语言问答和语言建模任务中表现良好。
然而,据我们所知,Transformer是第一个完全依赖于self-attention来计算输入和输出的表示而不使用序列对齐的RNNs或卷积的转导模型。在下面的章节中,我们将描述Transformer,激发自我关注,并讨论它相对于[17,18]和[9]等模型的优势。
大部分有竞争力的神经序列转换模型有一个编码器-解码器架构。这里,编码器将输入序列的符号表示 ( x 1 , … , x n ) (x_1,\dots,x_n) (x1,…,xn)转换为一系列的连续符号表示 z = ( z 1 , … , z n ) \boldsymbol{z}=(z_1,\dots,z_n) z=(z1,…,zn)。给定 z \boldsymbol{z} z,解码器生成输出符号序列 ( y 1 , … , y n ) (y_1,\dots,y_n) (y1,…,yn),每次生成一个符号。每一步,模型都是自回归的,当生成文本时使用前面已经生成的符号作为额外的输入。
Transformer遵循这样的整体架构:在编码器和解码器中使用堆叠的自注意力的、逐点的全连接层。分别如图1的左边和右边部分所示。
编码器:编码器是由 N = 6 N=6 N=6个相同的网络层组成。每一层有两个子层。第一个子层是一个多头自注意力机制(multi-head self-attention mechanism),第二个子层是一个简单的、位置明确的全连接前馈网络(position-wise fully connected feed-forward network)。我们在每一个子层周围使用一个残差连接(residual connection),然后进行层标准化(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)是子层自己实现的函数。为了利用这些残差连接(residual connection),模型中的所有子层,也包括词嵌入层,生成的输出的维度都是 d m o d e l = 512 d_{model}=512 dmodel=512
解码器:解码器也是由 N = 6 N=6 N=6个相同的网络层组成。除了每个编码器层中的两个子层,解码器插入了第三个子层,这个子层在编码器堆叠的输出上执行多头注意力(multi-head attention)。和编码器类似,我们在每一个子层周围使用一个残差连接(residual connection),后面跟着层标准化(layer normalization)。我们还修改了解码器堆叠中的self-attention子层,以防止位置注意到后续位置。这种屏蔽,加上输出嵌入被偏移了一个位置的事实,确保了对位置 i i i的预测只能依赖于位置 i i i以前的已知输出。
一个注意力函数可以被描述成将一个查询和一系列键值对映射到一个输出,其中查询、键、值和输出都是向量。输出通过计算值得加权和得到,其中分配给每个值的权重由查询的兼容性函数和对应的键计算。
我们将我们的特殊的注意力称为“缩放的点乘注意力(Scaled Dot-Product Attention)”,如图2所示。输入由 d k d_k dk维(dimension d k d_k dk)的查询和键, d v d_v dv维(dimension d v d_v dv)的值组成。我们计算query和所有keys的点乘,然后除以 d k \sqrt{d_{k}} dk,最后使用一个softmax函数来获取值的权重。
实际上,我们在一系列的查询上同时执行attention函数,然后包装在一起变成矩阵 Q Q Q。键和值也被包装在一起变成矩阵 K K K和 V V V。我们按下面的方式计算输出的矩阵:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V ( 1 ) Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V\qquad(1) Attention(Q,K,V)=softmax(dkQKT)V(1)
使用最广泛的attention函数是additive attention和dot-product(乘法) attention。dot-product attention和我们的算法是一样的,除了缩放比例因子 1 d k \frac{1}{\sqrt{d_{k}}} dk1。Additive attention使用有一个隐藏层的前馈网络来计算兼容函数(compatibility function)。虽然这两种方法在理论上的复杂度相似,但由于可以使用高度优化的矩阵乘法代码来实现,因此点积注意在实践中更快、更节省空间。
对于较小的 d k d_k dk值,这两种机制的表现相似,对于较大的 d k d_k dk值,在不缩放的情况下,additive attention优于dot-product attention。我们怀疑,对于较大的 d k d_k dk值,点积的量级会变大,从而将softmax函数推入它的梯度非常小的区域。为了抵消这个效果,我们将点击缩放 1 d k \frac{1}{\sqrt{d_{k}}} dk1倍。
替代对 d m o d e l d_{model} dmodel维的键,值和查询执行单个attention function,我们发现使用学习到的不同的线性投影分别对查询、键和值进行h次线性投影,投影到 d k {d_k} dk、 d k {d_k} dk和 d v {d_v} dv维度是有益的。然后,对于每个查询、键和值的投影版本,我们并行地执行注意函数,生成 d v {d_v} dv维的输出值。这些值被连接起来并再次投影,得到最终的值,如图2所示。
多头注意(Multi-head Attention)允许模型在不同的位置共同关注来自不同表示子空间的信息。
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , … , h e a d n ) W O w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) MultiHead(Q,K,V)=Concat(head_1,\dots,head_n)W^O \\ where \quad head_{i} = Attention(QW_i^Q,KW_i^K,VW_i^V) MultiHead(Q,K,V)=Concat(head1,…,headn)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)
其中投影是参数矩阵 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并行注意力层(attention layers)或注意力头(attention heads)。对于其中的每一个,我们使用 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。由于每个头的维数减小,计算总成本与全维度单头注意(single-head attention)相似。
Transformers通过三种不同的方式使用多头注意力(multi-head attention):
除了attention子层,我们的编码器和解码器中的每一层都包含一个全连接的前馈网络,它分别同样的应用于每个位置。它由两个线性变换组成,中间有一个ReLU激活函数。
F F N ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 ( 2 ) FFN(x) = \max(0, xW_1 + b_1)W_2 + b_2\qquad(2) FFN(x)=max(0,xW1+b1)W2+b2(2)
虽然不同位置上的线性变换是相同的,但是它们在不同的层之间使用不同的参数。另一种描述方法是用内核大小为1的两个卷积。输入输出维度为 d m o d e l = 512 d_{model} = 512 dmodel=512,内部层的维度为 d f f = 2048 d_{ff} = 2048 dff=2048。
与其他序列转换模型类似,我们使用已经学习好的词嵌入表示方法将输入token和输出token转换为维度为 d m o d e l d_{model} dmodel的向量。我们也使用通常的学习好的线性变换和softmax函数将解码器输出转换为预测的下一个token概率。在我们的模型中,我们在两个嵌入层之间共享相同的权重矩阵和pre-softmax线性变换,类似于[30]。在嵌入层中,我们将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel。
由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于序列中token的相对或绝对位置的信息。为此,我们将“位置编码”添加到编码器和解码器堆栈底部的输入嵌入中。位置编码与嵌入编码具有相同的维度dmodel,因此可以对二者进行求和。有许多位置编码的选择,学习的和固定的。
在本文中,我们使用不同频率的sine和cosine函数
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE(pos,2i)=sin(pos/10000^{2i/d_{model}})\\ PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中 p o s pos pos是位置, i i i是维度。也就是说,位置编码的每个维度对应于一个正弦曲线。波长组成一个从 2 π 2\pi 2π到 10000 ⋅ 2 π 10000·2\pi 10000⋅2π的几何级数。我们选择这个函数是因为我们假设它可以让模型很容易地通过相对位置学习注意,因为对于任何固定偏移量 k k k, P E p o s + k PE_{pos+k} PEpos+k都可以表示为 P E p o s PE_{pos} PEpos的线性函数。
我们还使用了已学习的位置嵌入进行了实验,发现这两个版本的结果几乎相同。我们选择正弦版本,因为它可能允许模型推断出比训练中遇到的更长时间的序列长度。
暂不翻译
暂不翻译
**暂不翻译 **
在本文中,我们提出了Transformer,第一个完全基于注意力的序列转换模型,使用多头自注意力替换编码器-解码器架构中最普遍使用的循环层。
对于翻译任务,Transformer的训练速度比基于循环网络或卷积层的架构显著加快。在WMT 2014 English-to-German和WMT 2014 English-to-French两个翻译任务中,我们达到了最快水平。在前一项任务中,我们的最好的模型比之前说报告的集成模型还要好。
我们对于基于attention的模型非常激动,并计划将它们用于其它任务。我们计划将转换器扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意机制,以便有效地处理大量输入和输出,如图像、音频和视频。减少世代的连续性是我们的另一个研究目标。
我们用来训练和评估模型的代码可以在https://github.com/tensorflow/tensor2tensor中找到。