您现在的位置是:首页 >技术教程 >Transformer:Attention Is All You Need网站首页技术教程
Transformer:Attention Is All You Need
文章目录
摘要
主要的序列转导模型是基于复杂的循环或卷积神经网络,包括一个编码器和一个解码器。表现最好的模型还通过注意机制连接编码器和解码器。我们提出了一个新的简单的网络架构,Transformer,完全基于注意力机制,完全摒弃递归和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更具并行性,并且需要更少的训练时间。我们的模型在WMT 2014英语-德语翻译任务上实现了28.4 BLEU,比现有的最佳结果(包括集合)提高了2个BLEU以上。在WMT 2014英法翻译任务中,我们的模型在8个gpu上训练3.5天后,建立了一个新的单模型最先进的BLEU分数41.8,这是文献中最佳模型训练成本的一小部分。我们通过将Transformer成功地应用于具有大量和有限训练数据的英语选区解析,证明了它可以很好地推广到其他任务。
1、简介
递归神经网络,特别是长短期记忆[13]和门控递归[7]神经网络,已经被牢固地确立为序列建模和转导问题(如语言建模和机器翻译)的最新方法[35,2,5]。从那以后,大量的努力继续推动循环语言模型和编码器-解码器架构的边界[38,24,15]。
循环模型通常沿输入和输出序列的符号位置进行因子计算。将位置与计算时间中的步骤对齐,它们生成隐藏状态序列ht,作为前一个隐藏状态ht−1的函数和位置t的输入。这种固有的顺序性质排除了训练示例中的并行化,这在较长的序列长度下变得至关重要,因为内存约束限制了跨示例的批处理。最近的研究通过因式分解技巧[21]和条件计算[32]显著提高了计算效率,同时也提高了后者的模型性能。然而,顺序计算的基本约束仍然存在。
注意机制已经成为各种任务中引人注目的序列建模和转导模型的组成部分,允许对依赖关系进行建模,而不考虑它们在输入或输出序列中的距离[2,19]。然而,在除少数情况外的所有情况下,这种注意机制都与循环网络结合使用。
在这项工作中,我们提出了Transformer,这是一种避免重复的模型架构,而是完全依赖于注意机制来绘制输入和输出之间的全局依赖关系。Transformer允许显着更多的并行化,并且在8个P100 gpu上经过12小时的培训后,可以达到翻译质量的新状态。
2、背景
减少顺序计算的目标也构成了Extended Neural GPU[16]、ByteNet[18]和ConvS2S[9]的基础,它们都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将两个任意输入或输出位置的信号关联起来所需的操作数量随着位置之间的距离而增长,ConvS2S为线性增长,ByteNet为对数增长。这使得学习远距离位置b[12]之间的依赖关系变得更加困难。在Transformer中,这被减少到一个恒定的操作数量,尽管其代价是由于平均注意加权位置而降低了有效分辨率,我们用3.2节中描述的多头注意抵消了这一影响。
自注意力,有时被称为内注意,是一种将单个序列的不同位置联系起来以计算该序列的表示的注意机制。自注意已经成功地应用于阅读理解、抽象总结、文本蕴涵和学习任务无关的句子表征等多种任务中[4,27,28,22]。
端到端记忆网络基于循环注意力机制而不是顺序对齐的循环,已被证明在简单语言问答和语言建模任务[34]上表现良好。
然而,Transformer是第一个完全依赖自注意力来计算其输入和输出表示,而不使用序列对齐的rnn或卷积的转导模型。在以下各节中,我们将描述Transformer,激发自注意力,并讨论其相对于[17,18]和[9]等模型的优势。
3、模型架构
大多数具有竞争力的神经序列转导模型具有编码器-解码器结构[5,2,35]。在这里,编码器映射一个符号表示的输入序列 ( x 1 , … , x n ) left(x_{1}, ldots, x_{n} ight) (x1,…,xn)转换为一个连续表示序列 z = ( z 1 , … , z n ) mathbf{z}=left(z_{1}, ldots, z_{n} ight) z=(z1,…,zn)。给定 z mathbf{z} z,解码器生成一个输出序列 ( y 1 , … , y m ) left(y_{1}, ldots, y_{m} ight) (y1,…,ym)符号一次一个元素。在每个步骤中,模型都是自回归的[10],在生成下一个时将之前生成的符号作为额外的输入。
Transformer遵循这种整体架构,编码器和解码器均使用堆叠的自注意力和逐点全连接层,分别如图1的左右半所示。
3.1、编码器和解码器栈
编码器: 编码器由N = 6个相同的层组成。每一层有两个子层。第一个是多头自注意力机制,第二个是简单的、位置全连接的前馈网络。我们采用残差连接[11]围绕每两个子层,然后层归一化[1]。也就是说,每个子层的输出是 L a y e r N o r m ( x + Sublayer ( x ) ) LayerNorm(x+operatorname{Sublayer}(x)) LayerNorm(x+Sublayer(x)),其中Sublayer(x)是子层自身实现的函数。为了促进这些残差连接,模型中的所有子层以及嵌入层产生维度为 d model = 512 d_{ ext {model }}=512 dmodel =512的输出。
解码器:解码器也由N = 6个相同层的堆栈组成。除了每个编码器层中的两个子层外,解码器插入第三个子层,该子层对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围采用残差连接,然后进行层归一化。还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种掩蔽,再加上输出嵌入被一个位置偏移的事实,确保了对位置i的预测只能依赖于位置小于i的已知输出。
3.2、注意力
注意力函数可以描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重是由查询与相应键的兼容性函数计算的。
3.2.1缩放点积注意力
我们将这种特别的注意力称为“缩放的点积注意力”(图2)。输入由维度
d
k
d_{k}
dk的查询和键以及维度
d
v
d_{v}
dv的值组成。我们计算查询与所有键的点积,将每个键除以
d
k
sqrt{d_{k}}
dk,并应用softmax函数获得值的权重。
在实践中,我们同时计算一组查询的注意力函数,打包成矩阵q。键和值也打包成矩阵K和V。我们将输出矩阵计算为
Attention
(
Q
,
K
,
V
)
=
softmax
(
Q
K
T
d
k
)
V
operatorname{Attention}(Q, K, V)=operatorname{softmax}left(frac{Q K^{T}}{sqrt{d_{k}}}
ight) V
Attention(Q,K,V)=softmax(dkQKT)V
两个最常用的注意力函数是加性注意力[2]和点积(乘法)注意力。除了 1 d k frac{1}{sqrt{d_{k}}} dk1的缩放因子外,点积注意力与我们的算法相同。加性注意使用一个具有单个隐藏层的前馈网络来计算兼容性函数。虽然两者在理论复杂性上相似,但点积注意在实践中要更快、更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
当 d k d_k dk值较小时,两种机制的表现相似,当 d k d_{k} dk[3]值较大时,加性注意优于点积注意。我们怀疑,对于较大的 d k d_{k} dk值,点积的大小会变大,从而将softmax函数推入具有极小梯度的区域。为了抵消这种影响,我们将点积乘以 1 d k frac{1}{sqrt{d_{k}}} dk1。
3.2.2、多头注意力(Multi-Head Attention)
我们发现,与其使用 d m o d e l d_{model} dmodel维度的键、值和查询执行单一的注意力函数,不如将查询、键和值分别以不同的、学习过的线性投影h次线性投影到 d k d_k dk、 d k d_k dk和 d v d_v dv维度,这是有益的。然后,在查询、键和值的每个投影版本上,我们并行地执行注意力函数,生成d维输出值。将它们连接起来并再次进行投影,得到最终值,如图2所示。
多头注意允许模型在不同位置共同注意来自不同表示子空间的信息。对于单一注意力头,平均会抑制这一点。
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O where head i = Attention ( Q W i Q , K W i K , V W i V ) egin{aligned} operatorname{MultiHead}(Q, K, V) & =operatorname{Concat}left(operatorname{head}_{1}, ldots, operatorname{head}_{mathrm{h}} ight) W^{O} \ ext { where head }_{mathrm{i}} & =operatorname{Attention}left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V} ight) end{aligned} MultiHead(Q,K,V) where head i=Concat(head1,…,headh)WO=Attention(QWiQ,KWiK,VWiV)
其中投影为参数矩阵 W i Q ∈ R d model × d k , W i K ∈ R d model × d k , W i V ∈ R d model × d v W_{i}^{Q} in mathbb{R}^{d_{ ext {model }} imes d_{k}}, W_{i}^{K} in mathbb{R}^{d_{ ext {model }} imes d_{k}}, W_{i}^{V} in mathbb{R}^{d_{ ext {model }} imes d_{v}} WiQ∈Rdmodel ×dk,WiK∈Rdmodel ×dk,WiV∈Rdmodel ×dv 和 W O ∈ R h d v × d model W^{O} in mathbb{R}^{h d_{v} imes d_{ ext {model }}} WO∈Rhdv×dmodel 。
在这项工作中,我们使用h = 8个平行的注意层,或头。对于每一个,我们使用 d k = d v = d model / h = 64 d_{k}=d_{v}=d_{ ext {model }} / h=64 dk=dv=dmodel /h=64。由于每个头部的维数降低,因此总计算成本与全维的单头部关注相似。
3.2.3、注意力在模型中的应用
Transformer以三种不同的方式使用多头注意力:
- 在encoder-decoder attention层中,queries来自前面的decoder层,而keys和values来自encoder的输出。这使得decoder中的每个位置都能关注到输入序列中的所有位置。 这是模仿序列到序列模型中典型的编码器—解码器的attention机制,例如[38, 2, 9]。
- encoder包含self-attention层。 在self-attention层中,所有的key、value和query来自同一个地方,在这里是encoder中前一层的输出。 encoder中的每个位置都可以关注到encoder上一层的所有位置。
- 类似地,decoder中的self-attention层允许decoder中的每个位置都关注decoder层中当前位置之前的所有位置(包括当前位置)。 为了保持解码器的自回归特性,需要防止解码器中的信息向左流动。我们在scaled dot-product attention的内部 ,通过屏蔽softmax输入中所有的非法连接值(设置为 − ∞ -infty −∞)实现了这一点。
3.3、逐位置前馈网络(Position-wise Feed-Forward Networks)
除了注意子层之外,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别相同地应用于每个位置。这包括两个线性转换,中间有一个ReLU激活。
FFN
(
x
)
=
max
(
0
,
x
W
1
+
b
1
)
W
2
+
b
2
operatorname{FFN}(x)=max left(0, x W_{1}+b_{1}
ight) W_{2}+b_{2}
FFN(x)=max(0,xW1+b1)W2+b2
虽然线性变换在不同位置上是相同的,但它们在每一层之间使用不同的参数。另一种描述它的方式是两个核大小为1的卷积。输入和输出的维数 d model = 512 d_{ ext {model }}=512 dmodel =512,内层的维数 d f f = 2048 d_{ff} = 2048 dff=2048。
3.4嵌入和Softmax
与其他序列转换模型类似,我们使用学习嵌入将输入令牌和输出令牌转换为维度 d m o d e l d_{model} dmodel的向量。我们还使用通常学习的线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵,类似于[30]。在嵌入层中,我们将这些权重乘以 d model sqrt{d_{ ext {model }}} dmodel
3.5、位置编码
由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了“位置编码”。位置编码与嵌入具有相同的维数模型,因此可以对两者进行求和。有许多位置编码的选择,学习和固定[9]。
在这项工作中,我们使用了不同频率的正弦和余弦函数:
P E ( p o s , 2 i ) = sin ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = cos ( p o s / 1000 0 2 i / d m o d e l ) egin{aligned} P E_{(p o s, 2 i)} & =sin left(p o s / 10000^{2 i / d_{mathrm{model}}} ight) \ P E_{(p o s, 2 i+1)} & =cos left(p o s / 10000^{2 i / d_{mathrm{model}}} ight) end{aligned} PE(pos,2i)PE(pos,2i+1)=sin(pos/100002i/dmodel)=cos(pos/100002i/dmodel)
其中pos是位置,I是尺寸。也就是说,位置编码的每一个维度对应于一个正弦波。波长形成从 2 π 2 pi 2π到 10000 ⋅ 2 π 10000 cdot 2 pi 10000⋅2π的几何级数。我们之所以选择这个函数,是因为我们假设它可以让模型很容易地通过相对位置学习,因为对于任何固定的偏移量k, P E p o s + k PE_{pos+k} PEpos+k可以表示为 P E p o s PE_{pos} PEpos的线性函数。
我们还尝试使用习得的位置嵌入[9]代替,发现这两个版本产生的结果几乎相同(见表3 (E)行)。我们选择正弦版本是因为它可以允许模型外推到比训练期间遇到的序列长度更长的序列。
4、为什么是自注意力
在本节中,我们将自注意层的各个方面与通常用于映射一个可变长度符号表示序列 ( x 1 , … , x n ) left(x_{1}, ldots, x_{n} ight) (x1,…,xn)到另一个等长的序列 ( z 1 , … , z n ) left(z_{1}, ldots, z_{n} ight) (z1,…,zn),其中, x i , z i ∈ R d x_{i}, z_{i} in mathbb{R}^{d} xi,zi∈Rd,例如,在典型的序列转导编码器或解码器中的隐藏层。为了激励我们使用自我关注,我们考虑了三个必要条件。
一个是每层的总计算复杂度。另一个是可以并行化的计算量,通过所需的最小顺序操作数来衡量。
第三个是网络中远程依赖关系之间的路径长度。学习远程依赖关系是许多序列转换任务中的关键挑战。影响学习这种依赖关系能力的一个关键因素是网络中向前和向后信号必须经过的路径长度。输入和输出序列中任意位置组合之间的路径越短,学习远程依赖关系[12]就越容易。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。
如表1所示,自关注层用恒定数量的顺序执行操作连接所有位置,而循环层需要O(n)个顺序操作。就计算复杂度而言,当序列长度n小于表示维数d时,自注意层比循环层更快,这是机器翻译中最先进模型使用的句子表示最常见的情况,例如词块[38]和字节对[31]表示。为了提高涉及很长序列的任务的计算性能,可以将自注意限制为只考虑以各自输出位置为中心的输入序列中大小为r的邻域。这将使最大路径长度增加到 O ( n / r ) O(n / r) O(n/r)。我们计划在未来的工作中进一步研究这种方法。
一个核宽度为k<n的卷积层不能连接所有的输入和输出位置对。在相邻核的情况下,这样做需要 O ( n / k ) O(n / k) O(n/k)个卷积层的堆栈,或者在扩展卷积[18]的情况下需要 O ( log k ( n ) ) Oleft(log _{k}(n) ight) O(logk(n))个卷积层的堆栈,从而增加网络中任意两个位置之间最长路径的长度。卷积层通常比循环层的成本高k倍。然而,可分离卷积[6]大大降低了复杂性,为 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) Oleft(k cdot n cdot d+n cdot d^{2} ight) O(k⋅n⋅d+n⋅d2)。然而,即使k = n,可分离卷积的复杂性也等于自注意层和点前馈层的组合,这是我们在模型中采用的方法。
作为附带好处,自注意力可以产生更多可解释的模型。我们从我们的模型中检查注意力分布,并在附录中给出和讨论示例。不仅个体注意力头清楚地学会执行不同的任务,许多注意力头似乎表现出与句子的句法和语义结构相关的行为。
5、训练
本节描述了我们模型的训练机制。
5.1、训练数据和批处理
我们在标准的WMT 2014英语-德语数据集上进行训练,该数据集由大约450万句对组成。句子使用字节对编码[3]进行编码,[3]具有大约37000个标记的共享源-目标词汇表。对于英语-法语,我们使用了更大的WMT 2014英语-法语数据集,该数据集由36M个句子组成,并将标记拆分为32000个单词块的词汇[38]。句子对按近似序列长度进行批处理。每个训练批包含一组句子对,其中包含大约25000个源标记和25000个目标标记。
5.2、硬件和时间表
我们在一台带有8个NVIDIA P100 gpu的机器上训练我们的模型。对于使用本文中描述的超参数的基本模型,每个训练步骤大约需要0.4秒。我们对基本模型进行了总共10万步或12小时的训练。对于我们的大型模型(如表3所示),步长为1.0秒。大模型训练30万步(3.5天)。
5.3、优化器
我们选用Adam作为优化器,参数设置 β 1 = 0.9 , β 2 = 0.98 和 ϵ = 1 0 − 9 eta_{1}=0.9, eta_{2}=0.98 和 epsilon=10^{-9} β1=0.9,β2=0.98和ϵ=10−9。在训练过程中,我们根据以下公式改变了学习率:
l r a t e = d m o d e l 0.5 ⋅ min ( step-num − 0.5 , step-num ⋅ warmup-steps − 1.5 ) lrate=d_{model}^{0.5} cdot min left( ext {step-num }^{-0.5}, ext {step-num } cdot ext {warmup-steps }^{-1.5} ight) lrate=dmodel0.5⋅min(step-num −0.5,step-num ⋅warmup-steps −1.5)
这对应于在第一个warmup_steps训练步骤中线性增加学习率,然后按步数的倒数平方根成比例地降低学习率。我们使用了warmup_steps = 4000。
5.4、正规化
我们在训练中使用三种类型的正则化:
Residual Dropout。我们将dropout[33]应用于每个子层的输出,然后将其添加到子层输入并归一化。此外,我们将dropout应用于编码器和解码器堆栈中的嵌入和位置编码之和。对于基本模型,我们使用
P
d
r
o
p
=
0.1
P_{drop} = 0.1
Pdrop=0.1的比率。
标签平滑。在训练过程中,我们使用值
ϵ
l
s
=
0.1
epsilon_{ls}=0.1
ϵls=0.1[36]的标签平滑。这损害了困惑,因为模型学会了更不确定,但提高了准确性和BLEU分数。
6、结果
6.1、机器翻译
在WMT 2014英语到德语的翻译任务中,大型Transformer模型(表2中的transformer (big))比之前报道的最佳模型(包括集成)的BLEU高出2:0以上,建立了新的最先进的BLEU分数为28:4。该模型的配置列在表3的底线。训练用了3天5分,使用了8个P100 gpu。甚至我们的基本模型也超过了所有以前发表的模型和集合,而训练成本只是任何竞争模型的一小部分。
在WMT 2014英法翻译任务上,我们的大模型获得了41.0的BLEU分数,优于之前发布的所有单一模型,却不到之前最先进模型的训练成本的1/4。训练为英语到法语的Transformer(大)模型使用的辍学率 P d r o p P_{drop} Pdrop = 0.1,而不是0.3。
对于基本模型,我们使用通过平均最后5个检查点获得的单个模型,这些检查点每隔10分钟写入一次。对于大型模型,我们取最后20个检查点的平均值。我们使用波束搜索,波束大小为4,长度惩罚α = 0:6[38]。这些超参数是在开发集上实验后选择的。我们在推理期间将最大输出长度设置为输入长度+ 50,但在可能的情况下提前终止[38]。
表2总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过将训练时间、使用的GPU数量和每个GPU的持续单精度浮点容量的估计值相乘来估计用于训练模型的浮点运算次数。
在表3行(B)中,我们观察到减小注意力键大小 d k d_k dk会损害模型质量。这表明确定兼容性并不容易,一个比点积更复杂的兼容性函数可能是有益的。我们在©和(D)行中进一步观察到,正如预期的那样,更大的模型更好,并且dropout对于避免过度拟合非常有帮助。在(E)行中,我们用学习的位置嵌入[9]替换正弦位置编码,并观察到与基本模型几乎相同的结果。
6.2、模型变种
为了评估Transformer不同组件的重要性,我们以不同的方式改变了我们的基本模型,在开发集newstest2013上测量了英语到德语翻译的性能变化。我们使用了前一节中描述的波束搜索,但没有使用检查点平均。我们在表3中展示了这些结果。
在表3行(A)中,我们在保持计算量不变的情况下,改变注意头的数量以及注意键和值维度,如3.2.2节所述。虽然单头注意力比最佳设置差0.9 BLEU,但过多的头也会降低质量。
6.3、英语句法分析
为了评估Transformer是否可以泛化到其他任务,我们在英语短语句法分析上进行了实验。这项任务提出了特定的挑战:输出受到强烈的结构约束,并且明显比输入长。此外,RNN序列到序列模型还未能在小数据体系[37]中取得最先进的结果。
我们在Penn Treebank[25]的华尔街日报(WSJ)部分训练了一个 d m o d e l = 1024 d_{model} = 1024 dmodel=1024的4层Transformer,大约训练了40K个句子。我们还在半监督设置中训练它,使用更大的高置信度和BerkleyParser语料库,大约有1700万个句子。我们仅在WSJ设置中使用了16K 个tocken的词汇表,在半监督设置中使用了32K个token的词汇表。
我们只在第22节的开发集上进行了少量的实验来选择DropOut、注意力和残差(第5.4节)、学习率和beam大小,所有其他参数都保持从英语到德语的基本翻译模型不变。在推断过程中,我们将最大输出长度增加到输入长度+ 300的长度。对于WSJ单独设置和半监督设置,我们均使用了21和α = 0.3的beam大小
表4中的结果表明,尽管缺乏特定任务的调优,我们的模型表现得惊人地好,除了RNNG网络[8],产生了比所有之前报道的模型更好的结果。
与RNN序列到序列模型[37]相比,即使只在WSJ的40K句子训练集上训练,Transformer也优于BerkeleyParser[29]。
7、结论
在这项工作中,我们提出了Transformer,这是第一个完全基于注意力的序列转换模型,用多头自注意取代了编码器-解码器架构中最常用的循环层。
对于翻译任务,Transformer的训练速度明显快于基于循环层或卷积层的体系结构。在WMT 2014的英语到德语和WMT 2014的英语到法语翻译任务上,我们都达到了一个新的水平。在前一个任务中,我们的最佳模型甚至优于所有先前报道的集成。
我们对基于注意力的模型的未来感到兴奋,并计划将其应用于其他任务。我们计划将Transformer扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意力机制,以有效地处理大量的输入和输出,如图像、音频和视频。减少世代的顺序是我们的另一个研究目标。
我们用来训练和评估模型的代码可以在https://github.com/ tensorflow/tensor2tensor上找到。