论文笔记
资料
1.代码地址
2.论文地址
https://arxiv.org/abs/1706.03762
3.数据集地址
论文摘要的翻译
主要的序列转导模型是基于复杂的RNN(循环神经网络)或CNN(卷积神经网络),一个编码器和一个解码器。表现最好的模型还通过注意机制连接的编码器和解码器。我们提出了一个新的简单的网络架构,Transformer,完全基于注意力机制,完全摒弃循环和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更具并行性,并且需要更少的训练时间。我们的模型在WMT 2014英语-德语翻译任务上实现了28.4 BLEU,比现有的最佳结果(包括集合)提高了2个BLEU以上。在WMT 2014英法翻译任务中,我们的模型在8个gpu上训练3.5天后,建立了一个新的单模型最先进的BLEU分数41.8,这是文献中最佳模型训练成本的一小部分。我们通过将Transformer成功地应用于具有大量和有限训练数据的英语选区解析,证明了它可以很好地推广到其他任务。
1 背景
1.1 自注意力机制
Self-attention
有时称为内注意,是一种将单个序列的不同位置联系起来的注意机制,以便计算该序列的表示。
1.2 端到端记忆网络
端到端记忆网络基于循环注意机制,而不是顺序排列的递归,
2论文的创新点
- 本文提出了一个新的简单的网络架构,Transformer,完全基于注意力机制,完全摒弃循环和卷积。
- 用多头自注意取代了编码器-解码器架构中最常用的循环层。
3 论文方法的概述
这里,编码器映射符号表示 ( x 1 , ... , x n ) (x_1,...,x_n) (x1,...,xn)的输入序列。, 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)符号,一次一个元素。在每一步中,模型都是自回归的,在生成下一个符号时,将之前生成的符号作为额外的输入。
3.1 编码器和解码器
- Encoder
编码器由 N = 6 N = 6 N=6个相同层的堆栈组成。每一层有两个子层。第一层是多头自注意机制,第二层是简单的、位置完全连接的前馈网络。我们在每一个子层周围使用残差连接,然后进行层归一化。也就是说,每个子层的输出是 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。解码器架构如下图
- Decoder
解码器也由 N = 6 N = 6 N=6层相同的堆栈组成。除了每个编码器层中的两个子层之外,解码器插入第三个子层,该子层对编码器堆栈的输出执行多头注意。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自注意子层,以防止位置关注后续位置。这种掩蔽,再加上输出嵌入被偏移一个位置的事实,确保了位置i的预测只能依赖于位置小于i的已知输出。解码器结构如下图
3.2注意力机制
注意力机制实现可以描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出是作为值的加权和计算的,其中分配给每个值的权重是由查询与相应键的兼容性函数计算的。
3.2.1 Scaled Dot-Product Attention
我们称我们的特殊注意力机制为"Scaled Dot-Product Attention"(图2)。输入 d k d_k dk的查询和键以及维度 d v d_v dv的值组成。我们计算查询与所有键的点积,每个点积除以 d k \sqrt{d_k} dk 并应用softmax函数来获得值的权重。
在实践中,我们同时计算一组查询的注意力函数,它们被打包成一个矩阵 Q Q Q。键和值也打包到矩阵 K K K和 V V V中。我们计算输出矩阵为: A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V \mathrm{Attention}(Q,K,V)=\mathrm{softmax}(\frac{QK^{T}}{\sqrt{d_{k}}})V Attention(Q,K,V)=softmax(dk QKT)V
两种最常用的注意实现是加性注意力和点积注意力。点积注意力和我们的算法是一样的,除了比例因子是 1 d k \frac{1}{\sqrt{dk}} dk 1。加性注意使用一个具有单个隐藏层的前馈网络来计算兼容性函数。虽然两者在理论复杂性上相似,但在实践中,点积注意力更快,更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
当 d k d_k dk值较小时,两种机制的表现相似,当 d k d_k dk值较大时,加性注意力优于点积注意力。我们怀疑,对于较大的 d k d_k dk值,点积注意力的大小会变大,从而将softmax函数推入具有极小梯度的区域。为了抵消这个影响,我们将点积乘以 1 d k \frac{1}{\sqrt{dk}} dk 1。
3.2.2 Multi-Head Attention
我们发现,与其使用 d m o d e l d_{model} dmodel维度的键、值和查询执行单一的注意力函数,不如将查询、键和值分别以不同的、学习过的线性投影 h h h次线性投影到 d k 、 d k 和 d v d_k、d_k和d_v dk、dk和dv维度,这是有益的。然后,在查询、键和值的每个投影版本上,我们并行地执行注意力函数,生成d维输出值。将它们连接起来并再次进行投影,得到最终值,如下图所示右侧所示
多头注意允许模型在不同位置共同注意来自不同表示子空间的信息。对于单一注意力头,平均会抑制这一点。 M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) \mathrm{MultiHead}(Q,K,V)=\mathrm{Concat}(\mathrm{head}{1},...,\mathrm{head}{\mathrm{h}})W^{O}\\\mathrm{where~head_{i}}=\mathrm{Attention}(QW_{i}^{Q},KW_{i}^{K},VW_{i}^{V}) MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhere headi=Attention(QWiQ,KWiK,VWiV)
Where the projections are parameter matrices 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 q V ∈ R d m o d e l × d n W_i^Q\in \mathbb{R} ^{d_{\mathrm{model}}\times d_k}, W_i^K\in \mathbb{R} ^{d_{\mathrm{model}}\times d_k}, W_q^V\in \mathbb{R} ^{d_{\mathrm{model}}\times d_n} WiQ∈Rdmodel×dk,WiK∈Rdmodel×dk,WqV∈Rdmodel×dn and W O ∈ R h d v × d m o d s l . W^O\in \mathbb{R} ^{hd_v\times d_{\mathrm{modsl}}}. WO∈Rhdv×dmodsl.and W O ∈ R h d 39 × d m o d e l . W^O\in\mathbb{R}^{hd_{39}\times d_{\mathrm{model}}}. WO∈Rhd39×dmodel.
In this work we employ h = 8 h=8 h=8 parallel attention layers, or heads. For each of these we use d k = d v = d m o d e l / h = 64. d_k=d_v=d_{\mathrm{model}}/h=64. dk=dv=dmodel/h=64. 由于每个头部的维数降低,因此总计算成本与全维的单头部关注相似。
3.2.3 Applications of Attention in our Mode
Transformer以三种不同的方式使用多头注意力:
- 在编码器-解码器注意力层中,查询来自前一个解码器层,而记忆键和值来自编码器的输出。这允许解码器中的每个位置都参与输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意机制。
- 编码器包含自注意力子层,自注意力子层中,所有的键、值和查询都来自同一个地方,在这种情况下,是编码器中前一层的输出。编码器中的每个位置都可以处理编码器前一层中的所有位置。
- 解码器中的自注意层允许解码器中的每个位置注意到解码器中的所有位置直至并包括该位置。我们需要防止解码器中的向左信息流以保持自回归特性。我们通过屏蔽(设置为 − ∞ -∞ −∞)softmax输入中对应于非法连接的所有值来实现缩放点积注意力。
3.3 位置前馈网络
除了注意子层之外,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别相同地应用于每个位置。这包括两个线性转换,中间有一个ReLU激活。 F F N ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \mathrm{FFN}(x)=\max(0,xW_{1}+b_{1})W_{2}+b_{2} FFN(x)=max(0,xW1+b1)W2+b2虽然线性变换在不同位置上是相同的,但它们在每一层之间使用不同的参数。另一种描述它的方式是两个核大小为1的卷积
输入和输出的维数为 d m o d e l = 512 d_{model} = 512 dmodel=512,内层的维数 d f = 2048 d_f = 2048 df=2048。
3.4 Embeddings and Softmax
与其他序列转导模型类似,我们使用学习嵌入将输入令牌和输出令牌转换为维度dmodel的向量。我们还使用通常学习的线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层和pre-softmax线性变换之间共享相同的权矩阵,在嵌入层中,我们将这些权重乘以 d m o d e l \sqrt {d_{model} } dmodel
3.5 位置编码
由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了"位置编码"。位置编码与嵌入具有相同的维数模型,因此可以对两者进行求和。位置编码有多种选择,有学习得到的的和固定的。在这项工作中,我们使用了不同频率的正弦和余弦函数: P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) \begin{gathered} PE_{(pos,2i)} =sin(pos/10000^{2i/d_\mathrm{model}}) \\ PE_{(pos,2i+1)} =cos(pos/10000^{2i/d_{\mathrm{model}}}) \end{gathered} PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)其中 p o s pos pos是位置, i i i是尺寸。也就是说,位置编码的每一个维度对应于一个正弦波。波长形成从 2 π 2π 2π到 10000 ⋅ 2 π 10000·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的线性函数。
我们选择正弦版本是因为它可以允许模型外推到比训练期间遇到的序列长度更长的序列
为什么要自注意力机制
在本节中,我们将自注意层的各个方面与通常用于映射一个可变长度符号表示序列 ( x 1 , ... ) (x_1,...) (x1,...)的循环层和卷积层进行比较。 ( x 1 , . . . , x n ) (x_1,... ,x_n) (x1,...,xn)到另一个等长序列 ( z 1 , ... , z n ) (z_1,..., z_n) (z1,...,zn),其中 x i x_i xi, z i ∈ R d z_i∈R_d zi∈Rd,如典型序列转导编码器或解码器中的隐藏层。为了激励我们使用自我关注,我们考虑了三个必要条件。
一个是每层的总计算复杂度。另一个是可以并行化的计算量,通过所需的最小顺序操作数来衡量。
第三个是网络中远程依赖关系之间的路径长度。学习远程依赖关系是许多序列转导任务中的关键挑战。影响学习这种依赖关系能力的一个关键因素是网络中向前和向后信号必须经过的路径长度。输入和输出序列中任意位置组合之间的路径越短,学习远程依赖关系就越容易。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。
如表1所示,自关注层用恒定数量的顺序执行操作连接所有位置,而循环层需要 O ( n ) O(n) O(n)个顺序操作。
在计算复杂度方面,当序列6长度 n n n小于表示维数 d d d时,自注意层比循环层更快,
一个核宽度为 k < n k < n k<n的卷积层不能连接所有的输入和输出位置对。在相邻核的情况下,这样做需要 O ( n / k ) O({n}/{k}) O(n/k)个卷积层的堆栈,在扩展卷积的情况下需要 O ( l o g k ( n ) ) O(logk(n)) O(logk(n))个卷积层的堆栈,从而增加网络中任意两个位置之间最长路径的长度。卷积层通常比循环层的成本高k倍。然而,可分离卷积大大降低了复杂性,为 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) O(k·n·d + n·d^2) O(k⋅n⋅d+n⋅d2)。然而,即使 k = n k = n k=n,可分离卷积的复杂性也等于自注意层和点前馈层的组合,这是我们在模型中采用的方法。
作为附带好处,自我关注可以产生更多可解释的模型。我们从我们的模型中检查注意力分布,并在附录中给出和讨论示例。不仅个体注意力头清楚地学会执行不同的任务,许多注意力头似乎表现出与句子的句法和语义结构相关的行为。
4 论文实验
4.1 数据集
标准的WMT 2014英语-德语数据集上进行训练,该数据集由大约450万句对组成。句子使用字节对编码进行编码,该编码具有大约37000个标记的共享源-目标词汇表。对于英语-法语,我们使用了更大的WMT 2014英语-法语数据集,该数据集包含3600万个句子,并将标记分割成32000个单词-词汇表[38]。句子对按近似序列长度进行批处理。每个训练批包含一组句子对,其中包含大约25000个源标记和25000个目标标记。
4.2 Hardware and Schedule
我们在一台带有8个NVIDIA P100 gpu的机器上训练我们的模型。对于使用本文中描述的超参数的基本模型,每个训练步骤大约需要0.4秒。我们对基本模型进行了总共10万步或12小时的训练。对于我们的大型模型(如表3所示),步长为1.0秒。大模型训练了30万步(3.5天)。
5.3 优化器
我们使用Adam优化器, β 1 = 0.9 , β 2 = 0.98 , λ = 1 0 − 9 β_1 = 0.9, β_2 = 0.98, λ = 10^{−9} β1=0.9,β2=0.98,λ=10−9。我们根据公式在训练过程中改变学习率: l r a t e = d m o d e l − 0.5 ⋅ min ( s t e p n u m − 0.5 , s t e p n u m ⋅ w a r m u p s t e p s − 1.5 ) lrate=d_{\mathrm{model}}^{-0.5}\cdot\min(step_num^{-0.5},step_num\cdot warmup_steps^{-1.5}) lrate=dmodel−0.5⋅min(stepnum−0.5,stepnum⋅warmupsteps−1.5)这对应于在第一个 w a r m u p s t e p s warmup_steps warmupsteps训练步骤中线性增加学习率,然后按步数的倒数平方根成比例地降低学习率。我们使用了 w a r m u p s t e p s = 4000 warmup_steps = 4000 warmupsteps=4000。
5.4 正则化
我们在训练中使用三种类型的正则化:
- Residual Dropout
我们将dropout应用于每个子层的输出,然后将其添加到子层输入并归一化。此外,我们将dropout应用于编码器和解码器堆栈中的嵌入和位置编码之和。对于基本模型,我们使用 P d r o p P_{drop} Pdrop = 0.1的速率。 - Label Smoothing
在训练时,我们使用值 ϵ l s = 0.1 ϵ_{ls} = 0.1 ϵls=0.1的标签平滑[36]。这损害了困惑,因为模型学会了更不确定,但提高了准确性和BLEU分数
6 总结
在这项工作中,我们提出了Transformer,这是第一个完全基于注意的序列转导模型,用多头自注意取代了编码器-解码器架构中最常用的循环层
Transformer可以扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意力机制,以有效地处理大量的输入和输出,如图像、音频和视频。减少世代的顺序是我们的另一个研究目标。