Attention is all you need 论文阅读

327 阅读7分钟

摘要

主流的序列转换模型都是基于复杂的循环神经网络和卷积神经网络,都包含一个encoder和decoder。表现最好的模型通过attention机制连接encoder和decoder。因此,提出一个新的、简单的网络架构:Transformer,其完全基于注意力机制,摒弃了循环和卷积。

1 简介

RNN、LSTM、GRU在序列建模和转换任务上,取得了好的结果。大量的努力推动着循环神经网络模型和encoder-decoder架构的边界。

循环模型通常沿输入和输出序列的符号位置进行因子计算,将位置与计算时间中的步骤对齐,它们生成隐藏状态序列ht, 作为前一个隐藏状态ht−1的函数和位置t的输入。这种固有的顺序性质阻碍了训练示例中的并行化,这在较长的序列长度下变得至关重要,因为内存约束限制了样本之间的批处理。最近的研究通过因子分解技巧和条件计算显著提高了计算效率,同时也提高了模型在后者情况下的性能。然而,顺序计算的基本约束仍然存在。

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

本文提出了Transformer,这是一种避免重复的模型架构,而是完全依赖于注意机制来绘制输入和输出之间的全局依赖关系。

Transformer允许更多的并行化,并且在8个P100 GPU上经过12小时的训练后,可以达到翻译质量的新SOTA。

2 背景

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

self-attention,自我注意力,有时被称为内部注意力,是一种将单个序列的不同位置联系起来以计算该序列的表示的注意机制。自注意已经成功地应用于阅读理解、抽象总结、文本蕴涵和学习任务无关的句子表征等多种任务中。

端到端的记忆网路使用循环注意力机制而不是顺序排列的递归,在简单的语言问答和语言建模任务中表现良好。

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

3 模型结构

大多数具有竞争力的序列转换模型都具有encoder-decoder结构,encoder将符号表示的输入序列X =(X1,···,Xn)映射为一个连续表示的序列Z=(Z1,···,Zn)。给定Z,解码器以一次生成一个字符的方式生成输出序列Y = (Y1,···,Ym)。模型的每一步都是自回归的,在生成下一个符号时,将之前生成的符号作为额外的输入。

image.png Transformer遵循这个整体架构,使用堆叠的self-attention层、point-wise层和全连接层,分别用于encoder和decoder。

3.1 encoeder和decoder 栈

encoder: 编码器由N = 6个相同层的layer组成。每一层有两个子层。第一种是多头自注意机制,第二种是简单的、完全连接的前馈网络。在每一个子层周围使用残差连接,然后进行层归一化。也就是说,每个子层的输出是: LayerNorm(x+Sublayer(x))LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层产生的输出维度为dmodel=512。

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

3.2 注意力机制

Attention机制可以描述为将一个query和一组key-value对映射到一个输出,其中query,keys,values和输出均是向量。输出是values的加权求和,其中每个value的权重 通过query与相应key的兼容性函数来计算。

image.png (left)缩放点积注意力(right)由并行的注意楼层组成的多头注意力

3.2.1 缩放点积注意力机制

本文提出的特殊的注意力名为“缩放点积注意力(left)”,输入包括dk维度的query、keys和dv的value组成。计算query和所有key的点积,再除以dk\sqrt{d_k},然后再通过softmax函数来获取values的权重。

在实际应用中,一组query转换成一个矩阵Q,同时应用attention函数。key和valuue也同样被转换成矩阵K和矩阵V。按照如下方式计算输出矩阵:

Attention(Q,K,V)=softmax(QKtdk)Attention(Q,K,V)=softmax(\frac{QK^t}{\sqrt{d_k}})

additive attention和dot-product(multi-plicative) attention是最常用的两个attention 函数。dot-product attention除了没有使用缩放因子1dk\frac{1}{\sqrt{d_k}}。 additive attention使用一个具有单隐层的前馈神经网络来计算兼容性函数。尽管在理论上两者的复杂度相似,但是在实践中dot-product attention要快得多,而且空间效率更高,这是因为它可以使用高度优化的矩阵乘法代码来实现。

dk\sqrt{d_k}的值较小时,这两种方法性能表现的相近,当dk\sqrt{d_k}比较大时,addtitive attention表现优于 dot-product attention。我们认为对于大的dk\sqrt{d_k},点积在数量级上增长的幅度大,将softmax函数推向具有极小梯度的区域。为了抵消这种影响,我们对点积扩展1dk\frac{1}{\sqrt{d_k}} 倍。

3.2.2 多头注意力

相比于使dmodeld_{model}维度的queries,keys,values执行一个attention函数,本文发现使用学习到的不同的线性映射把queries, keys 和 values线性映射到dk,dk,dvd_k,d_k,d_v维度h次是有益的。在queries,keys和values的每个映射版本上,我们并行的执行attention函数,生成dvd_v维输出值。它们被拼接起来再次映射,生成一个最终值,如(right)中所示。

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

MultiHeadQKV=Concat(head1,head2,headh)WO其中headi=Attention(QWiQKWiKVWiV)MultiHead(Q,K,V)= Concat(head_1,head_2,···,head_h)W^O \\ 其中 head_i = Attention(Q·{W_i}^Q,K·{W_i}^K,V·{W_i}^V)

其中,投影为参数矩阵WiQRdmodel×dkWiKRdmodel×dkWiVRdmodel×dv{W_i}^Q∈R^{d_{model}×d_k},{W_i}^K∈R^{d_{model}×d_k},{W_i}^V∈R^{d_{model}×d_v}

本文采用h = 8个并行attention层或head。 对每个head,我们使用dk=dv=dmodel/h=64d_k = d_v = d_{model} / h = 64 。 由于每个head尺寸上的减小,总的计算成本与具有全部维度的单个head attention相似。

注意力机制在模型中的应用

多头注意力机制在Transformer中的三种不同方式的应用
  • 在encoder-decoder层中,query来自前面的decoder层,而keys和values来自encoder中输出。这让decoer中的每个位置都能关注到输入序列中的所有位置,这是模仿序列到序列模型中典型的编码器—解码器的attention机制。
  • encoder中的self-attention层。在self-attention层中,所有的key、value和query来自同一个地方,在这里是encoder中前一层的输出。 encoder中的每个位置都可以关注到encoder上一层的所有位置。
  • 类似地,decoder中的self-attention层允许decoder中的每个位置都关注decoder层中当前位置之前的所有位置(包括当前位置)。 为了保持解码器的自回归特性,需要防止解码器中的信息向左流动。我们在scaled dot-product attention的内部 ,通过屏蔽softmax输入中所有的非法连接值(设置为 −∞)实现了这一点。

3.3 位置前馈网络

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

FFN(x)=max(0,xW1+b1)W2+b2FFN(x) = max(0,xW_1 + b_1)W_2 + b_2

尽管线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。 它的另一种描述方式是两个内核大小为1的卷积。 输入和输出的维度为dmodel=512d_{model} = 512,内部层的维度为dff=2048d_{ff} = 2048

3.4 词嵌入和softmax

与其他序列转换模型类似,本文使用学习嵌入将输入token和输出token转换为维度dmodeld_{model}的向量。还使用通常学习的线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在Transformer模型中,在两个嵌入层和pre-softmax线性变换之间共享相同的权矩阵,在嵌入层中,将这些权重乘以dmodel{d_{model}}

位置编码

由于Transofrmer模型不包含循环或卷积,为了让模型利用序列的顺序信息,必须加入序列中关于字符相对或者绝对位置的一些信息。 为此,我们在encoder和decoder堆栈底部的输入嵌入中添加“位置编码”。 位置编码和嵌入的维度dmodeld_{model}相同,所以它们两个可以相加。有多种位置编码可以选择,例如通过学习得到的位置编码和固定的位置编码。

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

PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)其中pos是位置,i是维度。PE(_{pos,2i})=sin(pos/10000^{2i/d_{model}})\\ PE(_{pos,2i+1})=cos(pos/10000^{2i/d_{model}})\\ 其中pos是位置,i是维度。

也就是说,位置编码的每个维度对应于一个正弦曲线。波长形成了从2π到10000·2π的几何数列。之所以选择这个函数,是因为假设它可以让模型很容易地通过相对位置来学习,因为对任意确定的偏移k, PEpos+kPE_{_{pos+k}}可以表示为PE_{pos}的线性函数。

本文还尝试使用预先学习的positional embeddings来代替正弦波,发现这两个版本产生了几乎相同的结果。之所以选择正弦曲线,是因为它允许模型扩展到比训练中遇到的序列长度更长的序列。

为什么自注意力机制

在这一节中,本文将self-attention层与常用的recurrent层和convolutional层进行各方面的比较,比较的方式是 将一个可变长度的符号表示序列(x1,x2,xn)(x_1,x_2,···,x_n)映射到另一个等长序列(z1,z2,,zn)(z_1,z_2,···,z_n),其中xi,xnRdx_i,x_n∈R^{d},比如在典型的序列转换的encoder或decoder中的隐藏层。综合考虑了三个因素,最终选择了self-attention。

  1. 每层的总计算复杂度。
  2. 可以并行化的计算量,通过所需的最小序列操作数衡量。
  3. 网络模型中长距离依赖关系的路径长度。在序列转换任务中,学习长距离依赖关系是一个关键挑战。影响学习这种依赖关系能力是的一个关键因素是网络中向前和向后信号必需经过的路径长度。输入和输出序列任意位置组合之间的路径越短,学习远程依赖关系就更容易。因此,本文还比较了不同层类型之间组成的网络中任意两个输入和输出位置之间的最大路径长度。
Layer TypeComplexity per LayerSequential
Operations
Maximun Path Length
Self-AttentionO(n2×dn^2×d)O(1)O(1)
RecurrentO(n×d2n×d^2)O(n)O(1)
ConvolutionO(k×n×d2k×n×d^2)o(1)O(1)
Self-Aytention(restricted)O(r×n×dr×n×d)O(1)o(n/r)

如表所示,self-attention层用常数次O(1)的操作连接所有位置,而recurrent层需要O(n)顺序操作。在计算复杂度方面,当序列长度N小于表示维度D时,self-attention层比recurrent层更快,这是使用最先进的机器翻译模型表示句子时的常见情况。为了提高包含很长序列的任务的计算性能,可以仅在以输出位置为中心,半径为r的的领域内使用self-attention。这将使最大路径长度增长到O(n/r)。

核宽度为k < n的单个卷积层不能连接每一对输入输出的位置。在相邻核的情况下,这样做需要O(n/k)个卷积层的堆栈,在扩展卷积的情况下需要O(logk(n))个卷积层,从而增加网络中任意两个位置之间最长路径的长度。卷积层的成本通常比循环层高k倍。然而,可分离卷积大大降低了复杂性,为O(knd+nd2k·n·d + n·d^2)。然而,即使k = n,可分离卷积的复杂性也等于self-attention和point-wise feed-forward层的组合,这是Transformer模型中采用的方法。

一个随之而来的好处是,self-attention可以产生更多可解释的模型。从Transformer模型中研究attention的分布,并在附录中展示和讨论示例。每个attention head不仅清楚地学习到执行不同的任务,还表现出了许多和句子的句法和语义结构相关的行为。

5 训练

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

5.1 训练数据和batch

本文在标准的WMT 2014英语-德语数据集上进行训练,该数据集由大约450万句对组成。句子使用字节对编码进行编码,该编码具有大约37000个标记的共享源-目标词汇表。对于英语-法语,使用了更大的WMT 2014英语-法语数据集,该数据集由36M个句子组成,并将token拆分为32000个词片词汇。句子对按近似序列长度进行批处理。每个训练批包含一组句子对,其中包含大约25000个源标记和25000个目标标记。

5.2 硬件和时间

在一台带有8个NVIDIA P100 gpu的机器上训练Transformer模型。对于使用本文中描述的超参数的基本模型,每个训练步骤大约需要0.4秒。对基本模型进行了总共10万步或12小时的训练。对于Transformer大型模型(如表3所示),步长为1.0秒。大模型训练了30万步(3.5天)。

5.3 优化器

使用Adam优化器,β1 = 0.9, β2 = 0.98, λ = 10(9)10^(−9)。在训练过程中,根据以下公式改变了学习率:

lrate=dmodel0.5min(step_numwarmup_steps1.5)lrate = d_{model}^{-0.5}·min(step\_num·warmup\_steps^{-1.5})

这对应于在第一次warmup_steps 步骤中线性地增加学习速率,并且随后将其与步骤数的平方根成比例地减小。 我们使用warmup_steps1.5warmup\_steps^{-1.5}

5.4 正则化

在训练中使用三种类型的正则化:

Residual Dropout:将dropout应用于每个子层的输出,然后将其添加到子层输入并归一化。此外,将dropout应用于编码器和解码器堆栈中的嵌入和位置编码之和。对于基本模型,我们使用PdropP_{drop} = 0.1的速率。

Label Smoothing:在训练过程中,我们采用了值εls=0.1ε_{ls} = 0.1的标签平滑。这会影响ppl,因为模型学习到了更多的不确定性,但提高了准确率和BLEU评分。

结果

Tranformer在English-to-French newstest2014和English-to-German测试中取得了比以前的最先进型号更好的BLEU分数,而培训费用只是其中的一小部分。

image.png

6.1 机器翻译

在WMT 2014英德翻译任务中,Transformer模型(表中的Transformer(big))比之前报道的最佳模型(包括集成)高出2.0个BLEU以上,建立了新的最先进的BLEU分数28.4。该模型的配置列在表3的底线。训练时间为3.5天,使用的是8个P100图形处理器。甚至基本模型也超过了所有以前发表的模型和集合,而训练成本只是任何竞争模型的一小部分。

在WMT 2014英法翻译任务上,Transformer大模型获得了41.0的BLEU分数,优于之前发布的所有单一模型,而训练成本不到之前最先进模型的1/4。训练为英语到法语的Transformer(大)模型使用的辍学率PdropP_{drop}= 0.1,而不是0.3。

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

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

6.2模型变体

为了评估Transformer不同组件的重要性,我们以不同的方式改变我们的基础模型,观测在开发集newstest2013上英文-德文翻译的性能变化。使用前一节所述的beam search,但没有平均checkpoint,在下表中列出这些结果。

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

在下表行(B)中,观察到减小注意键大小dkd_k会损害模型质量。这表明确定兼容性并不容易,一个比点积更复杂的兼容性函数可能是有益的。在(C)和(D)行中进一步观察到,正如预期的那样,更大的模型更好,并且dropout对于避免过度拟合非常有帮助。在(E)行中,用学习的位置嵌入替换正弦位置编码,并观察到与基本模型几乎相同的结果。

image.png

6.3英文选区解析

为了评估Transformer是否可以推广到其他任务,对英语选区解析进行了实验。这项任务提出了具体的挑战:输出受到强烈的结构限制,并且比输入长得多。此外,RNN序列到序列模型还不能在小数据体系中获得最先进的结果。

在Penn Treebank的Wall Street Journal (WSJ)部分上训练了一个dmodel = 1024的4层转换器,大约训练了40K个句子。还在半监督设置中训练它,使用大约17M个句子的更大的高置信度和BerkleyParser语料库。仅在WSJ设置中使用了16K tokens的词汇表,在半监督设置中使用了32K tokens的词汇表。

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

在下表中的结果表明,尽管缺乏针对特定任务的调优,Transformer模型表现出奇地好,除了递归神经网络语法(Recurrent Neural Network Grammar)外,它的结果比之前报道的所有模型都要好。

image.png 与RNN序列到序列模型相比,Transformer即使只在包含40K个句子的WSJ训练集上训练,其性能也优于BerkeleyParser。

结论

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

对于翻译任务,Transformer的训练速度明显快于基于循环层或卷积层的体系结构。在WMT 2014的英语到德语和WMT 2014的英语到法语翻译任务上,都达到了一个新的水平。在前一个任务中,Transformer最佳模型甚至优于所有先前的所有模型。

对基于注意力的模型的未来感到兴奋,并计划将其应用于其他任务。未来计划将Transformer扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意力机制,以有效地处理大量的输入和输出,如图像、音频和视频。让生成具有更少的顺序性是我们的另一个研究目标。 用来训练和评估模型的代码可以在github.com/ tensorflow…上找到。