【论文#目标检测】Attention Is All You Need
目录
- 摘要
- 1.引言
- 2.背景
- 3.模型架构
- 3.1 编码器和解码器栈
- 3.2 注意力
- 3.2.1 缩放点积注意力
- 3.2.2 多头注意力
- 3.2.3 我们模型中注意力的应用
- 3.3 逐位置的前馈网络
- 3.4 嵌入和Softmax
- 3.5 位置编码
- 4.为什么是自注意力
- 5.训练
- 5.1 训练数据和分批处理
- 5.2 硬件和训练计划
- 5.3 优化器
- 5.4 正则化
- 6 结果
- 6.1 机器翻译
- 6.2 模型变体
- 6.3 英语成分句法分析
- 7.结论
Author: Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin
Comments: 15 pages, 5 figures
Subjects: Computation and Language (cs.CL); Machine Learning (cs.LG)
Cite as: arXiv:1706.03762 [cs.CL]
(or arXiv:1706.03762v7 [cs.CL] for this version)
https://doi.org/10.48550/arXiv.1706.03762
PS:尽管Transformer模型最早的提出是应用在NLP领域,但其先进的架构思想,使得视觉领域也有许多重要的应用,所以这里也把Transformer模型纳入到视觉领域中来
摘要
目前主流的序列转换模型是基于复杂的循环神经网络或卷积神经网络,这些模型包括编码器和解码器。表现最好的模型还通过注意力机制将编码器和解码器连接起来。我们提出了一种新的简单网络架构——Transformer,它完全基于注意力机制,摒弃了循环和卷积结构。在两项机器翻译任务上的实验表明,这些模型在质量上更为出色,同时具有更好的并行性,并且训练时间显著减少。我们的模型在WMT 2014英德翻译任务上达到了28.4的BLEU分数,比现有的最佳结果(包括集成模型)提高了超过2 BLEU。在WMT 2014英法翻译任务上,我们的模型在使用八块GPU训练3.5天后,达到了41.8的单模型最佳BLEU分数,这仅仅是文献中最佳模型训练成本的一小部分。我们还通过将Transformer成功应用于英语成分句法分析(无论是在大量训练数据还是有限训练数据的情况下),证明了它在其他任务上的泛化能力。
1.引言
循环神经网络,尤其是长短期记忆(LSTM)[13]和门控循环单元(GRU)[7]神经网络,已经在序列建模和序列转换问题(如语言建模和机器翻译)[35, 2, 5]中被牢固地确立为最先进的方法。此后,许多研究继续推动循环语言模型和编码器-解码器架构的边界[38, 24, 15]。
循环模型通常沿着输入和输出序列的符号位置进行计算分解。将位置与计算时间的步骤对齐,它们会生成一系列隐藏状态 h t h_t ht,作为前一个隐藏状态 h t − 1 h_{t-1} ht−1和位置 t t t的输入的函数。这种固有的序列性质排除了在训练样本内的并行化,而在较长序列长度下,这变得尤为关键,因为内存限制会限制跨样本的批量处理。最近的研究通过分解技巧[21]和条件计算[32]实现了显著的计算效率提升,同时在后者的模型性能方面也有所改进。然而,序列计算的基本约束仍然存在。
注意力机制已经成为各种任务中引人注目的序列建模和转换模型的组成部分,允许对输入或输出序列中不考虑距离的依赖关系进行建模[2, 19]。然而,除了少数情况[27]之外,这种注意力机制通常与循环网络结合使用。
在本工作中,我们提出了Transformer,这是一种摒弃循环结构并完全依赖于注意力机制来捕捉输入和输出之间的全局依赖关系的模型架构。Transformer能够实现显著更高的并行化,并且在仅使用八块P100 GPU训练十二小时后,就能在翻译质量上达到新的最佳水平。
2.背景
减少序列计算的目标也构成了扩展神经GPU [16]、ByteNet [18]和ConvS2S [9]的基础,所有这些模型都以卷积神经网络作为基本构建块,为所有输入和输出位置并行计算隐藏表示。在这些模型中,将两个任意输入或输出位置的信号关联起来所需的计算操作数量会随着位置之间的距离增加而增加,对于ConvS2S是线性增长,对于ByteNet是对数增长。这使得学习远距离位置之间的依赖关系变得更加困难 [12]。而在Transformer中,这一操作数量被减少到一个固定的常数,尽管由于平均加权位置的注意力,有效分辨率有所降低,我们在第3.2节中描述的多头注意力机制(Multi-Head Attention)正是用来抵消这种影响的。
自注意力(有时也称为内部注意力)是一种注意力机制,它将单个序列的不同位置关联起来,以计算该序列的表示。自注意力已经在多种任务中成功应用,包括阅读理解、摘要生成、文本蕴含以及学习与任务无关的句子表示 [4, 27, 28, 22]。
端到端记忆网络基于循环注意力机制,而不是基于序列对齐的循环,已被证明在简单语言问答和语言建模任务中表现良好 [34]。
然而,据我们所知,Transformer是第一个完全依赖自注意力来计算输入和输出表示的转换模型,而没有使用序列对齐的循环神经网络(RNN)或卷积。在接下来的章节中,我们将描述Transformer,阐述自注意力的动机,并讨论其相对于[17, 18]和[9]等模型的优势。
3.模型架构
大多数具有竞争力的神经序列转换模型都采用了编码器-解码器结构 [5, 2, 35]。在这种结构中,编码器将一个由符号表示组成的输入序列 ( x 1 , … , x n ) (x_1, \ldots, x_n) (x1,…,xn)映射为一个连续表示的序列 z = ( z 1 , … , z n ) z = (z_1, \ldots, z_n) z=(z1,…,zn)。给定 z z z,解码器随后逐个元素地生成一个符号输出序列 ( y 1 , … , y m ) (y_1, \ldots, y_m) (y1,…,ym)。在每一步中,模型都是自回归的 [10],在生成下一个符号时,会将之前生成的符号作为额外的输入进行消费。
注解:
(1)在NLP领域,例如语言翻译,编码器将输入的英文转换成为一系列中间表示(z),解码器将z转换成为中文的输出序列。自回归(Autoregressive)的意思是,模型在生成序列时,每一步的输出都依赖于之前已生成的部分。与传统模型的对比
(2)RNN/LSTM的局限性
传统模型使用RNN或CNN处理序列,存在的问题是,长程依赖:RNN难以捕捉远距离词之间的关系(如首尾单词的依赖)。顺序计算:无法并行化训练(必须逐步计算t−1步才能处理t步)。
(3)Transformer的改进:
完全基于注意力机制:直接建模任意两个词之间的关系(无论距离);并行化:自注意力层可同时计算所有位置的表示
Transformer遵循这种总体架构,使用堆叠的自注意力层和逐点全连接层来构建编码器和解码器,分别如图1的左半部分和右半部分所示。
3.1 编码器和解码器栈
编码器:
编码器由 N = 6 N=6 N=6 层相同的层堆叠而成。每一层包含两个子层。第一个子层是多头自注意力机制,第二个子层是一个简单的逐位置的全连接前馈网络。我们在每个子层周围都使用了残差连接 [11],并随后进行了层归一化 [1]。也就是说,每个子层的输出是 L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x+Sublayer(x)) LayerNorm(x+Sublayer(x)),其中 S u b l a y e r ( x ) 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 的已知输出位置。
注解:
(1)网络结构的输入是一段文本,其流程是先转换成word_vector,对应的处理模块是Input Embedding。Input Embedding的工作流程,创建一个嵌入矩阵,例如下面的词表大小V=4,即包括了pad、cat、dog和apple这个词,维度为4表示单个词需要由几个数字来描述,例如cat对应[0.1, 0.2, 0.3, 0.4]这个1x4的矩阵。如果输入文本是"cat dog",那么转换的中间ID是[1,2],输出的词向量是[[0.1, 0.2, 0.3, 0.4],[0.5, 0.6, 0.7, 0.8]]
# 嵌入矩阵
W = [[0.0, 0.0, 0.0, 0.0], # <pad>[0.1, 0.2, 0.3, 0.4], # "cat"[0.5, 0.6, 0.7, 0.8], # "dog"[0.9, 1.0, 1.1, 1.2] # "apple"
]# 输出词向量
[[0.1, 0.2, 0.3, 0.4],[0.5, 0.6, 0.7, 0.8]]
(2)词向量会输入到位置编码positional encoding中,transformer使用正弦和余弦函数的固定模式生成位置编码,而不是使用学习的方式动态更新,好处是可以外推到更长的序列,也可以保证相对位置关系可学习,不足之处是无法针对特定任务优化。关于为什么会这么定义,参考【Transformer系列】深入浅出理解Positional Encoding位置编码
P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i / d m o d e l ) PE(pos,2i)=sin(\frac{pos}{10000^{2i/d_{model}}}) PE(pos,2i)=sin(100002i/dmodelpos) P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i / d m o d e l ) PE(pos,2i+1)=cos(\frac{pos}{10000^{2i/d_{model}}}) PE(pos,2i+1)=cos(100002i/dmodelpos)
其中,pos表示词在序列中的位置(0,1,2,…,seq_len-1),i表示向量维度的索引(i=0,…,d_model/2),d_model表示词向量的维度(例如512)
假设PE的输入词向量是[[0.1, 0.2, 0.3, 0.4],[0.5, 0.6, 0.7, 0.8]],PE模块会先生成位置编码矩阵。已知 d m o d e l = 4 d_{model}=4 dmodel=4, i i i 的取值范围为[0, 1],位置编码公式为
P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i / 4 ) PE(pos,2i)=sin(\frac{pos}{10000^{2i/4}}) PE(pos,2i)=sin(100002i/4pos), P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i / 4 ) PE(pos,2i+1)=cos(\frac{pos}{10000^{2i/4}}) PE(pos,2i+1)=cos(100002i/4pos)。对于位置 p o s = 0 ( " c a t " ) pos=0("cat") pos=0("cat"), i = 0 i=0 i=0, P E ( 0 , 0 ) = s i n ( 0 ) = 0 PE(0,0)=sin(0)=0 PE(0,0)=sin(0)=0, P E ( 0 , 1 ) = c o s t ( 0 ) = 1 PE(0,1)=cost(0)=1 PE(0,1)=cost(0)=1; i = 1 i=1 i=1, P E ( 0 , 2 ) = s i n ( 0 1000 0 2 / 4 ) = 0 PE(0,2)=sin(\frac{0}{10000^{2/4}})=0 PE(0,2)=sin(100002/40)=0, P E ( 0 , 3 ) = c o s ( 0 1000 0 2 / 4 ) = 1 PE(0,3)=cos(\frac{0}{10000^{2/4}})=1 PE(0,3)=cos(100002/40)=1,因此有
PE(pos=0) = [0, 1, 0, 1]
同理计算"dog"的PE,有
# 计算时取近似值
PE(pos=1) = [0.84, 0.54, 0.01, 1.00]
因此PE的输出是
PE = [[0, 1, 0, 1],[0.84, 0.54, 0.01, 1.00]
]
3.2 注意力
一个注意力函数可以被描述为将一个查询(query)和一组键值对(key-value pairs)映射到一个输出,其中查询、键、值和输出都是向量。输出是通过对值进行加权求和来计算的,而分配给每个值的权重是由查询与相应键的兼容性函数计算得出的。
3.2.1 缩放点积注意力
我们将这种特定的注意力机制称为“缩放点积注意力”(见图2)。输入包括维度为 d k d_k dk 的查询(queries)和键(keys),以及维度为 d v d_v dv 的值(values)。我们计算查询与所有键的点积,将每个点积结果除以 d k \sqrt{d_k} dk,然后应用softmax函数以获得对值的权重。
在实际应用中,我们同时对一组查询进行注意力函数的计算,这些查询被整合成一个矩阵 Q Q Q。键和值也被分别整合成矩阵 K K K 和 V V 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 多头注意力
我们发现,与其使用单个注意力函数处理维度为 d model d_{\text{model}} dmodel 的键、值和查询,不如将查询、键和值分别通过 h h h 次不同的、学习到的线性投影映射到维度为 d k d_k dk、 d k d_k dk 和 d v d_v dv。然后,我们在这些投影后的查询、键和值的每个版本上并行执行注意力函数,产生维度为 d v d_v dv 的输出值。这些输出值被拼接在一起,并再次进行投影,从而得到最终的值,如图2所示。
多头注意力允许模型在不同位置同时关注来自不同表示子空间的信息。如果只使用单个注意力头,平均操作会抑制这种能力。
其中,投影是由参数矩阵 W i Q ∈ R d model × d k W^Q_i \in \mathbb{R}^{d_{\text{model}} \times d_k} WiQ∈Rdmodel×dk、 W i K ∈ R d model × d k W^K_i \in \mathbb{R}^{d_{\text{model}} \times d_k} WiK∈Rdmodel×dk、 W i V ∈ R d model × d v W^V_i \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 = \frac{d_{\text{model}}}{h} = 64 dk=dv=hdmodel=64。由于每个头的维度降低,总的计算成本与使用完整维度的单头注意力相似。
注解:
(1)缩放点积注意力的计算输入为Q,K,V,这是由前面的positional encoding向量和embedding向量计算而来,具体是 Q = X ∗ W Q Q=X * W^Q Q=X∗WQ, K = X ∗ W K K=X * W^K K=X∗WK, V = X ∗ W V V=X * W^V V=X∗WV,其中X为PE向量和E向量组合得到,W为可学习的矩阵,即图中的linear变换。
(2)文中使用了多头注意力而不是单个注意力,将多个注意力融合到一起,再进行后续处理,期望实现更好的效果。多头注意力是对于同一个输入信息,使用多个 [ W Q , W K , W V ] [W^Q,W^K,W^V] [WQ,WK,WV] 来实现的,通过训练不同的参数矩阵,提取不同的信息
(3)自注意力机制的核心实现是 s o f t m a x ( Q K T d k ) V softmax(\frac{QK^T}{\sqrt{d_k}})V softmax(dkQKT)V,其中 Q K T QK^T QKT 计算所有词对之间的相似度(即注意力分数); d k \sqrt{d_k} dk 为缩放因子,用于避免点积结果过大导致梯度消失;V为数值,前面计算的是注意力权重系数,乘以V并加权求和得到词的新表示
(4) Q K T QK^T QKT 能够表示自注意力分数的核心原因,是基于所使用的positional encoding公式。简单的理解,公式中使用了sin和cos函数,正余弦函数是周期函数,并且可以互相转换,因此前面位置编码的词与后面编码的词之间有相应的位置关系,自注意力机制建立了一个句子(一段文本)前后的联系,详细的解释参考前面的链接
3.2.3 我们模型中注意力的应用
Transformer以三种不同的方式使用多头注意力:
- 在“编码器-解码器注意力”层中,查询(queries)来自前一层解码器,而记忆中的键(keys)和值(values)来自编码器的输出。这使得解码器中的每一个位置都可以关注输入序列中的所有位置。这模仿了序列到序列模型(如[38, 2, 9])中典型的编码器-解码器注意力机制。
- 编码器包含自注意力层。在自注意力层中,所有的键、值和查询都来自同一个地方,在这种情况下,是编码器前一层的输出。编码器中的每一个位置都可以关注编码器前一层的所有位置。
- 类似地,解码器中的自注意力层允许解码器中的每一个位置都可以关注到该位置之前(包括该位置)解码器中的所有位置。我们需要阻止解码器中的左向信息流,以保持自回归特性。我们在缩放点积注意力中通过屏蔽(设置为-∞)softmax输入中所有对应非法连接的值来实现这一点。见图2。
3.3 逐位置的前馈网络
除了注意力子层之外,我们编码器和解码器中的每一层还包含一个全连接的前馈网络,该网络分别且相同地应用于每个位置。它由两个线性变换组成,中间有一个ReLU激活函数。
虽然线性变换在不同位置上是相同的,但每一层之间使用不同的参数。另一种描述方式是将其视为两个卷积核大小为1的卷积操作。输入和输出的维度是 d model = 512 d_{\text{model}} = 512 dmodel=512,而内部层的维度是 d ff = 2048 d_{\text{ff}} = 2048 dff=2048。
3.4 嵌入和Softmax
与其他序列转换模型类似,我们使用学习到的嵌入(embeddings)将输入标记(tokens)和输出标记转换为维度为 d model d_{\text{model}} dmodel 的向量。我们还使用常见的学习线性变换和softmax函数,将解码器的输出转换为预测的下一个标记的概率。在我们的模型中,我们在两个嵌入层和预softmax线性变换之间共享相同的权重矩阵,类似于[30]中的做法。在嵌入层中,我们将这些权重乘以 d model \sqrt{d_{\text{model}}} dmodel。
3.5 位置编码
由于我们的模型不包含循环(recurrence)和卷积,为了让模型能够利用序列中标记的顺序信息,我们需要向模型注入有关序列中标记的相对或绝对位置的信息。为此,我们在编码器和解码器堆叠的底部将“位置编码”添加到底层的输入嵌入中。位置编码的维度 d model d_{\text{model}} dmodel 与嵌入的维度相同,以便能够将二者相加。位置编码有多种选择,可以是学习得到的,也可以是固定的 [9]。
在本工作中,我们使用不同频率的正弦和余弦函数:
其中, pos \text{pos} pos 是位置,而 i i i 是维度。也就是说,位置编码的每一个维度都对应一个正弦波或余弦波。这些波的波长按照几何级数从 2 π 2\pi 2π 增长到 10000 ⋅ 2 π 10000 \cdot 2\pi 10000⋅2π。我们选择这种函数是因为我们假设它能够让模型更容易地通过相对位置来进行注意力分配,因为对于任意固定的偏移量 k k k, PE pos + k \text{PE}_{\text{pos}+k} PEpos+k 可以表示为 PE pos \text{PE}_{\text{pos}} PEpos 的线性函数。
我们也尝试过使用学习得到的位置嵌入 [9] 来代替正弦和余弦函数,发现这两种方法几乎可以产生相同的结果(见表3第(E)行)。我们选择了正弦和余弦版本,因为它可能允许模型对训练时未遇到的更长序列长度进行外推。
4.为什么是自注意力
在本节中,我们将自注意力层的各个方面与通常用于将一个可变长度的符号表示序列 ( x 1 , … , x n ) (x_1, \ldots, x_n) (x1,…,xn) 映射到另一个等长序列 ( z 1 , … , z n ) (z_1, \ldots, z_n) (z1,…,zn) 的循环层和卷积层进行了比较,其中 x i , z i ∈ R d x_i, z_i \in \mathbb{R}^d xi,zi∈Rd,例如典型序列转换编码器或解码器中的隐藏层。为了说明我们使用自注意力的原因,我们考虑了三个期望达到的目标。
第一个是每层的总计算复杂度。第二个是可以并行化的计算量,以所需的最少顺序操作数量来衡量。第三个是网络中长距离依赖之间的路径长度。学习长距离依赖是许多序列转换任务中的一个关键挑战。影响学习这种依赖能力的一个关键因素是前向和反向信号在网络中需要穿越的路径长度。这些路径在输入和输出序列的任意位置组合之间的长度越短,学习长距离依赖就越容易 [12]。因此,我们还比较了由不同类型层组成的网络中任意两个输入和输出位置之间的最大路径长度。
如表1所示,自注意力层通过一个固定的顺序操作数量连接所有位置,而循环层需要 O ( n ) O(n) O(n) 个顺序操作。就计算复杂度而言,当序列长度 n n n 小于表示维度 d d d 时,自注意力层比循环层更快,而这通常是机器翻译中使用的最先进的模型(如词片段 [38] 和字节对 [31] 表示)的句子表示的情况。为了提高涉及非常长序列的任务的计算性能,可以将自注意力限制为仅考虑以相应输出位置为中心的输入序列中的大小为 r r r 的邻域。这将使最大路径长度增加到 O ( n / r ) O(n/r) O(n/r)。我们计划在未来的工作中进一步研究这种方法。
具有小于序列长度 n n n 的卷积核宽度 k k k 的单个卷积层不能连接所有输入和输出位置的配对。要做到这一点,需要在连续卷积核的情况下堆叠 O ( n / k ) O(n/k) O(n/k) 层卷积层,或者在扩张卷积的情况下需要 O ( log k ( n ) ) O(\log_k(n)) O(logk(n)) 层 [18],这增加了网络中任意两个位置之间最长路径的长度。一般来说,卷积层的计算成本比循环层高 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,可分离卷积的复杂度也等于自注意力层和逐点前馈层的组合,这正是我们在模型中采用的方法。
作为额外的好处,自注意力可能会产生更具可解释性的模型。我们在附录中检查了模型的注意力分布,并展示了讨论的例子。不仅每个注意力头明显学会了执行不同的任务,许多注意力头似乎还表现出与句子的句法和语义结构相关的特征。
5.训练
本节描述了我们模型的训练方案。
5.1 训练数据和分批处理
我们使用标准的WMT 2014英德数据集进行训练,该数据集包含大约450万句对。句子通过字节对编码(Byte-Pair Encoding, BPE)[3]进行编码,其共享的源语言和目标语言词汇表包含约37,000个标记。对于英法翻译任务,我们使用规模大得多的WMT 2014英法数据集,该数据集包含3,600万句对,并将标记拆分为一个包含32,000个词块的词汇表[38]。句对按近似的序列长度分批处理。每个训练批次包含一组句对,其中大约包含25,000个源语言标记和25,000个目标语言标记。
5.2 硬件和训练计划
我们在一台配备8块NVIDIA P100 GPU的机器上训练我们的模型。对于使用本文描述的超参数的基础模型,每个训练步骤大约需要0.4秒。我们对基础模型进行了总计10万步(12小时)的训练。对于我们的大型模型(在表3的底部一行有描述),每个步骤的时间是1.0秒。大型模型的训练时长为30万步(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,以及 ϵ = 1 0 − 9 \epsilon = 10^{-9} ϵ=10−9。在训练过程中,我们根据以下公式调整学习率:
这相当于在最初的 warmup_steps 训练步中线性增加学习率,并在此之后按步数的平方根的倒数比例递减学习率。我们使用了 warmup_steps = 4000。
5.4 正则化
在训练过程中,我们使用了三种类型的正则化方法:
残差Dropout
我们在每个子层的输出上应用Dropout [33],在将其加到子层输入并进行归一化之前。此外,我们在编码器和解码器堆叠中嵌入和位置编码的总和上也应用了Dropout。对于基础模型,我们使用了 P drop = 0.1 P_{\text{drop}} = 0.1 Pdrop=0.1 的比率。
标签平滑
在训练过程中,我们使用了值为 ϵ ls = 0.1 \epsilon_{\text{ls}} = 0.1 ϵls=0.1 的标签平滑 [36]。这会降低困惑度,因为模型学会了更加不确定,但提高了准确性和BLEU分数。
6 结果
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分数,超越了所有先前发布的单一模型,训练成本不到之前最佳模型的1/4。用于英法翻译的Transformer(big)模型使用了0.1的dropout率,而不是0.3。
对于基础模型,我们通过平均最后5个检查点来获得单一模型,这些检查点每10分钟记录一次。对于大型模型,我们平均了最后20个检查点。我们在beam search中使用了大小为4的beam和长度惩罚α = 0.6 [38]。这些超参数是在开发集上经过实验后选定的。我们在推理时将最大输出长度设置为输入长度+50,但会在可能的情况下提前终止 [38]。
表2总结了我们的结果,并将我们的翻译质量和训练成本与其他文献中的模型架构进行了比较。我们通过将训练时间、使用的GPU数量以及每块GPU的持续单精度浮点运算能力估计值相乘,来估算训练模型所使用的浮点运算次数。
6.2 模型变体
为了评估Transformer不同组成部分的重要性,我们以不同的方式对基础模型进行了调整,并在开发集(newstest2013)上测量了英德翻译性能的变化。我们使用了上一节中描述的beam search,但没有进行检查点平均。这些结果展示在表3中。
在表3的第(A)行中,我们在保持计算量不变的情况下,调整了注意力头的数量以及注意力键和值的维度,如第3.2.2节所述。单头注意力比最佳设置差0.9 BLEU,但过多的注意力头也会导致质量下降。
在表3的第(B)行中,我们观察到减少注意力键的大小 d k d_k dk 会损害模型质量。这表明确定兼容性并非易事,使用比点积更复杂的兼容性函数可能会有所帮助。在第(C)和(D)行中,我们进一步观察到,正如预期的那样,更大的模型表现更好,而Dropout在避免过拟合方面非常有帮助。在第(E)行中,我们将正弦位置编码替换为学习到的位置嵌入 [9],并观察到与基础模型几乎相同的结果。
6.3 英语成分句法分析
为了评估Transformer是否能够泛化到其他任务,我们在英语成分句法分析任务上进行了实验。该任务存在特定的挑战:输出受到强烈的结构约束,并且比输入长得多。此外,RNN序列到序列模型在小数据集上未能达到最先进的水平 [37]。
我们在宾州树库(Penn Treebank)的华尔街日报(WSJ)部分上训练了一个4层的Transformer模型,其 d model = 1024 d_{\text{model}} = 1024 dmodel=1024,包含大约4万条训练句子。我们还在半监督设置中进行了训练,使用了大约1,700万句的高置信度和伯克利解析器语料库 [37]。对于仅使用WSJ的设置,我们使用了包含16,000个标记的词汇表;对于半监督设置,我们使用了包含32,000个标记的词汇表。
我们在第22节的开发集上仅进行了少量实验,以选择注意力和残差(第5.4节)的Dropout、学习率和beam大小,所有其他参数均保持与英德基础翻译模型一致。在推理过程中,我们将最大输出长度增加到输入长度+300。对于仅WSJ和半监督设置,我们均使用了大小为21的beam和 α = 0.3 \alpha = 0.3 α=0.3。
表4中的结果显示,尽管缺乏针对任务的调整,我们的模型表现却出人意料地好,结果优于所有先前报告的模型,除了循环神经网络语法(Recurrent Neural Network Grammar)[8]。
与RNN序列到序列模型 [37] 相比,即使仅在包含4万句的WSJ训练集上进行训练,Transformer的表现也优于伯克利解析器(BerkeleyParser)[29]。
7.结论
在本工作中,我们介绍了Transformer,这是第一个完全基于注意力的序列转换模型,用多头自注意力取代了编码器-解码器架构中最常用的循环层。
对于翻译任务,Transformer的训练速度明显快于基于循环层或卷积层的架构。在WMT 2014英德翻译任务和WMT 2014英法翻译任务中,我们都达到了新的最佳水平。在英德翻译任务中,我们最好的模型甚至超过了所有先前报告的集成模型。
我们对基于注意力的模型的未来充满期待,并计划将其应用于其他任务。我们计划将Transformer扩展到涉及文本以外输入和输出模态的问题,并研究局部的、受限的注意力机制,以高效处理像图像、音频和视频这样的大型输入和输出。使生成过程不那么依赖序列化也是我们的一个研究目标。
我们用于训练和评估模型的代码可在 https://github.com/tensorflow/tensor2tensor 获取。
致谢:我们感谢Nal Kalchbrenner和Stephan Gouws的有益评论、修正和启发。