Transformer:Attention is all you need
- Abstract
- 1 Introduction
- 2 Background
- 3 Model Architecture
- 3.1 编码器和解码器堆栈
- 3.2 注意力机制
- 3.2.1 缩放点积注意力
- 3.2.2 多头注意力
- 3.2.3 注意力机制在模型中的应用
- 3.3 逐点前馈网络
- 3.4 嵌入和 Softmax
- 3.5 位置编码
- 4 Why Self-Attention
- 5 Training
- 5.1 训练数据和批处理
- 5.2 硬件和调度
- 5.3 优化器
- 5.4 正则化
- 6 Results
- 6.1 机器翻译
- 6.2 模型变体
- 6.3 英语成分解析
- 7 Conclusion
- Attention Visualizations
扩展阅读:《Attention is All You Need》浅读(简介+代码)
扩展阅读:注意力机制
强烈推荐:李宏毅老师讲解 Transformer 视频
Abstract
当前主流的序列转换模型基于复杂的循环神经网络或卷积神经网络,这些模型通常包括编码器和解码器。表现最好的模型还通过注意力机制连接编码器和解码器。我们提出了一种全新的简单网络架构 Transformer,它完全依赖于注意力机制,彻底摒弃了循环和卷积结构。在两个机器翻译任务上的实验表明,这些模型在翻译质量上优于现有模型,同时具有更高的并行性并显著减少了训练时间。我们的模型在 WMT 2014 英语到德语翻译任务上取得了 28.4 的 BLEU 分数,相较于现有的最佳结果(包括集成模型)提升了超过 2 分。在 WMT 2014 英语到法语翻译任务上,我们的模型在单模型上达到了 41.8 的 BLEU 分数,训练仅用了 3.5 天,所需训练成本远低于文献中的最佳模型。我们还展示了 Transformer 在其他任务中的良好泛化能力,并成功将其应用于英语句法分析任务,无论是大规模数据还是有限数据训练情况下都能表现出色。
Attention 虽然跟 CNN 没有直接联系,但事实上充分借鉴了 CNN 的思想,比如 Multi-Head Attention 就是 Attention 做多次然后拼接,这跟 CNN 中的多个卷积核的思想是一致的;还有论文用到了残差结构,这也源于 CNN 网络。
并非所有问题都需要长程的、全局的依赖的,也有很多问题只依赖于局部结构,这时候用纯 Attention 也不大好。事实上,Google 似乎也意识到了这个问题,因此论文中也提到了一个 restricted 版的 Self-Attention(不过论文正文应该没有用到它),它假设当前词只与前后 rrr 个词发生联系,因此注意力也只发生在这 2r+12r+12r+1 个词之间,这样计算量就是 O(nr)O(nr)O(nr),这样也能捕捉到序列的局部结构了。但是很明显,这就是卷积核中的卷积窗口的概念!
1 Introduction
循环神经网络(Recurrent Neural Networks, RNN)、长短期记忆网络(Long Short-Term Memory, LSTM)[13] 以及门控循环单元(Gated Recurrent Units, GRU)[7]在序列建模和转换问题中,如语言模型和机器翻译[35, 2, 5]方面,已经被广泛确立为当前最先进的方法。自此以来,众多研究不断推动循环语言模型和编码器-解码器架构的边界[38, 24, 15]。
循环模型通常沿输入和输出序列中的符号位置进行计算,并将位置与计算时间的步骤对齐,它们生成一系列隐藏状态 hth_tht,其中 hth_tht 是前一个隐藏状态 ht−1h_{t-1}ht−1 和位置 ttt 的输入的函数。这种固有的顺序性限制了在训练样本中的并行化,尤其是在较长的序列长度下,由于内存限制,批处理多个样本变得困难。最近的工作通过分解技巧[21]和条件计算[32]在计算效率上取得了显著的改进,同时在后者的情况下也提高了模型性能。然而,顺序计算的基本限制仍然存在。
可以看到,最开始考虑的是循环模型固有的顺序性限制并行化训练而使用的注意力机制。
注意力机制已经成为各种任务中具有说服力的序列建模和转换模型的一个组成部分,使得在输入或输出序列中的依赖关系可以不受其距离的限制进行建模[2, 19]。然而,除了少数情况[27],这些注意力机制通常与循环网络结合使用。
在这篇工作中,我们提出了一种新的模型架构 Transformer,它放弃了循环结构,完全依赖注意力机制来建立输入和输出之间的全局依赖关系。Transformer 允许显著的并行化,并且在仅使用 8 个 P100 GPU 训练 12 小时后即可达到新的翻译质量的技术水平。
2 Background
减少顺序计算的目标同样是扩展神经 GPU(Extended Neural GPU)[16]、ByteNet[18] 和 ConvS2S[9] 模型的基础,这些模型使用卷积神经网络作为基本构建模块,能够并行地计算所有输入和输出位置的隐藏表示。在这些模型中,两个任意输入或输出位置之间信号的相关性所需的计算操作数量,随着位置之间的距离而增加,线性地增加于 ConvS2S 模型中,而在 ByteNet 模型中则以对数方式增加。这使得学习远距离位置之间的依赖关系变得更加困难[12]。在 Transformer 模型中,这个计算操作数量被减少到一个常数,尽管代价是由于注意力加权位置的平均化,导致有效的分辨率降低,这一影响我们通过多头注意力机制在第 3.2 节中所描述的方法进行补偿。
在深度网络里,如果位置 A 的信息要影响位置 B,就得通过若干层卷积滤波器。层数越多,信号衰减和梯度消失/爆炸的风险就越大。
在 ConvS2S 和 ByteNet 这类完全基于卷积的序列模型中,如果要把序列里相隔很远的两个位置的信息「连通」起来,网络里需要经历很多层的卷积运算。路径越长,就要经过越多的非线性变换(卷积层+激活函数),梯度在反向传播时更容易消失或扭曲,模型就越难抓住长距离的位置依赖。
自注意力(Self-attention,有时称为内部注意力)是一种注意力机制,它关联同一序列中不同的位置,以计算该序列的表示。自注意力机制已经在多种任务中取得了成功应用,包括阅读理解、抽象总结、文本蕴含和学习任务无关的句子表示[4, 27, 28, 22]。
RNN 是一种 Seq2seq,计算 b4b^4b4 必须先计算出 b3b^3b3,b3b^3b3 要先计算 b2b^2b2,这样就不能并行计算。有一种新的 Layer 为了取代 RNN,其输入也是 Seq,输出也是 Seq,但是它能同时计算 b1b^1b1 到 b4b^4b4。
端到端记忆网络基于一种递归注意力机制,而不是基于序列对齐的递归结构,并且已经在简单语言的问答和语言建模任务中表现良好[34]。
据我们所知,Transformer 是第一个完全依赖自注意力机制的序列转换模型,用来自行计算输入和输出的表示,而无需使用序列对齐的 RNN 或卷积。在接下来的章节中,我们将描述 Transformer 模型,阐述自注意力机制的动机,并讨论其相较于其他模型[17, 18, 9] 的优势。
3 Model Architecture
大多数具有竞争力的神经序列转换模型都采用编码器-解码器结构[5, 2, 35]。其中,
- 编码器将符号表示的输入序列 (x1,...,xn)(x_1, ..., x_n)(x1,...,xn) 映射为连续表示序列 z=(z1,...,zn)z = (z_1, ..., z_n)z=(z1,...,zn)。
- 给定 zzz 后,解码器逐个生成符号的输出序列 (y1,...,ym)(y_1, ..., y_m)(y1,...,ym)。
- 在每一步,模型是自回归的[10],生成下一个符号时,消耗之前生成的符号作为附加输入。
Transformer 遵循这种整体结构,使用堆叠的自注意力机制和逐点的全连接层,分别用于编码器和解码器,如图 1 的左半部分和右半部分所示。
3.1 编码器和解码器堆栈
编码器:编码器由 N=6N = 6N=6 层相同的层堆叠组成。
- 每一层有两个子层。
- 第一个子层是一个多头自注意力机制,第二个子层是一个简单的逐点全连接前馈网络。
- 我们在每个子层的输出上应用一个残差连接[11],然后进行层归一化[1]。
- 即,每个子层的输出是 LayerNorm(x+Sublayer(x))\text{LayerNorm}(x + \text{Sublayer}(x))LayerNorm(x+Sublayer(x)),其中 Sublayer(x)\text{Sublayer}(x)Sublayer(x) 是子层本身实现的函数。为了便于这些残差连接,模型中的所有子层,以及嵌入层,都会生成维度为 dmodel=512d_{\text{model}} = 512dmodel=512 的输出。
解码器:解码器也由 N=6N = 6N=6 层相同的层堆叠组成。
- 除了每个编码器层中的两个子层外,解码器还插入了一个第三子层,该子层执行对编码器堆栈输出的多头注意力机制。
- 与编码器类似,我们在每个子层的输出上应用残差连接,然后进行层归一化。
- 我们还修改了解码器堆栈中的自注意力子层,以防止位置之间相互关注。这种掩码机制结合输出嵌入的偏移,确保位置 iii 的预测只能依赖于 iii 之前的已知输出。
3.2 注意力机制
一个注意力函数可以被描述为将一个查询(query)和 一组键-值对 映射到一个输出。查询、键、值和输出都是向量。输出是对值的加权和,权重由 查询与对应键 的相似度函数计算得出。
3.2.1 缩放点积注意力
我们称我们使用的注意力为“缩放点积注意力”(Scaled Dot-Product Attention)。输入由维度为 dkd_kdk 的查询和键以及维度为 dvd_vdv 的值组成。我们计算查询与所有键的点积,将每个点积除以 dk\sqrt{d_k}dk,然后应用 softmax 函数得到对值的权重。
在实践中,我们同时对一组查询计算注意力函数,并将它们打包到一个矩阵 QQQ 中。键和值也打包为矩阵 KKK 和 VVV。我们将输出矩阵计算为:
Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}} \right)V Attention(Q,K,V)=softmax(dkQKT)V
两种最常用的注意力机制是加性注意力[2]和点积(乘法)注意力。点积注意力与我们的算法相同,除了缩放因子为 1dk\frac{1}{\sqrt{d_k}}dk1。加性注意力使用一个带有单个隐藏层的前馈网络来计算兼容性函数。虽然这两者在理论复杂度上相似,但在实践中,点积注意力速度更快,且空间效率更高,因为它可以利用高度优化的矩阵乘法代码实现。
当 dkd_kdk 的值较小时,这两种机制的表现相似;然而,对于较大的 dkd_kdk 值,加性注意力在不缩放的情况下优于点积注意力[3]。我们推测,对于较大的 dkd_kdk 值,点积的数值会变得很大,从而将 softmax 函数推入梯度极小的区域[4]。为了应对这一问题,我们将点积通过 1dk\frac{1}{\sqrt{d_k}}dk1 进行缩放。
3.2.2 多头注意力
Figure 2: (left) Scaled Dot-Product Attention. (right) Multi-Head Attention consists of several
attention layers running in parallel.
与其使用 dmodeld_{\text{model}}dmodel 维度的键、值和查询执行单一注意力函数,我们发现将查询、键和值分别线性投影为 dkd_kdk、 dkd_kdk 和 dvd_vdv 维度 hhh 次,并行执行注意力函数,效果更佳。每个投影的查询、键和值的注意力函数并行执行,生成 dvd_vdv 维度的输出值。这些输出值会被连接起来,并再次进行线性投影,生成最终输出,如图 2。
多头注意力机制允许模型在不同的位置从不同的表示子空间中同时关注信息。而单头注意力由于取平均的原因,会抑制这种效果。
MultiHead(Q,K,V)=Concat(head1,…,headh)WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O MultiHead(Q,K,V)=Concat(head1,…,headh)WO
其中,
headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i = \text{Attention}(QW^Q_i, KW^K_i, VW^V_i) headi=Attention(QWiQ,KWiK,VWiV)
投影矩阵分别为参数矩阵 WiQ∈Rdmodel×dkW^Q_i \in \mathbb{R}^{d_{\text{model}} \times d_k}WiQ∈Rdmodel×dk、 WiK∈Rdmodel×dkW^K_i \in \mathbb{R}^{d_{\text{model}} \times d_k}WiK∈Rdmodel×dk、 WiV∈Rdmodel×dvW^V_i \in \mathbb{R}^{d_{\text{model}} \times d_v}WiV∈Rdmodel×dv 和 WO∈Rhdv×dmodelW^O \in \mathbb{R}^{h d_v \times d_{\text{model}}}WO∈Rhdv×dmodel。
在这项工作中,我们采用了 h=8h = 8h=8 个并行的注意力层(或称为头)。对于每个头,我们使用 dk=dv=dmodel/h=64d_k = d_v = d_{\text{model}} / h = 64dk=dv=dmodel/h=64。由于每个头的维度减少,整个多头注意力机制的计算成本与全维度的单头注意力机制相似。
3.2.3 注意力机制在模型中的应用
Transformer 模型以三种不同的方式使用多头注意力机制:
- 编码器-解码器注意力层中,查询来自前一解码器层,而记忆中的键和值来自编码器的输出。这允许解码器中的每个位置关注输入序列中的所有位置。这模拟了典型的序列到序列模型中的编码器-解码器注意力机制,如[38, 2, 9]。
- 编码器包含自注意力层。在自注意力层中,所有的键、值和查询都来自同一个地方,即来自编码器中上一层的输出。编码器中的每个位置都可以关注编码器上一层中的所有位置。
- 解码器中的自注意力层类似,允许解码器中的每个位置关注解码器中从当前位置往前的所有位置。为了保持自回归特性,我们需要防止解码器中信息向左流动。我们通过缩放点积注意力机制中的掩码操作来实现这一点,将 softmax 输入中对应于非法连接的值设置为 −∞-\infty−∞。参见图 2。
3.3 逐点前馈网络
除了注意力子层外,我们的编码器和解码器的每一层还包含一个全连接的前馈网络,该网络在每个位置上独立且相同地应用。这个前馈网络由两个线性变换组成,中间带有一个 ReLU 激活函数。
FFN(x)=max(0,xW1+b1)W2+b2\text{FFN}(x) = \text{max}(0, xW_1 + b_1)W_2 + b_2 FFN(x)=max(0,xW1+b1)W2+b2
虽然线性变换在不同的位置上是相同的,但它们在不同的层中使用不同的参数。另一种描述方式是,将其看作两个核大小为 1 的卷积操作。输入和输出的维度为 dmodel=512d_{\text{model}} = 512dmodel=512,内部层的维度为 dff=2048d_{\text{ff}} = 2048dff=2048。
3.4 嵌入和 Softmax
与其他序列转导模型类似,我们使用学习到的嵌入将输入标记和输出标记转换为维度为 dmodeld_{\text{model}}dmodel 的向量。我们还使用通常的学习线性变换和 softmax 函数,将解码器输出转换为预测下一个标记的概率。在我们的模型中,我们在两个嵌入层和预-softmax线性变换之间共享同一个权重矩阵,类似于文献 [30]。在嵌入层中,我们将这些权重乘以 dmodel\sqrt{d_{\text{model}}}dmodel。
3.5 位置编码
由于我们的模型不包含递归和卷积,为了让模型能够利用序列的顺序,我们必须注入一些关于标记在序列中相对或绝对位置的信息。为此,我们在编码器和解码器堆栈的底部将“位置编码”添加到输入嵌入中。位置编码的维度与嵌入相同,为 dmodeld_{\text{model}}dmodel,以便两者可以相加。位置编码有多种选择,包括学习到的和固定的 [9]。在本研究中,我们使用不同频率的正弦和余弦函数:
PEpos,2i=sin(pos100002i/dmodel)PE_{\text{pos}, 2i} = \sin\left(\frac{\text{pos}}{10000^{2i/d_{\text{model}}}}\right) PEpos,2i=sin(100002i/dmodelpos)
PEpos,2i+1=cos(pos100002i/dmodel)PE_{\text{pos}, 2i+1} = \cos\left(\frac{\text{pos}}{10000^{2i/d_{\text{model}}}}\right) PEpos,2i+1=cos(100002i/dmodelpos)
其中 pos\text{pos}pos 是位置, iii 是维度。也就是说,位置编码的每个维度对应于一个正弦波。波长从 2π2\pi2π 到 10000⋅2π10000 \cdot 2\pi10000⋅2π 形成一个几何级数。我们选择这个函数是因为我们假设它将使模型更容易通过相对位置进行注意,因为对于任何固定偏移量 kkk, PEpos+k\text{PE}{\text{pos}+k}PEpos+k 可以表示为 PEpos\text{PE}{\text{pos}}PEpos 的线性函数。
我们还尝试使用学习到的位置嵌入 [9],发现这两种版本的结果几乎相同(见表 3 第 (E) 行)。我们选择了正弦波版本,因为它可能使模型能够推断出比训练期间遇到的更长序列的长度。
4 Why Self-Attention
在本节中,我们比较了自注意力层与常用于将一个可变长度的符号表示序列 (x1,…,xn)(x_1, \ldots, x_n)(x1,…,xn) 映射到另一个相同长度的序列 (z1,…,zn)(z_1, \ldots, z_n)(z1,…,zn) 的递归和卷积层的各个方面,其中 xi,zi∈Rdx_i, z_i \in \mathbb{R}^dxi,zi∈Rd,例如典型序列转导编码器或解码器中的隐藏层。我们考虑了使用自注意力的三个需求。
其中之一是每层的总计算复杂度。另一个是可以并行化的计算量,衡量标准是所需的最小序列操作数。
第三个是网络中长距离依赖之间的路径长度。学习长距离依赖是许多序列转导任务中的一个关键挑战。影响学习此类依赖能力的一个关键因素是前向和后向信号在网络中必须遍历的路径长度。输入和输出序列中任何组合位置之间的路径越短,学习长距离依赖的难度就越小 [12]。因此,我们还比较了由不同层类型组成的网络中任何两个输入和输出位置之间的最大路径长度。
表 1:不同层类型的最大路径长度、每层复杂度和最小序列操作数。 nnn 是序列长度, ddd 是表示维度, kkk 是卷积的核大小, rrr 是限制自注意力中的邻域大小。
如表 1 所示,自注意力层以恒定的序列执行操作数量连接所有位置,而递归层则需要 O(n)O(n)O(n) 的序列操作。在计算复杂度方面,当序列长度 nnn 小于表示维度 ddd 时,自注意力层比递归层更快,这在使用最先进的机器翻译模型时通常是这种情况,例如字片 [38] 和字节对 [31] 表示法。为了提高处理非常长序列任务的计算性能,自注意力可以限制为仅考虑围绕各自输出位置的输入序列中的大小为 rrr 的邻域。这将使最大路径长度增加到 O(n/r)O(n/r)O(n/r)。我们计划在未来的工作中进一步研究这种方法。
单个宽度为 k<nk < nk<n 的卷积层不会连接所有输入和输出位置对。在连续核的情况下,做到这一点需要堆叠 O(n/k)O(n/k)O(n/k) 个卷积层,或者在扩张卷积的情况下需要 O(logk(n))O(\log_k(n))O(logk(n)) [18],从而增加了网络中任何两个位置之间最长路径的长度。与递归层相比,卷积层通常更加昂贵,增加了一个 kkk 的倍数。然而,分离卷积 [6] 显著降低了复杂度,变为 O(k⋅n⋅d+n⋅d2)O(k \cdot n \cdot d + n \cdot d^2)O(k⋅n⋅d+n⋅d2)。即使在 k=nk = nk=n 的情况下,分离卷积的复杂度也等于自注意力层和逐点前馈层的组合,这正是我们模型中的方法。
作为一个附加好处,自注意力可能会产生更具可解释性的模型。我们检查了模型的注意力分布,并在附录中展示和讨论了一些例子。单个注意力头不仅清晰地学习执行不同的任务,许多头似乎还表现出与句子的句法和语义结构相关的行为。
5 Training
本节描述了我们模型的训练方案。
5.1 训练数据和批处理
我们在标准的 WMT 2014 英德数据集上进行训练,该数据集包含约 450 万对句子。句子使用字节对编码 [3] 进行编码,具有大约 37000 个标记的共享源-目标词汇。对于英法翻译,我们使用了更大的 WMT 2014 英法数据集,包含 3600 万句,并将标记拆分为一个 32000 个词片的词汇 [38]。句子对按近似序列长度进行批处理。每个训练批次包含一组句子对,包含大约 25000 个源标记和 25000 个目标标记。
5.2 硬件和调度
我们在一台配备 8 个 NVIDIA P100 GPU 的机器上训练模型。对于我们使用的超参数,基础模型的每个训练步骤大约需要 0.4 秒。我们总共训练基础模型 100,000 步,或 12 小时。对于我们的“大”模型(在表 3 的底部描述),每步时间为 1.0 秒。这些大模型训练了 300,000 步(3.5 天)。
5.3 优化器
我们使用了 Adam 优化器 [20],设置为 β1=0.9\beta_1 = 0.9β1=0.9、 β2=0.98\beta_2 = 0.98β2=0.98 和 ϵ=10−9\epsilon = 10^{-9}ϵ=10−9。我们在训练过程中根据以下公式变化学习率:
lrate=dmodel−0.5⋅min(step_num−0.5,step_num⋅warmup_steps−1.5)\text{lrate} = d_{\text{model}}^{-0.5} \cdot \min(\text{step\_num}^{-0.5}, \text{step\_num} \cdot \text{warmup\_steps}^{-1.5}) lrate=dmodel−0.5⋅min(step_num−0.5,step_num⋅warmup_steps−1.5)
这对应于在前 warmup_steps\text{warmup\_steps}warmup_steps 次训练步骤中线性增加学习率,随后根据步骤数的倒数平方根按比例减小学习率。我们使用了 warmup_steps=4000\text{warmup\_steps} = 4000warmup_steps=4000。
5.4 正则化
我们在训练期间采用了三种类型的正则化:
- 残差丢弃(Residual Dropout):我们在每个子层的输出上应用 dropout [33],在其被添加到子层输入并进行归一化之前。此外,我们还在编码器和解码器堆栈中嵌入和位置编码的和上应用 dropout。对于基础模型,我们使用的丢弃率为 Pdrop=0.1P_{\text{drop}} = 0.1Pdrop=0.1。
- 标签平滑(Label Smoothing):在训练期间,我们采用了标签平滑,值为 ϵls=0.1\epsilon_{\text{ls}} = 0.1ϵls=0.1 [36]。这会导致困惑度(perplexity)变差,因为模型学习变得更加不确定,但提高了准确性和 BLEU 分数。
表 2:Transformer 在英德和英法 newstest2014 测试中比之前的最先进模型取得了更好的 BLEU 分数,同时训练成本大幅降低。
6 Results
6.1 机器翻译
在 WMT 2014 英德翻译任务中,大型 Transformer 模型(表 2 中的 Transformer (big))超过了之前报告的最佳模型(包括集成模型)超过 2.0 BLEU,建立了新的最先进的 BLEU 分数为 28.4。该模型的配置在表 3 的底部列出。训练在 8 个 P100 GPU 上进行了 3.5 天。即使是我们的基础模型,也超过了所有之前发表的模型和集成模型,其训练成本仅为任何竞争模型的一小部分。
在 WMT 2014 英法翻译任务中,我们的大型模型达到了 41.0 的 BLEU 分数,超过了所有之前发布的单个模型,且训练成本不到之前最先进模型的四分之一。用于英法翻译的 Transformer (big) 模型使用的丢弃率为 Pdrop=0.1P_{\text{drop}} = 0.1Pdrop=0.1,而不是 0.3。
对于基础模型,我们使用了一个通过平均最后 5 个检查点获得的单一模型,这些检查点每 10 分钟写入一次。对于大型模型,我们平均了最后 20 个检查点。我们使用了束搜索(beam search),束大小为 4,长度惩罚 α=0.6\alpha = 0.6α=0.6 [38]。这些超参数是在开发集上进行实验后选择的。我们在推理过程中将最大输出长度设置为输入长度 + 50,但在可能的情况下提前终止 [38]。
表 2:Transformer 在英德和英法 newstest2014 测试中,以较少的训练成本,取得了比之前最先进模型更高的 BLEU 分数。
表 2 总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过将训练时间、使用的 GPU 数量和每个 GPU 的持续单精度浮点能力的估计相乘,估算了训练模型所使用的浮点运算数量。
6.2 模型变体
为了评估 Transformer 不同组件的重要性,我们以不同方式改变基础模型,并测量其在开发集 newstest2013 上的英德翻译性能变化。我们使用了前面一节描述的束搜索,但没有进行检查点平均。我们将这些结果呈现在表 3 中。
表 3:Transformer 架构的变体。未列出的参数与基础模型相同。所有指标基于英德翻译开发集 newstest2013。列出的困惑度是按照我们的字节对编码计算的每词块困惑度,不应与每词困惑度进行比较。
在表 3 的 (A) 行中,我们改变了注意力头的数量以及注意力键和值的维度,同时保持计算量恒定,如第 3.2.2 节所述。虽然单头注意力比最佳设置低 0.9 BLEU,但使用过多的头也会导致质量下降。
在表 3 的 (B) 行中,我们观察到减小注意力键的大小 dkd_kdk 会损害模型质量。这表明,确定兼容性并不容易,可能需要比点积更复杂的兼容性函数。我们在 © 和 (D) 行中进一步观察到,正如预期的那样,更大的模型效果更好,且 dropout 在避免过拟合方面非常有帮助。在 (E) 行中,我们用学习到的位置嵌入 [9] 替换了正弦位置编码,并观察到与基础模型的结果几乎相同。
6.3 英语成分解析
为了评估 Transformer 是否能够推广到其他任务,我们进行了英语成分解析的实验。该任务具有一些特定的挑战:输出受强结构约束,且输出序列显著长于输入。此外,RNN 序列到序列模型在小数据场景中未能取得最先进的结果 [37]。
我们在 Penn Treebank [25] 的《华尔街日报》(WSJ)部分上训练了一个 4 层的 Transformer,模型维度 dmodel=1024d_{\text{model}} = 1024dmodel=1024,大约 40K 条训练句子。我们还在半监督设置下训练了模型,使用了更大的高置信度和 BerkeleyParser 语料库,约 1700 万条句子 [37]。在仅 WSJ 设置下,我们使用了包含 16K 个词的词汇表,而在半监督设置下使用了包含 32K 个词的词汇表。
我们仅进行了少量实验来选择 dropout(包括注意力和残差的 dropout,详见第 5.4 节)、学习率和束大小,实验在 Section 22 的开发集上进行,所有其他参数与英德翻译基础模型保持不变。在推理期间,我们将最大输出长度增加至输入长度加 300。我们在 WSJ 和半监督设置下都使用了束大小为 21,长度惩罚 α=0.3\alpha = 0.3α=0.3。
表 4:Transformer 在英语成分解析任务上表现出良好的泛化能力(结果基于 WSJ 数据集的第 23 部分)。
表 4 中的结果显示,尽管缺乏针对任务的特定调整,我们的模型表现出令人惊讶的好效果,优于所有之前报道的模型,除了递归神经网络语法(Recurrent Neural Network Grammar, RNNG)[8]。
与 RNN 序列到序列模型 [37] 相比,Transformer 即使仅在 40K 条句子的 WSJ 训练集上训练,也超过了 BerkeleyParser [29] 的表现。
7 Conclusion
在这项工作中,我们提出了 Transformer,这是首个完全基于注意力机制的序列转换模型,使用多头自注意力替代了编码器-解码器架构中最常用的循环层。
在翻译任务中,Transformer 的训练速度显著快于基于循环或卷积层的架构。在 WMT 2014 英德翻译和 WMT 2014 英法翻译任务中,我们取得了新的最先进成果。在前一个任务中,我们的最佳模型甚至超越了所有先前报道的集成模型。
我们对基于注意力的模型的未来感到兴奋,并计划将它们应用于其他任务。我们计划将 Transformer 扩展到输入和输出模式不只是文本的问题,并研究局部、受限的注意力机制,以高效处理大规模输入和输出,例如图像、音频和视频。减少生成过程的顺序性也是我们的研究目标之一。
用于训练和评估我们模型的代码可以在 https://github.com/tensorflow/tensor2tensor 获得。
Attention Visualizations
图 3:展示了在第 6 层中的第 5 层编码器自注意力机制中跟踪长距离依赖的示例。许多注意力头关注动词“making”的远距离依赖,完成短语“making…more difficult”。此处仅展示了单词“making”的注意力分布。不同颜色代表不同的注意力头。彩色查看效果最佳。