Attention is all you need
作者
Jakob:提出将 self-attention 取代RNN
Ashish、Illia:实现了第一个Transformer
Noam:提出了比例点积注意力、多头注意力和无参数位置表示
Niki:设计、实现、调整和评估了我们的原始代码库和 tensor2tensor 中的无数模型变量。
Llion:实验了新的模型变体,负责我们的初始代码库,以及有效的推理和可视化
Lukasz and Aidan:设计 tensor2tensor 的各个部分,取代了我们早期的代码库
摘要
主要的序列转录模型(给一个序列转成另外一个序列)是基于复杂的循环或卷积神经网络,其中包括一个 encoder 和一个 decoder 。性能最好的模型还通过一种注意机制将 encoder 和 decoder 连接起来。我们提出了一种新的简单的网络架构,Transformer(变形金刚),完全基于注意力机制,完全取消循环和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更并行,需要的训练时间明显更少。我们的模型在 WMT 2014 英德翻译任务上实现了28.4BLEU,比现有的最佳结果提高了超过 2BLEU 。在 WMT 2014英法翻译任务中,我们的模型在8个gpu上进行了3.5天的训练,建立了一个新的最先进的单模型BLEU分数41.8,这只是文献中最佳模型训练成本的一小部分。我们成功地将 Transformer 应用于具有大量和有限训练数据的英语选区解析,可以很好地推广到其他任务。
7 结论
在这项工作中,我们提出了 Transformer ,第一个完全基于注意力的序列转录模型,用 multi-headed self-attention 取代了 encoder-decoder 结构中最常用的循环层。对于翻译任务, Transformer 的训练速度可以比基于循环层或卷积层的架构要快得多。我们对基于注意力的模型的未来感到很兴奋,并计划将它们应用到其他任务中。我们计划将 Transformer 扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意力机制,以有效地处理大型输入和输出,如图像、音频和视频。生成更少的序列是我们的另一个研究目标。我们用来训练和评估我们的模型的代码在 https://github.com/tensorflow/tensor2tensor 。
1 引言
循环神经网络,特别是长短期记忆[13]和门控循环[7]神经网络,是序列转录模型最先进的方法,如语言建模和机器翻译[35,2,5]。此后,许多努力继续推动循环语言模型和 encoder-decoder 架构[38,24,15]。循环模型通常是沿着输入和输出序列的符号位置进行计算(一步一步往前做,例如序列是一个句子,需要一个词一个词看)。将这些位置与计算时间中的步骤对齐,它们生成一系列隐藏状态 h t h_t ht(第t个词生成一个隐藏状态序列 h t h_t ht ), h t h_t ht 是由前一个隐藏状态 h t − 1 h_{t−1} ht−1 和当前第t个词本身决定的。缺点是无法并行计算,因为内存限制了示例之间的批处理,历史信息需要一步一步得来。
注意机制主要是怎样使得编码器更有效的传给解码器,与循环网络一起使用。在这项工作中,我们提出了 Transformer ,不再使用循环,而是完全依赖于一个注意力机制。 提出的 Transformer 允许更多的并行化。
2 相关工作
如何用卷积神经网络替换循环神经网络,用来作为基本的构建块。用卷积神经网络对于比较长的序列难以建模,因为卷积只用一个很小的窗口,但是 Transformer 每次能看所有像素,一层就把整个序列看到。参照卷积神经网络的多输出通道, Transformer 引入了一个 multi-headed self-attention (多头注意力机制)
3 模型体系结构
大多数竞争性的神经序列转导模型都有一个编码器-解码器结构的[5,2,35]。
编码器:将一个符号表示的输入序列 ( x 1 , … , x n ) (x_{1}, \ldots, x_{n}) (x1,…,xn) 映射到一个连续表示的序列 Z = ( z 1 , … , z n ) \mathbf{Z}=\left(z_{1}, \ldots, z_{n}\right) Z=(z1,…,zn) 。 x t x_{t} xt 表示第 t 个词, z t z_{t} zt 对应的是 x t x_{t} xt 的一个向量表示。
解码器:生成一个符号的输出序列 ( y 1 , … , y m ) \left(y_{1}, \ldots, y_{m}\right) (y1,…,ym) 。[注意n,m可能不一样] 在每一步中,模型都是自回归的[10],在生成下一个符号时,使用之前生成的符号作为附加的输入。
Transformer 遵循这种整体架构,使用编码器和解码器的堆叠的自注意和全连接层,分别如图1的左半部分和右半部分所示。
3.1 编码器和解码器堆栈
编码器:编码器由N=6个相同的层组成。每个层都有两个子层。第一种是一个多头自注意力机制,第二种是一个简单的、按位置完全连接的前馈网络。两个子层都使用残差连接[11],然后进行层归一化[1]。也就是说,每个子层的输出是 LayerNorm ( x + Sublayer ( x ) ) \operatorname{LayerNorm}(x+\operatorname{Sublayer}(x)) LayerNorm(x+Sublayer(x)) ,其中子层(x)是由子层本身实现的函数。为了方便这些剩余的连接,模型中的所有子层以及嵌入层都会产生 d m o d e l d_{model} dmodel = 512的输出。(固定)
区别: BatchNorm
每一列在一个 mini-batch 里将其均值变为0,方差为1.(把本身的均值减去,除以方差)
LayerNorm
每一行在一个 mini-batch 里将其均值变为0,方差为1.(行表示一个样本)
Transformer 当中输入的是序列:
解码器:解码器也由N=6个相同的层组成。除了每个编码器层中的两个子层外,解码器还插入第三个子层,该子层是带掩码的多头注意力机制。使得在t时间不会看到t时间以后的输入,保证训练和预测的时候行为是一致的。与编码器类似,我们在每个子层都使用残差连接,然后进行层归一化。
3.2 注意力
注意函数可以描述为将 query 和一组 key-value 对映射到输出,其中 query 、key 、value 和 output 都是向量。output 计算 value 的加权和(所以 output 的维度和 value 的维度是一样的),其中分配给每个 value 的权重由 query 与相应 key 的相似度函数计算得来的。
3.2.1 Scaled Dot-Product Attention
query 和 key 有相同的维度 d k d_{k} dk ,value 的维度 d v d_{v} dv,output 的维度也是 d v d_{v} dv ,对 query 和 key 做点积(内积),内积越大,证明余弦相似度越高,内积为0,相当于两个向量正交。再将每个 内积结果除以√dk 。n 个 key-value 可以算出 n 个值,因为 query 会跟每个 key 做内积,算出来之后再放进 softmax ,会得到n个非负且加起来等于1的权重,将这个权重作用到value上,就得到输出。
在实际中,我们同时计算一组 query 上的注意函数,并被打包到一个矩阵 Q 中。key 和 value 也被打包到矩阵 K 和 V 中。我们计算输出的矩阵为:
而对于较小的 d k d_{k} dk 值,这两种机制的表现相似,在 d k d_{k} dk [3]值较大的情况下,附加注意优于点积注意。我们猜测,对于 d k d_{k} dk 的比较大的时候,点积的大小越来越大,将softmax函数推到具有极小梯度的区域。为了抵消这种效应,我们用 √ d k d_{k} dk 来缩放点积。
Mask(opt.)是为了避免在第t时间的时候看到后面的内容。
3.2.2 Multi-Head Attention
query、key、value 进入一个线形层(投影到比较低的维度),再做Scaled Dot-Product Attention,做h次,得到h个输出,把输出向量全部合并在一起,最后做一次线性投影,回到Multi-Head Attention.
在这项工作中,我们使用了h=8平行的注意层,或头部。对于每一个模型,我们都使用dk=dv=dmodel/h=64(输出维度除以h,512/8=64)。由于每个头部的维数降低,其总计算代价与全维的单头注意相似。
3.2.3 Applications of Attention in our Model
Transformer 以三种不同的方式使用多头注意:
- 在 “编码器-解码器注意” 层中,查询来自之前的解码器层,内存密钥和值来自编码器的输出。这允许解码器中的每个位置都参与输入序列中的所有位置。这模拟了[38,2,9]等序列到序列模型中典型的编码-解码器注意机制。
- 该编码器包含自注意层。在自注意层中,所有的键、值和查询都来自同一个位置,在这种情况下,是编码器中上一层的输出。编码器中的每个位置都可以处理编码器上一层中的所有位置。
- 类似地,解码器中的自注意层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要防止解码器中向左的信息流,以保持自回归特性。我们通过屏蔽(设置为−∞)softmax输入中对应于非法连接的所有值来在缩放点积注意内部实现这一点。见图2。
假设句子长度是n,输入其实是一个n个长为d的向量,假设批量大小设为1,复制了三次,即作为key、query、value,所以叫做自注意力机制,其实key、query、value就是同一个东西
3.3 Position-wise Feed-Forward Networks
除了注意子层外,我们的编码器和解码器中的每个层都包含一个全连接的前馈网络(MLP),它分别和相同地应用于每个位置。这由两个线性变换组成,中间有一个ReLU激活。
(把每一个MLP对每一个词作用一次,对每一个词作用的是同样的MLP,即 Position-wise 的意思)
(x是一个长为512的向量,W1将512投影成2048的维度,就是将维度扩大了四倍,W2又将2048投影回512,因此这个公式就是一个单隐藏层的MLP,将其扩大四倍,最后输出又回到输入的大小)
3.4 Embeddings and Softmax
与其他序列转导模型类似,我们使用学习到的 embedding 来将输入标记和输出标记转换为维数d模型的向量。我们还使用通常的学习线性变换和softmax函数来转换解码器输出到预测的下一个词概率。在我们的模型中,我们在两个嵌入层之间共享相同的权重矩阵和最大线性变换,类似于[30]。在嵌入层中,我们将这些权重乘以√dmodel。
输入是一个一个词,需要把他映射成一个向量,embedding就是学习一个长为d的向量来表示它,d在这里可以认为是512。编码器和解码器都需要 embedding,在softmax前面的线性也需要 embedding,
3.5 Positional Encoding
Attention本身是没有时序信息的,输出是value加权和,权重是key和query的相似度,所以Attention是没有时序信息的。因此需要在输入里面加入时序信息,位置i加入到输入里。
4. Why Self-Attention
比较:
5. 实验
5.1 Training Data and Batching
我们在标准的WMT 2014英-德语数据集上进行了训练,该数据集包含约450万对句子对。句子使用字节对编码(bpe)的[3]进行编码,它有大约37000个 token 的共享源数据词汇表(不为英语做一个词典,为德语做一个词典,也就是Embedding是共享权重的)。对于英法词汇,我们使用了明显更大的WMT 2014英法数据集,其中包含3600万个句子,并将标记分解为32000个字片词汇[38]。句子对按近似的序列长度组合在一起。每个训练批包含一组句子对,其中包含大约25000个源标记和25000个目标标记。
5.2 Hardware and Schedule
我们在一台使用8个NVIDIA P100gpu的机器上训练我们的模型。对于我们使用整个论文中描述的超参数的base模型,每个训练步骤(bench)大约需要0.4秒。我们总共训练了基本模型10万步或12个小时。对于我们的大模型(如表3的底线描述),步长时间为1.0秒。这些大型模型接受了30万步(3.5天)的训练。
TPU比较适合做比较大的矩阵乘法。
5.3 Optimizer
我们使用了Adam优化器[20]和β1=0.9,β2=0.98和=10−9。我们在整个训练过程中改变了学习率,计算公式如下:
这对应于第一个warmup_steps训练步骤的学习率线性增加,然后按步数的平方反比成比例降低。我们使用了warmup_steps=4000。
5.4 Regularization
Residual Dropout:我们将dropout[33]应用于每个子层的输出,然后将其添加到子层输入并进行LayerNorm。此外,我们还将dropout应用于编码器和解码器堆栈中的嵌入和位置编码的和。对于基本模型,我们使用 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1 的速率。(使用了大量dropout)
Label Smoothing:在训练过程中,我们采用了值 置信度=0.1 [36]的标签平滑处理。因为模型更不确定,但提高了准确性和BLEU分数。
6. 结果
6.3 Model Variations
不同的超参数之间的对比:
的速率。(使用了大量dropout)
Label Smoothing:在训练过程中,我们采用了值 置信度=0.1 [36]的标签平滑处理。因为模型更不确定,但提高了准确性和BLEU分数。
6. 结果
6.3 Model Variations
不同的超参数之间的对比: