赞
踩
作者:Ashish Vaswani,Noam Shazeer,Niki Parmar,Jakob Uszkoreit,Llion Jones,Aidan N. Gomez,Łukasz Kaiser,Illia Polosukhin
来源:
原文:https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf
代码、数据和视频:https://github.com/tensorflow/tensor2tensor
系列文章目录:
上一篇:
https://blog.csdn.net/xzs1210652636/article/details/134431873
下一篇:
主流的序列转换模型基于复杂的递归或卷积神经网络,其中包括一个编码器和一个解码器。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一种新的简单网络架构–“转换器”(Transformer),它完全基于注意力机制,无需递归和卷积。在两项机器翻译任务上的实验表明,这些模型的质量更优,同时可并行化程度更高,所需的训练时间也大大减少。我们的模型在 WMT 2014 英德翻译任务中达到了 28.4 BLEU,比现有的最佳结果(包括集合)提高了 2 BLEU 以上。在 WMT 2014 英法翻译任务中,我们的模型在 8 个 GPU 上训练了 3.5 天后,单个模型的 BLEU 得分达到了 41.0 分,这只是文献中最佳模型训练成本的一小部分。
递归神经网络,特别是长短期记忆[12]和门控递归[7]神经网络,已被牢固地确立为语言建模和机器翻译等序列建模和转译问题的最先进方法[29, 2, 5]。自此以后,许多人继续努力推动递归语言模型和编码器-解码器架构的发展[31, 21, 13]。
递归模型通常按照输入和输出序列的符号位置进行计算。将位置与计算时间的步长对齐,它们会生成隐藏状态 h t h_t ht 的序列,作为前一个隐藏状态 h t − 1 h_{t-1} ht−1 和位置 t t t 的输入的函数。这种固有的序列性质排除了训练实例内的并行化,而在序列长度较长时,这一点变得至关重要,因为内存约束限制了跨实例的批处理。最近的研究通过因式分解技巧[18]和条件计算[26]显著提高了计算效率,同时也改善了后者的模型性能。然而,顺序计算的基本限制仍然存在。
在各种任务中,注意机制已成为引人注目的序列建模和转导模型的一个组成部分,它可以对依赖关系进行建模,而不必考虑它们在输入或输出序列中的距离[2, 16]。然而,除了少数情况[22]外,这种注意机制都是与递归网络结合使用的。
在这项工作中,我们提出了 Transformer 模型架构,它摒弃了递归,而是完全依赖注意力机制来绘制输入和输出之间的全局依赖关系。Transformer 可以大大提高并行化程度,在 8 个 P100 GPU 上只需训练 12 个小时,翻译质量就能达到新的水平。
减少顺序计算的目标也是扩展神经 GPU[20]、ByteNet[15]和 ConvS2S[8]的基础,它们都使用卷积神经网络作为基本构建模块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将两个任意输入或输出位置的信号联系起来所需的运算次数随位置间距离的增加而增加,ConvS2S 为线性增加,ByteNet 为对数增加。这就增加了学习远距离位置间依赖关系的难度[11]。在 Transformer 中,这将被减少到一个恒定的操作数,但代价是由于平均注意力加权位置而降低了有效分辨率,我们在 3.2 节中介绍了多头注意力来抵消这一影响。
自我注意(有时也称为内部注意)是一种注意机制,它将单个序列的不同位置联系起来,以计算序列的表征。自我注意已成功应用于多种任务,包括阅读理解、抽象概括、文本引申和学习与任务无关的句子表征[4, 22, 23, 19]。
端到端记忆网络基于递归注意机制,而非序列对齐递归,在简单语言问题解答和语言建模任务中表现出色[28]。
然而,据我们所知,Transformer 是第一个完全依靠自我注意来计算输入和输出表示而不使用序列对齐 RNN 或卷积的转导模型。在下面的章节中,我们将描述 Transformer,激发自我注意,并讨论它与 [14, 15] 和 [8] 等模型相比的优势。
大多数竞争性神经序列转换模型都具有编码器-解码器结构 [5, 2, 29]。在这里,编码器将输入的符号表示序列 ( x 1 , . . . , x n ) (x_1, ..., x_n) (x1,...,xn)映射为连续表示序列 z = ( z 1 , . . . , z n ) z = (z_1, ..., z_n) z=(z1,...,zn)。给定 z z z 后,解码器每次生成一个元素的符号输出序列 ( y 1 , . . . , y m ) (y_1, ..., y_m) (y1,...,ym)。在每一步中,该模型都是自动回归的 [9],在生成下一步时,会消耗之前生成的符号作为额外输入。
图 1 的左半部分和右半部分分别显示了编码器和解码器采用堆叠式自关注和点式全连接层的整体架构。
图 1:变压器–模型结构。
编码器: 编码器由 N = 6 N = 6 N=6 层相同的层堆叠组成。每一层都有两个子层。第一个子层是多头自注意机制,第二个子层是简单的位置全连接前馈网络。我们在两个子层的每个周围都采用了残差连接[10],然后进行层归一化[1]。也就是说,每个子层的输出都是 LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x)) LayerNorm(x+Sublayer(x)),其中 Sublayer ( x ) \text{Sublayer}(x) Sublayer(x) 是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层都会产生维数为 d m o d e l = 512 d_{model} = 512 dmodel=512 的输出。
解码器: 解码器也由 N = 6 N = 6 N=6 层相同的层堆叠组成。除了每个编码器层中的两个子层外,解码器还插入了第三个子层,对编码器堆栈的输出执行多头关注。与编码器类似,我们在每个子层周围采用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自我关注子层,以防止位置关注到后续位置。这种屏蔽,加上输出嵌入偏移一个位置的事实,确保了对位置 i i i 的预测只能依赖于小于 i i i 位置的已知输出。
注意力函数可以描述为将一个查询和一组键值对映射到一个输出,其中查询、键、值和输出都是向量。输出是以值的加权和来计算的,其中分配给每个值的权重是通过查询与相应键的兼容函数来计算的。
我们将这种特殊的注意力称为 “缩放点积注意力”(图 2)。输入包括查询、维度为 d k d_k dk 的键和维度为 d v d_v dv 的值。我们计算查询与所有密钥的点积,将每个点积除以 d k \sqrt{d_k} dk ,然后应用软最大函数来获得值的权重。
图 2:(左)缩放点积注意。(右图)多头注意由多个并行运行的注意层组成。
在实践中,我们会同时计算一组查询的注意力函数,这些查询会被打包成一个矩阵 Q Q Q。键和值也被打包成矩阵 K K K 和 V V V。我们计算的输出矩阵为:
最常用的两种注意力函数是加法注意力[2]和点积(多乘法)注意力。点积注意力与我们的算法相同,只是缩放因子为 1 d k \frac{1}{\sqrt{d_k}} dk 1。加法注意使用单隐层前馈网络计算兼容性函数。虽然两者的理论复杂度相似,但点积注意力在实际应用中速度更快,空间效率更高,因为它可以使用高度优化的矩阵乘法代码来实现。
在 d k d_k dk 值较小的情况下,这两种机制的表现类似,但在 d k d_k dk 值较大的情况下,加法注意在不缩放的情况下优于点积注意 [3]。我们怀疑,对于较大的 d k d_k dk 值,点积的幅度会变大,从而将 softmax \text{softmax} softmax 函数推向梯度极小的区域(为了说明点积为什么会变大,假设 q q q 和 k k k 的分量是均值为 0、方差为 1 的独立随机变量。那么它们的点积 q ⋅ k = ∑ i = 1 d k q i k i q \cdot k = \sum_{i = 1}^{d_k}q_ik_i q⋅k=∑i=1dkqiki 的均值为 0,方差为 d k d_k dk)。为了消除这种影响,我们用 1 d k \frac{1}{\sqrt{d_k}} dk 1 来缩放点积。
我们发现,与其使用 d m o d e l d_{model} dmodel 维度的键、值和查询来执行单一的注意力函数,不如将查询、键和值分别线性投影到 d k d_k dk、 d k d_k dk 和 d v d_v dv 维度,并将不同的学习过的线性投影进行 h h h 次投影。然后,我们对每个投影版本的查询、键和值并行执行注意力函数,得到 d v d_v dv 维的输出值。如图 2 所示,这些值被串联起来并再次投影,从而得到最终值。
多头注意力允许模型在不同位置共同关注来自不同表征子空间的信息。而在单注意头的情况下,平均化会抑制这一点。
其中的投影是参数矩阵
W
i
Q
∈
R
d
m
o
d
e
l
×
d
k
,
W
i
K
∈
R
d
m
o
d
e
l
×
d
k
,
W
i
V
∈
R
d
m
o
d
e
l
×
d
v
和
W
O
∈
R
h
d
v
×
d
m
o
d
e
l
W_i^Q ∈ \mathbb{R} ^{d_{model}×d_k} , W_i ^K ∈ \mathbb{R}^{ d_{model}×d_k} , W_i ^V ∈ \mathbb{R}^{ d_{model}×d_v} 和 W^O ∈ \mathbb{R} ^{hd_v×d_{model}}
WiQ∈Rdmodel×dk,WiK∈Rdmodel×dk,WiV∈Rdmodel×dv和WO∈Rhdv×dmodel
.
在这项工作中,我们采用了 h = 8 h = 8 h=8 个并行注意力层,或称为 “头”。其中,我们使用 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。由于减少了每个头的维度,总计算成本与全维度的单头注意力相似。
Transformer通过三种不同方式实现多头关注:
在 "编码器-解码器attention "层中,查询来自前一个解码器层,而记忆键和记忆值则来自编码器的输出。这使得解码器中的每个位置都能关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意机制,例如 [31, 2, 8]。
编码器包含自注意层。在自注意层中,所有的键、值和查询都来自同一个地方,在这种情况下,就是编码器中上一层的输出。编码器中的每个位置都可以关注编码器上一层的所有位置
同样,解码器中的自关注层允许解码器中的每个位置关注解码器中包括该位置在内的所有位置。我们需要防止解码器中的信息向左流动,以保持自动回归特性。我们通过屏蔽(设置为- ∞ ∞ ∞)软最大输入中对应于非法连接的所有值,在缩放点积关注内部实现了这一点。见图 2。
除了注意力子层外,我们的编码器和解码器中的每一层都包含一个全连接的前馈网络,该网络分别对每个位置进行相同的处理。这包括两个线性变换,中间有一个 ReLU 激活。
虽然不同位置的线性变换相同,但各层使用的参数不同。另一种描述方法是两个内核大小为 1 的卷积。输入和输出的维度为
d
m
o
d
e
l
=
512
d_{model} = 512
dmodel=512,内层的维度为
d
f
f
=
2048
d_{ff} = 2048
dff=2048。
与其他序列转换模型类似,我们使用学习到的嵌入将输入标记和输出标记转换为维数为 d m o d e l d_{model} dmodel 的向量。我们还使用常用的学习线性变换和 softmax 函数,将解码器输出转换为预测的下一个标记概率。在我们的模型中,我们在两个嵌入层和预软最大线性变换之间共享相同的权重矩阵,这与 [24] 类似。在嵌入层中,我们将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel 。
由于我们的模型不包含递归和卷积,为了让模型能够利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了 “位置编码”。位置编码的维度 dmodel 与嵌入式编码相同,因此两者可以相加。位置编码有多种选择,包括学习编码和固定编码 [8]。
在这项工作中,我们使用了不同频率的正弦和余弦函数:
其中, p o s pos pos 是位置, i i i 是维数。也就是说,位置编码的每个维度对应一个正弦波。波长形成一个从 2 π 2π 2π 到 10000 ⋅ 2 π 10000 \cdot 2π 10000⋅2π 的几何级数。我们之所以选择这个函数,是因为我们假设它可以让模型轻松地学习到相对位置,因为对于任何固定的偏移 k k k, P E p o s + k PE_{pos+k} PEpos+k 都可以表示为 P E p o s PE_{pos} PEpos 的线性函数。
我们还尝试用学习到的位置嵌入[8]来代替,结果发现两个版本产生的结果几乎相同(见表 3 第(E)行)。我们之所以选择正弦波版本,是因为它可以让模型推断出比训练时遇到的序列长度更长的序列。
表 3:变压器架构的各种变化。未列出的值与基础模型的值相同。所有指标均基于英德翻译开发集 newstest2013。根据我们的字节对编码,列出的困惑度为每字片段的困惑度,不应与每字困惑度进行比较。
在本节中,我们将比较自注意层与递归层和卷积层的各个方面,后者通常用于将一个可变长度的符号表示序列 ( x 1 , . . . , x n ) (x_1, ..., x_n) (x1,...,xn)映射到另一个等长序列 ( z 1 , . . . , z n ) (z_1, ..., z_n) (z1,...,zn),其中 x i , z i ∈ R d x_i, z_i∈\mathbb{R}^d xi,zi∈Rd,例如典型序列转换编码器或解码器中的隐藏层。我们使用自注意的动机有三个。
一个是每层的总计算复杂度。另一个是可并行化的计算量,以所需的最小顺序运算次数来衡量。
第三是网络中长距离依赖关系之间的路径长度。学习长程依赖关系是许多序列转导任务的关键挑战。影响学习此类依赖关系能力的一个关键因素是前向和后向信号必须在网络中穿越的路径长度。输入和输出序列中任意位置组合之间的路径越短,学习长距离依赖关系就越容易[11]。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。
如表 1 所示,自注意层连接所有位置的连续操作数不变,而递归层则需要 O ( n ) O(n) O(n) 次连续操作。就计算复杂度而言,当序列长度 n n n 小于表示维度 d d d 时,自注意层的速度要快于递归层,机器翻译中最先进的模型所使用的句子表示,如单词片[31]和字节对[25]表示,通常就是这种情况。
表 1:不同层类型的最大路径长度、每层复杂度和最小顺序操作数。n 是序列长度,d 是表示维度,k 是卷积的内核大小,r 是受限自注意邻域的大小。
为了提高涉及超长序列任务的计算性能,可以限制自我注意的范围,只考虑输入序列中以相应输出位置为中心、大小为 r r r 的邻域。这将把最大路径长度增加到 O ( n / r ) O(n/r) O(n/r)。我们计划在今后的工作中进一步研究这种方法。
核宽 k < n k < n k<n 的单个卷积层无法连接所有输入和输出位置对。在内核连续的情况下,这样做需要堆叠 O ( n / k ) O(n/k) O(n/k) 个卷积层;在扩张卷积的情况下,则需要堆叠 O ( l o g k ( n ) ) O(log_k(n)) O(logk(n)) 个卷积层[15],从而增加了网络中任意两个位置之间最长路径的长度。卷积层的成本通常比递归层高 k k k 倍。然而,可分离卷积[6]将复杂度大大降低到 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) O(k \cdot n \cdot d + n \cdot d^2) O(k⋅n⋅d+n⋅d2)。即使在 k = n k = n k=n 的情况下,可分离卷积的复杂度也相当于自注意层和点式前馈层的组合,而我们在模型中采用的正是这种方法。
作为附带的好处,自我关注可以产生更多可解释的模型。我们从模型中检查了注意力分布,并在附录中介绍和讨论了一些例子。各个注意力头不仅明显学会执行不同的任务,而且许多注意力头似乎还表现出与句子的句法和语义结构有关的行为。
本节将介绍我们模型的训练机制。
我们在 WMT 2014 英德标准数据集上进行了训练,该数据集包含约 450 万个句子对。句子采用字节对编码[3],源目标共享词汇量约为 37000 个标记。对于英语-法语,我们使用了规模更大的 WMT 2014 英语-法语数据集,该数据集包含 3600 万个句子,并将标记拆分为 32000 个词块词汇[31]。句子对按近似序列长度分组。每个训练批包含一组句子对,其中包含约 25000 个源词块和 25000 个目标词块。
我们在一台配备 8 个英伟达 P100 GPU 的机器上训练模型。对于我们的基础模型,使用本文所述的超参数,每个训练步骤耗时约 0.4 秒。我们总共训练了 100,000 步或 12 个小时的基础模型。对于我们的大型模型(如表 3 底行所述),每步训练时间为 1.0 秒。大型模型的训练时间为 300,000 步(3.5 天)。
我们使用了亚当优化器[17], β 1 = 0.9 β_1 = 0.9 β1=0.9, β 2 = 0.98 β_2 = 0.98 β2=0.98 和 ϵ = 1 0 − 9 \epsilon = 10^{-9} ϵ=10−9。在训练过程中,我们根据公式改变学习率:
这相当于在第一个热身 w a r m u p _ s t e p s warmup\_steps warmup_steps训练步数中线性增加学习率,此后学习率按步数的平方反比例递减。我们使用的是 w a r m u p _ s t e p s = 4000 warmup\_steps = 4000 warmup_steps=4000。
在训练过程中,我们采用了三种正则化方法:
残差滤波 我们对每个子层的输出进行滤波 [27],然后将其添加到子层输入中并进行归一化处理。此外,我们还对编码器和解码器堆栈中的嵌入和位置编码之和进行了滤除。在基础模型中,我们使用 P d r o p , = 0.1 P_{drop}, = 0.1 Pdrop,=0.1 的比率。
标签平滑 在训练过程中,我们使用了标签平滑值 ϵ l s = 0.1 \epsilon _{l_s} = 0.1 ϵls=0.1 [30]。这样做会增加模型的不确定性,从而降低复杂度,但却提高了准确度和 BLEU \text{BLEU} BLEU 得分。
在 WMT 2014 英译德翻译任务中,大转换器模型(表 2 中的转换器(big))的 BLEU \text{BLEU} BLEU 值比之前报道的最佳模型(包括集合)高出 2.0 以上,达到了 28.4 的新的最先进 BLEU \text{BLEU} BLEU 值。该模型的配置见表 3 底行。在 8 个 P100 GPU 上的训练耗时 3.5 天。即使是我们的基本模型,也超越了之前发布的所有模型和集合,而训练成本只是任何竞争模型的一小部分。
表 2:在英语到德语和英语到法语的 newstest2014 测试中,Transformer 的 BLEU 分数优于之前的先进模型,而训练成本仅为之前的一小部分。
在 WMT 2014 英语到法语的翻译任务中,我们的大模型获得了 41.0 的 BLEU 分数,超过了之前发布的所有单一模型,而训练成本还不到之前最先进模型的四分之一。为英译法而训练的 Transformer(大)模型使用了 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1,而不是 0.3 0.3 0.3。
对于基本模型,我们使用的是通过平均最近 5 个检查点获得的单一模型,这些检查点以 10 分钟的间隔写入。对于大型模型,我们取最后 20 个检查点的平均值。我们使用波束搜索,波束大小为 4,长度惩罚 α = 0.6 α = 0.6 α=0.6 [31]。这些超参数是在开发集上实验后选择的。我们将推理过程中的最大输出长度设定为输入长度 + 50,但尽可能提前终止推理 [31]。
表 2 总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过将训练时间、使用的 GPU 数量和每个 GPU 的持续单精度浮点运算能力的估计值相乘,估算出训练一个模型所使用的浮点运算次数(我们为 K80、K40、M40 和 P100 分别使用了 2.8、3.7、6.0 和 9.5 TFLOPS 的数值)。
为了评估 Transformer 不同组件的重要性,我们以不同方式改变了基础模型,测量了开发集 newstest2013 上英译德性能的变化。我们使用了上一节所述的波束搜索,但没有使用检查点平均法。表 3 列出了这些结果。
如 3.2.2 节所述,在表 3 行(A)中,我们改变了注意力头的数量以及注意力键和值的维度,但计算量保持不变。虽然单头注意力比最佳设置差 0.9 BLEU,但注意力头数过多也会导致质量下降。
在表 3 行(B)中,我们发现减小关注键大小 dk 会降低模型质量。这表明,确定兼容性并不容易,比点积更复杂的兼容性函数可能更有益处。在第(C)行和第(D)行中,我们进一步观察到,正如我们所预期的那样,模型越大越好,而 dropout 对避免过度拟合很有帮助。在第(E)行中,我们用学习到的位置嵌入[8]替换了正弦位置编码,观察到的结果与基础模型几乎完全相同。
在这项工作中,我们提出了 “变形器”,这是第一个完全基于注意力的序列转换模型,用多头自我注意力取代了编码器-解码器架构中最常用的递归层。
在翻译任务中,Transformer 的训练速度明显快于基于递归层或卷积层的架构。在 WMT 2014 英译德和 WMT 2014 英译法翻译任务中,我们都达到了新的技术水平。在前一项任务中,我们的最佳模型甚至优于之前报告的所有集合。
我们对基于注意力的模型的未来充满期待,并计划将其应用于其他任务。我们计划将 Transformer 扩展到涉及文本以外的输入和输出模式的问题上,并研究局部的、受限的注意力机制,以有效处理大型输入和输出,如图像、音频和视频。我们的另一个研究目标是减少生成的顺序。
我们用于训练和评估模型的代码可在 https://github.com/tensorflow/tensor2tensor 上获取。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。