注意力就是你所需的一切
Attention is All you Need (acm.org)
概要
主要序列转换模型是基于复杂的循环或者卷积神经网络的,它包括了编码器和解码器。我们提出了一个新的简单网络架构,Transformer,基于单一的注意力机制,完全不适用递归和卷积。实验在俩个机器翻译任务上展示了这些模型的优秀的品质,同时更加并行化只需要更少的训练时间。我们的模型在WMT2014英语生产翻译任务上达到了28.4的BLEU,比现有最佳的结果(包括组合)提高了2BLEU。在一个WMT 2014英语-发育的翻译任务重,在8个GPU上训练了3.5天之后我们模型简历了新的简单模型,最高的BLEU分数,从文献中得到最好模型的一小部分训练成本。
1 介绍
在实践中循环神经网络,长短期记忆网络和门控循环单元网络,已经在序列模型和如同语言模型与机器翻译模型的传到问题中,被牢牢确立为最先进的方法。此后许多努力仍在继续以突破循环语言模型和编码器解码器架构的边界。
循环模型通常沿着输入和输出序列的符号位置来进行计算分解。将位置与计算时间中的步骤对其,它生成隐藏状态序列$h_t$,作为上一个隐藏层状态$h_{t-1}$和位置的输入函数。这个内在的序列在训练中排除了并行性,并行性在长序列上很重要,由于内存约束限制了跨样例的批处理。最近的工作通过因式分解的技巧和条件计算得到了显著的提升,同时也提升了模型在之后例子中的性能。然而基本的顺序计算限制还是存在。
注意力机制已经成为了引人注目的序列建模和多变任务中的转换模型的重要组成部分,允许模型对以来进行建模而不管它们的在输入或输出序列中的距离。然而除了少数情况外,这样的attention机制被用来与RNN一起使用。
在这个工作中我们提出了Transformer,一个避免了循环和而是以来整个注意力机制去绘制在输入输出中的整个依赖。Transformer允许显著的更多并行,在P100GPU上训练了12个小时后,可以让翻译质量达到一个新的境界。
2 背景
减少顺序计算的目标也构成了Extended Neural GPU,ByteNet,ConvS2S的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入输出位置的隐藏表示。在这个模型中,将来自俩个任意输入或输出位置的信号联系起来所需的操作数量随着位置之间的距离而增加,对于ConvS2S是线性的,对于ByteNet是对数的。这让学习距离和位置之间的关系变得很难。在Transformer中这被简化成为了一个常量超操作,尽管关于平均注意力加权位置降低了有效的决议,我们使用多头注意力抵消了影响,如3.2章所述。
一些时候,自注意力机制被叫做内部注意力,关联了一个序列中的相关的不同的电,以计算序列的表示。自注意力机制成功的备用在多个任务上其中包括:阅读理解,摘要概要,文字循环和学习与任务无关的句子的表示。
端到端的内存网络是基于循环注意力机制的而不是序列排列的重复,已经展示了在简单问题回答和语言建模问题上的良好性能。
然而据我们所知,Transformer是第一个完全依赖注意力机制模型,以计算输入和输出而不适用序列排列的RNN或者卷积。在之后的章节中,我们将描述Transformer,促进自注意力机制和讨论相对于其他模型的优势。
3 模型架构
最局竞争的神经序列转换模型有一个解码器和编码器结构。其中,解码器映射用符号表示的输入序列($x_1,...,x_n$)到连续的表示序列z=($z_1,...,z_n$)中,给定z,解码器生成输出序列($y_1,..,y_m$)符号,一次一个元素。在每一步模型都是自回归的,在生成下一个符号时,使用生先前生成的符号作为附加输入。Tansformer遵循寻使用堆叠的自我关注和点方向,对编码层和解码层进行全链接,分别展示在图1左右俩边。
3.1编码器和解码器堆叠
编码器:编码器是由N为6的相等的层堆叠而成的。每个层有俩个子层。 第一个多头自注意力机制,第二个是简单的positionwise全链接前馈网络。我们使用残差链接环绕着俩层,然后是层归一化。每一个子层的输出都是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是一个实现了子层自身的函数。以方便这些残差连接,在模型中所有的子层和嵌入层产生维度$d_{model}=512$的输出
解码器:解码器也是由N为6的相等的层堆叠而成的。除了在每个编码器层添加俩个子层之外,解码器插入了第三个子层,它对编码器栈执行多头注意力。类似编码器,我们使用残差链接包围每个子层,然后是归一化层。我们也改进了在decoder栈中的自注意力子层以防止位置关注后续位置。这种遮蔽,结合了一个事实:输出嵌入偏移一个位置,确保对于位置i的预测只能依赖位置小于i的已知输出。
3.2 注意力
注意力函数可以表述将一组查询和一组键值对映射到输出,其中query,key,value和删除都是向量。通过值的加权和计算,其中分配给每个权重由查询与相应的键的兼容性函数计算。
3.2.1自注意力机制
图2:(左)缩放点积注意力(右) 由几个注意力层并行运行的多头点积注意力。
我们叫通常的注意力缩放点击注意力(图2)。输入由query和$d_k$个维度key,和$d_v$维度个值构成。我们计算所有键查询的点积,每个除以$\sqrt{d_k}$,并且使用softmax函数以获得值的权重。
事实上我们同时在一组query上计算注意力函数,组成一个矩阵Q。key和value也组合到矩阵K和V中。我们计算输出矩阵
$$ \text{Attention}(Q,K,V)=\text{softmax}(\frac{QK^T}{\sqrt{d_k}})V $$
在注意力机制中,兼容性函数(compatibility function)通常是指用于计算查询(query)与键(key)之间的相关性的函数。这个函数的结果通常用于生成注意力权重,进而用于加权求和值(value)向量,得到注意力得分
俩个最常用的方法是加性注意力和点积(多用途)注意力。点积注意力和我们的算法完全相同,除了比例因子$\frac1{\sqrt{d_k}}$。加性注意力使用前馈神经网络和但隐藏层计算兼容函数。虽然他们在理论上相似,但是点积注意力事实上更快更省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
对于较小的$d_k$值,俩个方法很相似,在不缩放较大$d_k$值的情况下加性注意力由于点积注意力。我们认为对于更大的$d_k$值,点积会变得很大,将softmax函数推入具有极小梯度的区域。为了抵消这个影响,我们通过$\frac1{\sqrt{d_k}}$缩放点
3.2.2多头注意力
不同于使用$d_{model}$的key,value和query维度执行一次注意力函数,我们发现他有助于线性投影,我们发现将query,key,value分别用不同的,科学系线性投影到$d_k,d_k,d_v$个维度是有益的。在query,key,value的每个版本上,我们并行的执行注意力,产生$d_v$维度的输出值。将它们串联起来并再次进行投影,得到最终值如图2所示
多头注意力机制允许模型共同处理来自不同表示不同位置的子空间的信息。对于单头注意力机制,平均值会抑制这一点。
$$ \begin{aligned}\mathrm{MultiHead}(Q,K,V)&=\mathrm{Concat}(\mathrm{head}_1,...,\mathrm{head}_\mathrm{h})W^O\\\mathrm{where~head_i}&=\mathrm{Attention}(QW_i^Q,KW_i^K,VW_i^V)\end{aligned} $$
$$ \begin{aligned}&\text{其中的投影是参数矩阵}W_i^Q\in\mathbb{R}^{d_{\mathrm{model}}\times d_k},W_i^K\in\mathbb{R}^{d_{\mathrm{model}}\times d_k},W_i^V\in\mathbb{R}^{d_{\mathrm{model}}\times d_\upsilon}\\&\mathrm{and~}W^O\in\mathbb{R}^{hd_v\times d_{\mathrm{model}}}.\end{aligned} $$
在这个工作中我们使用了h=8的平行注意力层或头。对于每一个我们使用$d_k=d_v=d_\text{model}/h=64.$由于减少了每个头的维度,整个计算代价会比单头的注意力的全维度来的少。
3.2.3 注意力在我们模型中的应用
Transformer在三个不同的方面使用了多头注意力机制。
- 在编码器解码器注意力层,query,来自前一个解码器层,记忆key和值来自encoder的输出。这允许解码器的每个位置去处理输入序列中的所有位置。这模仿了seq2seq模型中的编码器和解码器注意力机制
- 编码器包括了注意力层。在自注意层所有的key,value,query都来自一个位置,在这个例子中,是编码器前一层的输出。编码器中的每个位置可以处理编码器前一层的所有位置。
- 类似的,编码器中的自注意力层允许每个编码器中的位置去处理编码器中国的所有点直至并包括该位置。我们需要防止左侧的信息留到编码器以保护自回归特性。我们通过屏蔽(设置为-∞)softmax输入中对应于非法连接的所有值来实现缩放点积注意力。如图2。
3.3 Position-wise 前馈网络
除了注意力子层,在我们编码器和解码器中的每个层包含了全连接的前馈网络,它被单独和分别的用在每个位置。它在这之间用Relu激活包括了俩个线性变化。
$$ \mathrm{FFN}(x)=\max(0,xW_1+b_1)W_2+b_2 $$
不同位置的线性变化是相同的,它们使用不同层的不同参数。另一种描述它们的方式是俩个核大小为1的卷积。输入和输出的维度$d_{model}=512$,内部层有$d_{ff}=2048$维。
3.4 嵌入和softmax
类似于其他序列转换模型,我们使用使用可学习的嵌入来转化输入和输出token为一个$d_{model}$维的向量。我们同时使用科学系的线性变化和softmax函数将解码器输出转化为下一个token的概率。在我们的模型中,我们在两个嵌入层和pre-softmax线性变换之间共享相同的权矩阵,在嵌入层,我们把这些权重乘以$\sqrt{d_{model}}$。
3.5 位置编码
因为我们的模型不包含循环和卷积,以便为模型模型的顺序,我们必须注入一些关于token在序列中的相对或绝对位置信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了“位置编码”。位置编码于embedding有相同的维度,这样俩者就可以相加了。位置编码有很多选择,可以学习也可以固定。
在这个工作中,我们使用正弦和预先函数作为不同的频率。
$$ PE_{(pos,2i)}=sin(pos/10000^{2i/d_{\mathrm{model}}})\\PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{\mathrm{model}}}) $$
其中pos是位置,i是维度。也就是说每个位置编码的维度对应正弦曲线,波长形成从2π到10000·2π的几何级数。我们选择了这个函数因为我们它让模型更易通过相对位置进行学习,因为对于任意固定的偏移量k,$PE_{pos+k}$可以表示$PE_{pos}$线性函数。
我们还尝试使用学习得到位置的嵌入,发现这俩个版本产生了几乎相同的结果(见表3的第E行)。我们选择正弦曲线版本因为它运行模型外推到比训练期间遇到的序列长度更长的序列。
4为什么是自注意力
在这以章,我们将主自注意力机制的各个方面与通常用于映射一个可变长度符号($x_1,...,x_n$)到另一个相等长度的序列表示的循环神经网络与卷积层相比较,其中$x_i,z_i\in\mathbb{R}^d$,列入在序列转换编码器和解码器中的隐藏层。
一个是每层的总计算复杂度。另一个是可以被并行计算的量,通过最小的顺序操作数量来衡量。
第三是网络中远程以来关系的路径长度。学习长依赖是一些序列转换任务的关键挑战。一个关键的因素影响了学习这种长路径的能力,网络中向前和向后信号必须经过的路径长度。在输入和输出序列中位置组合之间的路径越短,学习长距依赖关系就越容易。因此我们也比较在在不同层类型的网络组成中俩个输入和输出位置之间最大路径的长度。
表1:最大路径长度,每一层的复杂度和对于不同层类型的序列操作最小值。n是序列长度,d表示维度,k是卷积的核心数,R是受限制的注意力 中的邻域大小。
图表1中所记载的,自注意力层通过固定数量的操作连接了所有位置,但是循环层需要O(n)的顺序操作。在计算复杂度方面,当序列长度n小于维数d时,自注意力层比循环层快,这是机器翻译中最先进模型使用的句子表示最常见的情况,比如word-piece和byte-pair 表示。为了增加长序列的执行性能,自注意力机制可以限制值考虑输入序列以各自输出为中心的大小为r的领域内。这使得最大路径长度增加到$O(n/r)$。我们计划在未来的工作中进一步研究这个方法。
一个核大小为k<n的卷积层,不连接所有的输入输出对的位置。在连续核的情况下作这样需要O(n/k)个卷积层栈,或者在空洞卷积中需要$O(log_k(n))$个,从而增加网络中任意俩个位置的最长路径长度。卷积层通常比循环层代价高k倍。然而,可分离卷积显著减少了复杂性到$\dot{O(k\cdot n\cdot d+n\cdot d^{2})}$。然而甚至于k=n,可分离卷积的复杂性也等于自注意层和逐点前馈层的组合,也就是我们在模型中使用的方法。
附带的好处是,自注意力层可能产生更易解释的模型。我们检查我们模型中注意力的分布,并在附录中给出讨论示例。单独注意力头不清除的学会执行不同的任务,许多表现出与句子和语义结构有关的行为。