这篇论文介绍了 Transformer 模型,它是第一个完全基于 自注意力机制(self-attention) 的序列转换模型,旨在替代传统的 循环神经网络(RNN) 或 卷积神经网络(CNN) 用于序列到序列的任务,如机器翻译。
Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[M]. arXiv, 2023.
代码 链接
主要内容总结:
-
背景与动机:
- 传统的序列到序列模型(如基于 RNN 或 CNN 的模型)在处理长序列时需要大量的计算和序列对齐操作,这使得训练和推理变得非常慢且难以并行化。
- 自注意力机制通过计算序列中各位置之间的相关性,能够在更少的时间内捕获全局信息,极大地提高了效率。
-
Transformer 模型架构:
- 编码器-解码器结构: Transformer 采用标准的编码器-解码器结构,但与传统的序列模型不同,它完全依赖 多头自注意力(Multi-Head Self-Attention) 和 位置编码 来捕获序列中的依赖关系。
- 编码器和解码器由多个相同的层堆叠而成,每一层包含 自注意力子层 和 前馈网络子层。这使得模型可以并行化训练,避免了 RNN 模型中逐步计算的瓶颈。
-
自注意力机制:
- Scaled Dot-Product Attention: Transformer 使用 缩放点积注意力(Scaled Dot-Product Attention)来计算查询(query)和键(key)之间的兼容性,进而获得每个值(value)的加权和。
- 多头注意力: 为了让模型能够在不同的子空间上并行计算不同的注意力模式,Transformer 使用了多头注意力机制。多个不同的注意力头可以并行计算,并将结果合并。
-
训练与优化:
- Transformer 在 WMT 2014 英语-德语 和 英语-法语 机器翻译任务中实现了最先进的效果,并且训练速度大幅度提升。
- 采用了 Adam 优化器 和 学习率调度(学习率在训练开始时逐步增加,然后根据步数递减)。
- 使用了 残差连接、层归一化 和 dropout 等正则化技术来防止过拟合。
-
实验与结果:
- 在机器翻译任务上,Transformer 在训练时间和翻译质量上均优于传统的基于 RNN 或 CNN 的模型。
- 通过大量实验,作者发现 模型规模、多头注意力的数量、位置编码的选择 等都对性能有显著影响。
- Transformer 模型在英语-德语和英语-法语任务中都达到了新的 BLEU 分数(评估翻译质量的标准),且相比于传统方法,训练时间更短,效率更高。
-
结论与未来方向:
- Transformer 是一种强大的模型,在许多序列到序列任务中展现了优异的性能,特别是在机器翻译领域。
- 作者计划将 Transformer 扩展到处理其他模态(如图像、音频、视频等)和长序列的任务。
- Transformer 还为未来在其他领域的应用,如图像处理、语音识别等,提供了新的可能性。
总结:
这篇论文的核心贡献是提出了 Transformer 模型,它通过完全依赖 自注意力机制 来提高序列到序列任务(如机器翻译)的性能。相比于传统的 RNN 和 CNN,Transformer 在计算效率、并行化训练和长距离依赖捕捉方面具有明显优势,开创了自然语言处理(NLP)领域的新纪元。
全文翻译
摘要
当前主流的序列转换模型主要基于复杂的循环神经网络(RNN)或卷积神经网络(CNN),并包含一个编码器和一个解码器。在性能最优的模型中,编码器与解码器之间还通过注意力机制进行连接。
我们提出了一种全新的、结构简单的网络架构 —— Transformer,该模型完全基于注意力机制,完全摒弃了循环与卷积结构。
在两个机器翻译任务上的实验结果表明,该模型不仅在翻译质量上表现更优,同时也更易于并行计算,且训练所需时间显著减少。
在 WMT 2014 英语到德语的翻译任务中,我们的模型取得了 28.4 的 BLEU 分数,相比此前的最佳结果(包括模型集成)提高了超过 2 分。
在 WMT 2014 英语到法语的翻译任务中,我们的单模型在 8 个 GPU 上训练 3.5 天后,达到了 41.8 的 BLEU 分数,创下了单模型的最新最佳成绩,其训练成本仅为文献中其他最佳模型的一小部分。
此外,我们还将 Transformer 应用于英语成分句法分析任务,在大规模和小规模数据集上均取得了良好的泛化效果,进一步证明了该模型的通用性。
1 引言
循环神经网络(Recurrent Neural Networks, RNNs),尤其是长短期记忆网络(Long Short-Term Memory, LSTM)[13] 和门控循环单元网络(Gated Recurrent Units, GRUs)[7],已经被广泛确立为在语言建模、机器翻译等序列建模与转换任务中的最先进方法 [35, 2, 5]。
随后大量研究持续推动循环语言模型与编码器-解码器架构的边界 [38, 24, 15]。
循环模型通常会在输入和输出序列的符号位置上逐步展开计算。将位置与计算时间步对齐,它们会根据前一个隐藏状态 h t − 1 h_{t-1} ht−1 和当前输入生成一个隐藏状态 h t h_t ht 。
这种固有的序列性使得在一个训练样本内部难以实现并行处理,尤其在序列较长时,这一点变得尤为关键,因为内存限制会限制跨样本的批处理能力。
近期的研究通过一些因式分解技巧 [21] 和条件计算方法 [32] 在提高计算效率方面取得了显著进展,后者在提升模型性能方面也有所表现。但序列计算这一根本限制依然存在。
注意力机制已成为各种序列建模与转换任务中强大模型的重要组成部分,它能在不考虑输入或输出序列中距离远近的情况下建模依赖关系 [2, 19]。然而,除了极少数例外 [27],大多数情况下注意力机制仍是作为循环网络的辅助组成部分出现的。
在本研究中,我们提出了一种全新的模型架构 —— Transformer。该架构完全摒弃了循环结构,完全依赖注意力机制来捕捉输入与输出之间的全局依赖关系。
Transformer 结构极大地增强了并行处理能力,在仅使用 8 张 P100 GPU 训练 12 小时的情况下,就能达到翻译质量的新 SOTA(最优性能)水平。
2 背景
减少序列计算的目标也是 Extended Neural GPU [16]、ByteNet [18] 和 ConvS2S [9] 等模型的核心理念。这些模型都以卷积神经网络(CNN)作为基本构件,能够对所有输入和输出位置的隐藏表示进行并行计算。
在这些模型中,关联两个任意输入或输出位置的信号所需的运算次数会随着位置之间的距离增加而增加:对于 ConvS2S 是线性增长,ByteNet 则是对数增长。这使得模型在学习远距离位置之间的依赖关系时更加困难 [12]。
在 Transformer 中,这一过程被简化为常数数量的操作,尽管代价是由于注意力权重加权求平均,导致了有效分辨率的降低。我们通过第 3.2 节中所描述的 多头注意力机制(Multi-Head Attention) 来缓解这一问题。
自注意力机制(Self-Attention),有时也称为序列内部注意力机制(Intra-Attention),是一种在同一序列的不同位置之间建立联系的机制,用以计算该序列的表示。
自注意力已在多种任务中取得成功应用,包括:阅读理解、抽象摘要、文本蕴含、以及学习与任务无关的句子表示 [4, 27, 28, 22]。
端到端记忆网络(End-to-End Memory Networks)基于一种循环注意力机制,而不是按序列对齐的循环结构,并在简化语言问答与语言建模等任务中表现良好 [34]。
但据我们所知,Transformer 是第一个完全依赖自注意力机制、在不使用序列对齐的 RNN 或卷积结构的前提下构建输入与输出表示的转换模型(Transduction Model)。
在接下来的章节中,我们将详细介绍 Transformer 的结构,阐述我们使用自注意力机制的动机,并讨论其相较于 [17]、[18] 和 [9] 等模型的优势。
3 模型架构
大多数性能优越的神经序列转换模型采用编码器-解码器结构 [5, 2, 35]。
在这种架构中,编码器将输入符号序列
(
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)。
在每一步中,模型是自回归的(auto-regressive)[10],即在生成下一个符号时,会使用先前已生成的符号作为额外输入。
Transformer 遵循这一整体架构,但在编码器和解码器中都使用了堆叠的自注意力机制(self-attention) 与 逐位置的全连接前馈神经网络(point-wise feed-forward layers),如图 1 左右两侧所示。
3.1 编码器与解码器堆叠结构
编码器(Encoder):
编码器由 N = 6 N = 6 N=6 层相同结构的堆叠层组成。每一层包含两个子层:
- 一个 多头自注意力机制(Multi-Head Self-Attention);
- 一个简单的 逐位置全连接前馈网络(Position-wise Feed-Forward Network)。
我们在每个子层外围都使用残差连接(Residual Connection)[11],随后接层归一化(Layer Normalization) [1]。
也就是说,每个子层的输出形式为:
LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x)) LayerNorm(x+Sublayer(x))
其中, Sublayer ( x ) \text{Sublayer}(x) Sublayer(x) 是该子层本身实现的函数。
为了使残差连接维度一致,模型中的所有子层(包括嵌入层)输出的维度均为 d model = 512 d_{\text{model}} = 512 dmodel=512。
解码器(Decoder):
解码器同样由 N = 6 N = 6 N=6 层相同结构的堆叠层组成。
与编码器每层的两个子层相比,解码器每层包含三个子层:
- 一个多头自注意力子层;
- 一个多头注意力子层,用于关注编码器输出;
- 一个逐位置前馈网络。
我们同样在每个子层外围使用残差连接和层归一化。
此外,我们对解码器中的自注意力子层做了修改:禁止某个位置关注其之后的位置(即进行掩蔽处理)。
这种掩蔽机制与输出嵌入向后偏移一位的设计相结合,确保了第
i
i
i 个位置的预测只能依赖于小于
i
i
i 的已知输出。
3.2 注意力机制
注意力函数的定义是:给定一个查询向量(query) 和一组键-值对(key-value pairs),将其映射为一个输出。
其中,查询、键、值和输出都是向量。
输出是值的加权和,每个值所对应的权重通过查询与对应键之间的兼容函数(compatibility function) 计算得到。
3.2.1 缩放点积注意力(Scaled Dot-Product Attention)
我们提出的特定注意力机制称为缩放点积注意力(Scaled Dot-Product Attention)(如图 2 所示)。
输入包括维度为
d
k
d_k
dk 的查询(query) 与键(key),以及维度为
d
v
d_v
dv 的值(value)。
我们先计算查询与所有键的点积,然后将每个结果除以 d k \sqrt{d_k} dk,再通过 softmax 函数获得值的权重。
在实际实现中,我们同时对一组查询计算注意力,将它们打包为矩阵
Q
Q
Q,同时将键和值打包为矩阵
K
K
K 与
V
V
V。
最终输出的计算公式如下:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V (1) \text{Attention}(Q, K, V) = \text{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right)V \tag{1} Attention(Q,K,V)=softmax(dkQKT)V(1)
当前常见的两种注意力机制是 加性注意力(Additive Attention) [2] 和 点积注意力(Dot-Product Attention)。
点积注意力几乎与我们的算法一致,只是我们增加了缩放因子
1
/
d
k
\sqrt{1/d_k}
1/dk。
加性注意力通过一个前馈神经网络(含一个隐藏层)来计算兼容性函数。
尽管两种方法在理论计算复杂度上相近,但点积注意力在实际中速度更快、内存效率更高,因为它可以通过高度优化的矩阵乘法实现。
当
d
k
d_k
dk 较小时,两种机制性能相近;但当
d
k
d_k
dk 较大时,未经缩放的点积注意力表现变差 [3]。
我们认为这是由于点积结果数值过大,softmax 函数进入梯度极小区域,导致训练困难。
为了解决这个问题,我们在点积中引入缩放因子
d
k
\sqrt{d_k}
dk。
3.2.2 多头注意力机制(Multi-Head Attention)
我们发现:与其直接对 d model d_{\text{model}} dmodel 维的查询、键和值应用一次注意力机制,不如将它们分别线性变换 h h h 次,每次使用不同的可学习参数,投影到维度 d k d_k dk 和 d v d_v dv。
我们在这些投影版本上并行地执行注意力函数,得到 d v d_v dv 维的输出,然后拼接(concatenate)这些输出并再次线性变换,得到最终的注意力结果,如图 2 所示。
这种 多头注意力机制 允许模型在不同的位置、从不同的表示子空间中并行获取信息,而单个注意力头在平均时会抑制这种多样性。
多头注意力的计算公式为:
MultiHead ( Q , K , V ) = Concat ( head 1 , . . . , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO
其中:
head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)
投影矩阵为:
- W i Q ∈ R d model × d k W_i^Q \in \mathbb{R}^{d_{\text{model}} \times d_k} WiQ∈Rdmodel×dk
- W i K ∈ R d model × d k W_i^K \in \mathbb{R}^{d_{\text{model}} \times d_k} WiK∈Rdmodel×dk
- W i V ∈ R d model × d v W_i^V \in \mathbb{R}^{d_{\text{model}} \times d_v} WiV∈Rdmodel×dv
- W O ∈ R h d v × d model W^O \in \mathbb{R}^{h d_v \times d_{\text{model}}} WO∈Rhdv×dmodel
在本文中,我们使用 h = 8 h = 8 h=8 个并行的注意力头,每个头使用 d k = d v = d model / h = 64 d_k = d_v = d_{\text{model}} / h = 64 dk=dv=dmodel/h=64。
由于每个注意力头的维度被压缩,因此总计算量与单头注意力相当,但能带来更强的表达能力。
3.2.3 模型中注意力机制的应用
Transformer 中的多头注意力被应用在三个不同的位置:
-
编码器-解码器注意力(Encoder-Decoder Attention):
查询来自解码器的上一层,键和值来自编码器的输出。这使得解码器的每个位置都能关注输入序列的所有位置,仿照了传统的序列到序列模型中的注意力机制 [38, 2, 9]。 -
编码器中的自注意力(Self-Attention):
键、值、查询都来自编码器前一层的输出。这样,编码器的每个位置都可以关注输入序列中的所有其他位置。 -
解码器中的自注意力(Masked Self-Attention):
解码器中的每个位置只能关注当前位置及其之前的位置。
为了保留模型的自回归特性,我们在 scaled dot-product attention 中实现了掩蔽机制:对 softmax 的输入中所有非法连接的位置设为 − ∞ -\infty −∞,从而使 softmax 输出为 0(即无法关注未来位置)。
3.3 逐位置前馈网络(Position-wise Feed-Forward Networks)
除了注意力子层,每个编码器和解码器的层中还包含一个全连接前馈神经网络,它被独立地应用于序列中的每一个位置。
该前馈网络包含两个线性变换,中间使用 ReLU 激活函数:
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 (2) \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 \tag{2} FFN(x)=max(0,xW1+b1)W2+b2(2)
虽然这个前馈网络在不同的位置上是相同的,但它在不同的层中具有不同的参数。
换句话说,它也可以看作是核大小为 1 的两个卷积操作。
网络的输入与输出维度均为 d model = 512 d_{\text{model}} = 512 dmodel=512,而隐藏层的维度为 d ff = 2048 d_{\text{ff}} = 2048 dff=2048。
3.4 嵌入层与 Softmax(Embeddings and Softmax)
与其他序列转导模型类似,我们使用**可学习的嵌入(embedding)**将输入与输出 token 转换为 d model d_{\text{model}} dmodel 维向量。
我们还使用常规的线性变换 + softmax 函数,将解码器的输出转换为对下一个 token 的预测概率。
在本模型中,我们将输入嵌入层、输出嵌入层与输出 softmax 前的线性变换使用了相同的权重矩阵,类似于 [30] 中的方法。
在嵌入层中,我们将权重矩阵乘以 d model \sqrt{d_{\text{model}}} dmodel 进行缩放。
3.5 位置编码(Positional Encoding)
由于本模型不使用任何循环(RNN)或卷积(CNN),我们必须向模型注入关于序列中 token 顺序的信息。
为此,我们在编码器和解码器堆栈的输入嵌入底部添加位置编码(Positional Encoding)。
这些位置编码的维度与嵌入向量相同(即 d model d_{\text{model}} dmodel),这样就可以将它们直接相加。
位置编码可以是固定的(如正余弦),也可以是可学习的 [9]。
在本工作中,我们使用了不同频率的正弦与余弦函数来构造位置编码:
-
对于偶数维度( 2 i 2i 2i):
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i d model ) PE(pos, 2i) = \sin\left(\frac{pos}{10000^{\frac{2i}{d_{\text{model}}}}}\right) PE(pos,2i)=sin(10000dmodel2ipos)
-
对于奇数维度( 2 i + 1 2i+1 2i+1):
P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i d model ) PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{\frac{2i}{d_{\text{model}}}}}\right) PE(pos,2i+1)=cos(10000dmodel2ipos)
其中, p o s pos pos 是位置, i i i 是维度索引。也就是说,每一个维度的编码都是一个不同频率的正弦波。
这些波的波长从 2 π 2\pi 2π 到 10000 ⋅ 2 π 10000 \cdot 2\pi 10000⋅2π 呈几何级数增长。
我们选择这种函数形式是基于以下假设:
模型可以方便地根据相对位置学习注意力机制,因为对于任意的偏移量
k
k
k,
P
E
p
o
s
+
k
PE_{pos+k}
PEpos+k 可以被表示为
P
E
p
o
s
PE_{pos}
PEpos 的线性函数。
我们也尝试了可学习的位置嵌入(learned positional embeddings),但发现这两种方式在实验结果上几乎一致(见表 3,第 (E) 行)。
最终我们选择了正余弦形式,因为它在理论上允许模型在测试时处理比训练时更长的序列。
4 为什么使用自注意力机制(Why Self-Attention)
在本节中,我们将自注意力(Self-Attention)层与传统用于序列转导模型中的循环(Recurrent)层与卷积(Convolutional)层进行比较。目标是将一个变长的符号表示序列 ( 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 \in \mathbb{R}^d xi,zi∈Rd,这类转换在典型的编码器或解码器中极为常见。
我们使用以下三个衡量标准来阐明使用自注意力的动机:
1. 每层的总计算复杂度(Computational Complexity per Layer)
自注意力层在每一层中所需的计算复杂度为:
- O ( n 2 ⋅ d ) O(n^2 \cdot d) O(n2⋅d),其中 n n n 是序列长度, d d d 是表示维度。
相比之下,循环层的复杂度为:
- O ( n ⋅ d 2 ) O(n \cdot d^2) O(n⋅d2)
当序列长度 n n n 小于表示维度 d d d(这在现代机器翻译中的表示方法如 word-piece [38]、byte-pair encoding [31] 中非常常见),自注意力将比循环更高效。
2. 可并行化的计算量(Parallelization)
- 自注意力层可以将所有位置之间的连接在常数个操作内完成,高度并行。
- 循环网络的依赖是严格顺序的,至少需要 O ( n ) O(n) O(n) 的顺序操作。
因此,自注意力机制比循环结构具有更高的并行效率,训练速度也更快。
3. 长程依赖的路径长度(Path Length for Long-Range Dependencies)
学习长距离依赖一直是序列建模中的关键挑战之一。
影响模型捕捉这种依赖能力的一个重要因素是:前向或反向信号在网络中传播所需的路径长度。路径越短,模型越容易学习这些依赖关系 [12]。
如下表所示(见原论文 Table 1):
层类型 | 每层复杂度 | 最小顺序操作数 | 最大路径长度 |
---|---|---|---|
自注意力(Self-Attention) | O ( n 2 ⋅ d ) O(n^2 \cdot d) O(n2⋅d) | O ( 1 ) O(1) O(1) | O ( 1 ) O(1) O(1) |
循环(Recurrent) | O ( n ⋅ d 2 ) O(n \cdot d^2) O(n⋅d2) | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) |
卷积(Convolution) | O ( k ⋅ n ⋅ d ) O(k \cdot n \cdot d) O(k⋅n⋅d) | O ( 1 ) O(1) O(1) | O ( log k ( n ) ) O(\log_k(n)) O(logk(n))(空洞卷积)或 O ( n / k ) O(n/k) O(n/k)(普通卷积) |
可以看出,自注意力在最大路径长度上具有绝对优势,能够更容易学习到远距离的依赖关系。
自注意力在长序列上的改进可能性
为了提高在非常长的序列上的计算效率,我们可以限制注意力只作用于以输出位置为中心的邻域大小 r r r 内的输入。
这种做法会将最大路径长度从 O ( 1 ) O(1) O(1) 增加到 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 ( log k ( n ) ) O(\log_k(n)) O(logk(n)) 个空洞卷积层 [18]
这会显著增加网络中任意两位置间的路径长度。
此外,卷积层的计算复杂度通常比循环层还高一个 k k k 的因子。
尽管可分离卷积(Separable Convolutions)[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 的情况下,其复杂度仍然等价于自注意力层 + 逐位置前馈层的组合,也就是 Transformer 所采用的方法。
可解释性(Interpretability)
使用自注意力机制还有一个额外的好处:模型更具可解释性。
我们在附录中可视化了模型中的注意力分布,并展示了具体示例。
结果表明,不同的注意力头(attention heads)确实学会了执行不同的任务。其中很多注意力头的行为与句子的语法结构和语义结构密切相关。
5 模型训练(Training)
本节介绍了我们模型的训练流程。
5.1 训练数据与批处理(Training Data and Batching)
我们使用 WMT 2014 英德翻译数据集进行训练,包含大约 450 万个句子对。句子通过 Byte-Pair Encoding (BPE) [3] 进行编码,源语言和目标语言共享一个包含约 **37,000 个词元(tokens)**的词表。
对于英语-法语(English-French)任务,我们使用了规模更大的 WMT 2014 英法数据集,总共包含 3600 万个句子对,并使用了 32,000 个词元的 WordPiece 词表 [38] 进行分词。
在批处理过程中,句子对会根据序列长度近似相等进行分组。每个训练批次大约包含:
- 25,000 个源语言 token
- 25,000 个目标语言 token
5.2 硬件与训练时间(Hardware and Schedule)
我们在一台配备了 8 块 NVIDIA P100 GPU 的机器上进行模型训练。
-
对于本文中描述的 Base 模型(基础模型,使用默认超参数):
- 每个训练步骤耗时约 0.4 秒
- 总共训练 100,000 步,耗时约 12 小时
-
对于 Big 模型(参见论文 Table 3 中底部的配置):
- 每步耗时约 1.0 秒
- 总共训练 300,000 步,训练时间为 约 3.5 天
5.3 优化器(Optimizer)
我们使用了 Adam 优化器 [20],参数设置如下:
- β 1 = 0.9 \beta_1 = 0.9 β1=0.9
- β 2 = 0.98 \beta_2 = 0.98 β2=0.98
- ϵ = 1 0 − 9 \epsilon = 10^{-9} ϵ=10−9
学习率的调度方式如下:
lrate = d model − 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 = 4000 \text{warmup\_steps} = 4000 warmup_steps=4000 步内,学习率线性上升
- 之后,学习率按 步数的负平方根 下降
这种策略帮助模型在训练初期稳定,并在后期逐步收敛。
5.4 正则化(Regularization)
训练过程中我们使用了以下三种正则化技术:
1. 残差 Dropout(Residual Dropout)
- 在每个子层的输出处应用 Dropout [33],在其与输入相加并归一化前进行
- 还在编码器和解码器中,将词嵌入与位置编码求和之后也施加 Dropout
- 对于 Base 模型,Dropout 概率设置为:
- P drop = 0.1 P_{\text{drop}} = 0.1 Pdrop=0.1
2. 标签平滑(Label Smoothing)
- 训练过程中使用 标签平滑技术,设置为:
- ϵ ls = 0.1 \epsilon_{\text{ls}} = 0.1 ϵls=0.1 [36]
- 虽然这会导致困惑度(Perplexity)指标变差(模型变得“不那么确定”),
- 但它显著提升了模型的 准确率和 BLEU 分数
6 结果(Results)
6.1 机器翻译(Machine Translation)
在 WMT 2014 英语到德语的翻译任务中,我们的 大模型(Transformer big) 的 BLEU 分数为 28.4,比此前所有已发表的模型(包括集成模型)高出超过 2.0 BLEU 分数,创下新的 最先进成绩(SOTA)。该模型的详细配置见论文中的 表 3 最后一行,训练耗时为 3.5 天,在 8 块 P100 GPU 上完成。
即使是我们成本更低的 基础模型(Base model),也超过了所有先前发布的模型和集成模型的性能,同时训练成本也只是这些竞争模型的一小部分。
在 WMT 2014 英语到法语任务中,我们的 大模型 取得了 41.0 BLEU 的成绩,超过了此前所有已发表的单模型结果,且训练成本不到之前 SOTA 模型的 四分之一。在该任务中,Transformer 大模型使用了较小的 Dropout( P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1,而非 0.3)。
- 对于基础模型,我们使用了 最近的 5 个检查点的平均值,每 10 分钟保存一次 checkpoint。
- 对于大模型,我们取了 最近 20 个检查点的平均。
推理(inference)过程中,我们使用 beam search:
- beam size = 4,
- 长度惩罚 α = 0.6 \alpha = 0.6 α=0.6 [38]
最大输出长度设为输入长度 + 50,但如果模型已生成结束标志,就提前终止生成 [38]。
表 2 总结了我们的结果,并将翻译质量和训练成本与文献中的其他模型架构进行了对比。我们估算了训练过程中的浮点运算量,方法是将训练时间、使用的 GPU 数量,以及每个 GPU 的单精度浮点计算能力相乘。
6.2 模型变体(Model Variations)
为了评估 Transformer 中各组成部分的重要性,我们对基础模型进行了多种修改,并在 英语-德语开发集 newstest2013 上测试性能变化。
- 与上一节相同,我们使用 beam search,但未进行 checkpoint 平均。
- 结果汇总于 表 3。
在 表 3 的行 (A) 中,我们调整了注意力头数和注意力键、值的维度(保持总计算量不变,见 3.2.2 节):
- 使用 单头注意力 会使 BLEU 分数下降约 0.9
- 头数过多也会导致性能下降
在 表 3 的行 (B) 中,缩小注意力键的维度( d k d_k dk)会显著降低模型质量,这表明:
- 判断兼容性(compatibility)并不简单
- 比点积更复杂的兼容性函数可能更优
行 © 和 (D) 证实了预期结论:
- 模型越大性能越好
- Dropout 有效避免过拟合
行 (E) 中,我们将正弦/余弦位置编码替换为 可学习的位置嵌入 [9],结果几乎和基础模型相同。
6.3 英语句法解析(English Constituency Parsing)
为了验证 Transformer 是否能泛化到其它任务,我们在 英语成分句法分析(constituency parsing) 上进行了实验。
此任务具有挑战性:
- 输出结构上具有严格约束
- 输出序列长度远大于输入
- RNN Seq2Seq 模型在数据量少的情况下未能取得 SOTA [37]
设置:
-
我们使用了一个 4 层 Transformer( d m o d e l = 1024 d_{model} = 1024 dmodel=1024)
-
数据集为 Penn Treebank(WSJ 部分) [25],包含约 4 万个训练句子
-
在 半监督设置 中,我们还使用了来自 [37] 的:
- High-confidence corpus
- BerkeleyParser corpus
- 总共约 1700 万句子
-
词表大小:
- WSJ-only 设置:16K
- 半监督设置:32K
仅对少数参数进行了开发集微调,包括:
- Dropout(注意力和残差)
- 学习率
- Beam size
其余参数均与 Transformer base 模型一致。
推理时:
- 最大输出长度设为输入长度 + 300
- 使用 beam size = 21, α = 0.3 \alpha = 0.3 α=0.3
结果:
我们的模型(见表 4)在没有专门为该任务做调优的情况下表现出色,超越了所有先前发表的模型(除了 Recurrent Neural Network Grammar [8] 之外)。
与 RNN Seq2Seq 模型 [37] 不同,Transformer 即使只用 4 万条 WSJ 训练数据,也优于 BerkeleyParser [29]。
7 结论(Conclusion)
在本文中,我们提出了 Transformer 模型,这是第一个完全基于注意力机制的序列转换模型。它通过 多头自注意力(multi-headed self-attention) 替代了在编码器-解码器架构中常用的 循环神经网络(RNN)层。
对于翻译任务,Transformer 相比于基于 循环神经网络 或 卷积层 的架构具有显著更快的训练速度。在 WMT 2014 英语到德语 和 WMT 2014 英语到法语 的翻译任务中,我们创造了 新的最先进成绩(SOTA)。在前者的任务中,我们的最佳模型甚至超过了所有先前报告的模型集成结果。
我们对基于注意力的模型的未来感到兴奋,计划将它们应用于其他任务。我们还计划将 Transformer 扩展到涉及文本以外的输入输出模态的问题,并研究局部的、受限的注意力机制,以有效处理大规模的输入输出,如图像、音频和视频。同时,减少生成过程的顺序性是我们的另一个研究目标。
我们用于训练和评估模型的代码可在 https://github.com/tensorflow/tensor2tensor 上找到。