摘要
提出了一个 Transformer 模型,针对于一个机器翻译的小任务上表现结果比当时所有模型的效果都好,并且架构相比其它更加简单,后面就火到了发现什么方向都能用的地步。
介绍
循环神经网络,特别是长短时记忆[ 13 ]和门控循环[ 7 ]神经网络,已经成为诸如语言建模和机器翻译[ 35、2、5]等序列建模和转录问题中最先进的方法。
当时是 2017 年,因此 RNN 循环神经网络占据主流。
自那时以来,大量的努力一直在推动循环语言模型和编码器-解码器架构[ 38、24、15]的界限。
递归模型通常沿着输入和输出序列的符号位置进行因子计算。将位置与计算时间中的步骤对齐,它们生成一个隐藏状态序列ht,作为前一个隐藏状态ht - 1和位置t的输入的函数。这种固有的顺序特性排除了训练示例中的并行化,这在较长的序列长度时变得至关重要,因为内存约束限制了跨示例的批处理。
这里主要讲了 RNN 的特点是什么,以及其缺点是什么。
在 RNN 里面给到一个序列,其计算方式是把这个序列从左到右一步一步的往前做,假设一个序列是一个句子的话,其计算就是一个词一个词的看,对于第 t 个词,它会计算一个输出叫 Ht,Ht 也被称为隐藏状态,然后它的 Ht 是由前面一个词的隐藏状态叫 Ht-1 和当前第 t 个词本身决定的,这样子它就可以把前面学习到的历史信息通过 Ht-1 放到当下,然后和当前的词做一些计算然后得到输出。这也是RNN如何能够有效处理时序信息的一个关键之所在。
但这也是 RNN 的问题所在,第一个问题是因为其是时序计算的方式,这难以并行,计算效率低下。
第二个问题则是因为历史信息是一步一步往后传递的,如果时序比较长的话,那么在很早期的那些时序信息在后面的时候可能会被丢弃,如果不想丢掉那么就得要让 Ht 比较大,那么内存开销就会很大。
最近的工作通过因式分解技巧[ 21 ]和条件计算[ 32 ]在计算效率方面取得了显著的改进,同时也提高了后者的模型性能。然而,顺序计算的基本约束依然存在。
注意力机制已经成为各种任务中引人注目的序列建模和转录模型的一个组成部分,允许建模依赖关系,而不考虑它们在输入或输出序列[ 2、19]中的距离。然而,在除少数情况外的所有情况下[ 27 ],这类注意力机制都与递归网络结合使用。
在这项工作中,我们提出了Transformer,一种不再使用循环神经网络的模型架构,而完全依靠注意力机制来绘制输入和输出之间的全局依赖关系。Transformer允许显著更多的并行化,并且在8个P100 GPU上经过短短12小时的训练后可以达到翻译质量的新境界。
背景
减少顺序计算的目标也构成了扩展神经GPU [ 16 ]、ByteNet [ 18 ]和ConvS2S [ 9 ]的基础,它们都使用卷积神经网络作为基本构建模块,对所有输入和输出位置并行计算隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号相关联所需的操作数在位置之间的距离上呈线性增长,对于Conv S2S则呈线性增长,而对于Byte Net则呈对数增长。这使得学习远距离位置之间的依赖关系变得更加困难[ 12 ]。在Transformer中,这被减少到一个恒定的操作数量,尽管是以平均注意力加权位置降低有效分辨率为代价的,我们用多头注意力来抵消这种影响,如3.2节所述。
自注意力,有时称为帧内注意力,是一种将单个序列的不同位置联系起来的注意力机制,用于计算序列的表示。自注意力已成功应用于多种任务,包括阅读理解、抽象概括、文本蕴涵和学习任务无关的句子表征[ 4、27、28、22]。
端到端记忆网络基于循环注意力机制而非序列对齐的循环,在简单语言问答和语言建模任务中表现良好[ 34 ]。
然而,据我们所知,Transformer是第一个完全依靠自注意力计算其输入和输出表示的转录模型,而不使用序列对齐的RNN或卷积。在下面的部分中,我们将描述Transformer,激发自注意力,并讨论它相对于[ 17、18]和[ 9 ]等模型的优势。
网络架构(重点)
大多数竞争性神经序列转录模型都有一个编码器-解码器结构[ 5、2、35]。在这里,编码器将符号表示的输入序列( x1 , … , xn)映射到连续表示的序列z = ( z1 , … , zn)。
假设是一个句子的话,有 n 个词的话,那么 Xn 就表示第 n 个词,而编码器的作用就是将这个句子序列表示为一个长度也为 n 的但是其中的每一个元素都是对应的 Xn 的一个向量表示,即 Zn。Zn 就表示第 n 个词的一个向量的表示,这便是编码器的输出。
给定z,解码器然后生成一个输出序列( y1 , … , ym)的符号一次一个元素。在每一步,模型都是自回归的[ 10 ],在生成下一个符号时,消耗先前生成的符号作为额外的输入。
对于解码器来说,其会拿到编码器的输出,然后会生成一个长为 m (m可能等于n 也可能不等于 n,比如英文翻译成中文就很可能两个句子不一样长)的一个序列 Y,它跟编码器不一样的地方在于在解码器中,其词是一个一个生成的(对于编码器来说,其很有可能是一次性能看全整个句子,而在解码的时候只能一个一个生成),这个东西就叫做一个自回归,即 auto-regressive 的一个模型。
什么意思?
比如在最开始给定向量序列 Z,生成第一个输出是 Y1,在拿到 Y1 之后,就可以继续生成 Y2,因此如果要生成 Yt 的话,就应该要把之前所有的 Y1 到 Yt-1 全部拿到,也就是说在翻译的时候是一个词一个词的往外蹦,在过去时刻的输出也会作为当前时刻的输入,所以这个叫做自回归。
Transformer遵循这种整体架构,编码器和解码器都使用堆叠的自注意力和逐点全连接层,分别如图1的左半部分和右半部分所示。
编码器和解码器堆栈
Encoder
编码器由N = 6个相同层的堆栈组成(也就是 6 个相同的Encoder模块)。每层有两个子层(即上面一个Encoder模块中的两个部分)。第一种是多头自注意力机制,第二种是简单的位置全连接前馈网络(说白了就是一个MLP,即几个全连接层的简单堆叠而已)。我们在两个子层的每一个周围使用一个残差连接[ 11 ],然后进行层规一化[ 1 ]。也就是说,每个子层的输出是LayerNorm( x +子层( x) ),其中子层( x )是子层本身实现的函数。为了便于这些残差连接,模型中的所有子层以及嵌入层都会产生维数dmodel = 512的输出。
残差连接需要输入和输出是一样大小,如果不一样大小的话就得做投影,因此为了简单起见,本文就把每一个层它的输出的维度变成了 512 。
因此对于这个模型调参也是好调的,就是两个参数,一个是总共有多少层的编解码器,而另一个就是这个 dmodel ,也就是维度输出。
LayerNorm和BatchNorm的抉择问题
BatchNorm是什么:
mini-batch是什么:
LayerNorm是什么:
为什么在Transformer中使用layerNorm而不是batchNorm:
Decoder
解码器也是由N = 6个相同层的堆栈组成。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,它对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改解码器堆栈中的自注意力子层,以防止位置出现在后续位置。这种掩蔽,结合输出嵌入被一个位置抵消的事实,保证了对位置i的预测只能依赖于小于i位置的已知输出。
因为在解码器的时候做的是一个自回归,也就是说当前的输出的输入集是上面一些时刻的输出,意味着是说在做预测的时候,模型当然不能看到之后的那些时刻的输出,但是在注意力机制里面,它每一次能看到整个完整的输入,所以这个地方要避免这个情况发生,也就是说在解码器训练的时候,在预测第 t 个时刻的输出的时候不应该看到 t 时刻以后的那些输入,而做法就是通过一个带掩码的注意力机制。
Attention
注意力函数可以描述为将一个查询和一组键值对映射到一个输出,其中查询、键、值和输出都是向量。输出 output 是值 value 的加权和,其中分配给每个值的权重由查询与相应键的兼容函数计算。
不同的注意力机制有不同的算法。
假设现在有三个value和三个对应的key:
假设现在给一个query,这个query跟第一个和第二个key比较近,那么输出就是这三个value的相加,但是query离得近的第一个key和第二个key这两个key的权重会大一下,而第三个key的权重因为隔得远所以就会小一些(下图黄色部分):
因为这个权重是等价于query和对应key的相似度的。
同样道理,假设又有一个query,但是他是跟最后那一个key比较像的话,那么这样子再去算输出value值的时候,就会发现其对后面分配的权重会更高一些(下图绿色部分):
此时就会得到一个新的输出,虽然key、value并没有变,但是随着 query 的改变,因为权重分配不一样,导致最后的输出会不一样,这就是注意力机制。
上图的缩放点积注意力机制图示中的 MaxMul 的意思是做矩阵乘法嗷。
Scaled Dot-Product Attention(缩放点积注意力)
因为不同的相似度函数导致不一样的注意力的版本,所以接下来这一章讲的就是 Transformer 自己用到的一个注意力计算函数。
我们称我们的注意力为"缩放点积注意力" (图2 )。输入由维度dk的查询和键以及维度dv的值组成。我们用所有键计算查询的点积,除以√dk,并应用一个softmax函数来获得值的权重。
意思是 query 和 key的长度是等长的,都等于 dk,然后value的值是 dv,那么输出同样也就是 dv。
具体计算是对于每一个query 和 key 做内积,然后将其作为相似度。
如果两个向量的long是一样的,那么内积值越大(也就是余弦值),那么就表示这两个向量的相似度越高。
如果内积为0了,那就等于是两个向量正交了,那就是没有相似度。
算出来之后再除以根号dk,也就是向量的长度,最后再用一个softmax来得到权重。
假设给一个 query,然后有 n 个key-value pair的话,那么就会算出 n 个值(query会跟每个key做内积)。算出来之后再放进softmax就会得到n个非负的而且加起来等于1的一个权重,然后这些权重作用在value上面就可以拿到最后的输出了。
在实践中肯定不能这么一个个算,因此下面给出了一种在实际中进行计算的方式。
在实践中,我们同时计算一组查询的注意力函数,并将其打包成矩阵Q。键和值也打包成矩阵K和V。我们计算输出的矩阵为:
两个最常用的注意力函数是加性注意力[ 2 ]和点积(乘性)注意力。点积注意与我们的算法相同,除了缩放因子1√dk。加性注意力使用具有单隐层的前馈网络计算相容性函数。虽然两者在理论复杂度上相似,但点积注意力在实际应用中速度更快,空间效率更高,因为它可以使用高度优化的矩阵乘法代码实现。
而对于较小的dk值,两种机制的表现类似,对于较大的dk值,相加注意力优于不缩放的点积注意力[ 3 ]。我们猜想,对于dk的大值,点积的大小会变大,从而将softmax函数推到梯度极小的区域4。为了抵消这种影响,我们对点积进行1√dk的缩放。
Multi-Head Attention
与使用dmodel-dimensional键、值和查询执行单一的注意力函数不同,我们发现将查询、键和值h次线性投影到dk、dk和dv维度分别是有益的。在这些查询、键和值的每个投影版本上,我们然后并行执行注意力函数,生成dv维输出值。这些被串联起来并再次投影,得到最终值,如图2所示。
多头注意力允许模型在不同位置共同关注来自不同表示子空间的信息。在单个注意头的情况下,平均抑制了这一点。
其中,投影为参数矩阵W Qi∈Rdmodel × dk,W Ki∈Rdmodel × dk,W Vi∈Rdmodel × dv和W O∈Rhdv × dmodel。
在这项工作中,我们采用h = 8个平行的注意层,或头。对于每一个,我们使用dk = dv = dmodel / h = 64。由于每个头的维度降低,总的计算成本与全维度的单头注意力相似。
注意力在我们模型中的应用
Transformer以三种不同的方式使用多头注意力:
1、在"编码器-解码器注意力"层中,查询来自前面的解码器层,而内存键和值来自编码器的输出。这使得解码器中的每个位置都可以参与输入序列中的所有位置。这模仿了序列到序列模型(如[ 38、2、9] )中典型的编码器-解码器注意力机制。
2、编码器包含自注意力层。在一个自注意力层中,所有的键、值和查询来自同一个地方(这就叫自注意力机制),在这种情况下,编码器中前一层的输出。编码器中的每个位置可以参与到编码器前一层的所有位置。
3、同样,解码器中的自注意力层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要在解码器中阻止向左的信息流动以保持自回归特性。我们通过屏蔽softmax输入中与非法连接相对应的所有(设置为-∞)值来实现缩放点积注意力的内部。见图2。
位置明智的前馈网络
除了注意力子层之外,我们的编码器和解码器中的每一层都包含一个全连接的前馈网络,该网络分别且相同地应用于每个位置。这包括两个线性变换,ReLU激活介于两者之间。
虽然线性变换在不同位置上是相同的,但它们使用不同的参数。描述这一点的另一种方式是两个核大小为1的卷积。输入输出的维数dmodel = 512,内层的维数dff = 2048。
Embeddings and Softmax
与其他序列转导模型类似,我们利用学习到的嵌入将输入和输出的标记转换为d维向量。我们还使用通常学习的线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层和pre - softmax线性变换之间共享相同的权重矩阵,类似于[ 30 ]。在嵌入层中,我们将这些权重乘以√dmodel。
位置编码
由于我们的模型不包含递归和卷积,为了使模型能够利用序列的顺序,我们必须在序列中注入一些关于令牌相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中加入"位置编码"。位置编码与嵌入具有相同的维数dmodel,因此可以将两者求和。位置编码有多种选择,有学习的,也有固定的[ 9 ]。
在这项工作中,我们使用不同频率的正弦和余弦函数:
其中pos为位置,i为维度。也就是说,位置编码的每个维度对应一个正弦曲线。波长从2 π到10000 · 2 π形成几何级数。我们选择了这个函数,因为我们假设它可以让模型很容易地学习相对位置,因为对于任何固定的偏移k,P Epos + k可以表示为P Epos的线性函数。
我们还使用学习到的位置嵌入[ 9 ]进行了实验,发现两个版本产生了几乎相同的结果(见表3行( E )) )。我们选择了正弦版本,因为它可以使模型外推到比训练过程中遇到的序列长度更长的序列。
结论
在这项工作中,我们提出了Transformer,第一个完全基于注意力的序列转录模型,用多头自注意力替换编码器-解码器架构中最常用的循环层。
对于翻译任务,Transformer可以比基于循环或卷积层的架构更快地进行训练。在WMT 2014英语-德语和WMT 2014英语-法语翻译任务中,我们实现了新的技术状态。在前一个任务中,我们最好的模型甚至优于以前报告的所有集合。
我们对基于注意力的模型的未来感到兴奋,并计划将它们应用于其他任务。我们计划将Transformer扩展到涉及文本以外的输入和输出模式的问题,并研究本地的、受限制的注意力机制,以有效地处理图像、音频和视频等大型输入和输出。使生成的序列更少是我们的另一个研究目标。