目录
摘要
1 引言
2背景
3模型架构
3.1编码器和解码器堆栈编码器:
3.2 Attention
3.2.1 Scaled Dot-Product Attention
3.2.2多头注意力
3.2.3注意力在我们的模型中的应用
3.3位置前馈网络
3.4嵌入和Softmax
3.5位置编码
4为什么自注意力
5 Training 6Result
7 结论
摘要
主要的序列转导模型基于复杂的循环或卷积神经网络,其中包括编码器和解码器。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一种新的简单的网络架构 Transformer,它完全基于注意力机制,完全摒弃了递归和卷积。对两个机器翻译任务的实验表明,这些模型在质量上更优越,同时更可并行化,并且需要的训练时间显着减少。我们的模型在 WMT 2014 英德翻译任务上达到了 28.4 BLEU,比现有的最佳结果(包括集成)提高了 2 BLEU 以上。在 WMT 2014 英法翻译任务中,我们的模型在 8 个 GPU 上训练 3.5 天后建立了 41.8 的新单模型最先进的 BLEU 分数,这是文献中最佳模型的一小部分训练成本。我们表明,Transformer 通过将它成功地应用于具有大量和有限训练数据的英语选区解析,可以很好地推广到其他任务。
1 引言
循环神经网络、长短期记忆 [13] 和门控循环单元 [7] 神经网络,特别是已被牢固确立为序列建模和语言建模和机器翻译等转导问题[35,2,5]。此后,许多努力继续推动循环语言模型和编码器-解码器架构的边界[38,24,15]。
循环模型通常沿输入和输出序列的符号位置分解计算。将位置与计算时间的步骤对齐,它们生成一系列隐藏状态 ht,作为先前隐藏状态 ht-1 和位置 t 的输入的函数。这种固有的顺序性质排除了训练示例中的并行化,这在更长的序列长度下变得至关重要,因为内存限制限制了示例之间的批处理。最近的工作通过分解技巧 [21] 和条件计算 [32] 实现了计算效率的显着改进,同时还提高了后者情况下的模型性能。然而,顺序计算的基本约束仍然存在。注意力机制已成为各种任务中引人注目的序列建模和转导模型的一个组成部分,允许对依赖关系进行建模,而不考虑它们在输入或输出序列中的距离 [2, 19]。然而,除了少数情况 [27],这种注意力机制与循环网络结合使用。在这项工作中,我们提出了 Transformer,这是一种避免递归的模型架构,而是完全依赖于注意力机制来绘制输入和输出之间的全局依赖关系。Transformer 允许更多的并行化,并且可以在 8 个 P100 GPU 上训练多达 12 小时后在翻译质量上达到新的技术水平。
2背景
减少顺序计算的目标也构成了扩展神经 GPU [16]、ByteNet [18] 和 ConvS2S [9] 的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增加,对于 ConvS2S 是线性的,对于 ByteNet 呈对数增长。这使得学习远距离位置之间的依赖关系变得更加困难[12]。在 Transformer 中,这减少到恒定数量的操作,尽管由于平均注意力加权位置而导致有效分辨率降低,但我们使用多头注意力来抵消这种影响,如第 3.2 节所述。自注意力,有时称为内部注意力,是一种注意力机制,将单个序列的不同位置关联起来,以计算序列的表示。自注意力已成功用于各种任务,包括阅读理解、抽象摘要、文本蕴涵和学习任务无关的句子表示 [4, 27, 28, 22]。端到端记忆网络基于循环注意机制而不是序列对齐递归,已被证明在简单的语言问答和语言建模任务中表现良好[34]。然而,据我们所知,Transformer 是第一个完全依赖自注意力来计算输入和输出表示而不使用序列对齐的 RNN 或卷积的转换模型。在以下部分中,我们将描述 Transformer,激发自注意力并讨论其相对于 [17, 18] 和 [9] 等模型的优势。
3模型架构
大多数竞争性神经序列转导模型具有编码器-解码器结构 [5, 2, 35]。在这里,编码器映射符号表示的输入序列 (x1,..., xn) 到一系列连续表示 z = (z1,..., zn)。给定 z,解码器然后生成一个输出序列 (y1,..., ym) 一次一个元素的符号。在每一步,模型都是自回归的 [10],在生成下一个时将先前生成的符号作为附加输入。Transformer 遵循这种整体架构,使用编码器和解码器的堆叠自注意力和逐点全连接层,分别如图 1 的左半和右半所示
3.1编码器和解码器堆栈编码器:
编码器由 N = 6 个相同层的堆栈组成。每一层都有两个子层。第一个是多头自注意力机制,第二个是简单的、位置全连接的前馈网络。我们在两个子层中的每一个周围使用残差连接 [11],然后是层归一化 [1]。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中 Sublayer(x) 是子层本身实现的函数。为了便于这些残差连接,模型中的所有子层以及嵌入层都会产生维度 dmodel = 512 的输出。
解码器:解码器还由 N = 6 个相同层的堆栈组成。除了每个编码器层中的两个子层之外,解码器还插入了第三个子层,它对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围使用残差连接,然后是层归一化。我们还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种mask,再加上输出嵌入被一个位置偏移的事实,确保位置 i 的预测仅取决于位置小于 i 的已知输出
3.2 Attention
An attention 函数可以描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出计算为值的加权和,其中分配给每个值的权重由查询与相应键的兼容性函数计算,
3.2.1 Scaled Dot-Product Attention
为什么使用点积注意力?
为什么缩放1√dk
我们将我们的特定注意力称为“Scaled Dot-Product Attention”(图 2)。输入由维度 dk 的查询Q和键K以及维度 dv 的值V组成。我们计算查询Q与所有键K的点积,将每个键除以 √dk,并应用 softmax 函数来获得值的权重。在实践中,我们同时计算一组查询的注意力函数,打包成一个矩阵 Q。键和值也打包到矩阵 K 和 V 中。我们计算输出矩阵为:
最常用的两个注意力函数是加性注意力 [2] 和点积(乘法)注意力。点积注意力与我们的算法相同,只是比例因子为 1√dk。加性注意使用具有单个隐藏层的前馈网络计算兼容性函数。虽然两者在理论上的复杂性相似,但点积注意力在实践中要快得多,空间效率更高,因为它可以使用高度优化的矩阵乘法代码来实现。虽然对于较小的 dk 值,这两种机制的表现相似,但加性注意力优于点积注意力,而不会缩放较大的 dk 值 [3]。我们猜测对于较大的dk值,点积的幅度较大,将softmax函数推入梯度极小的区域4。为了抵消这种影响,我们将点积缩放1√dk。
3.2.2多头注意力
我们发现将查询、键和值分别线性投影到 dk、dk 和 dv 维,而不是使用 dmodel 维键、值和查询执行单个注意力函数是有益的。在每个查询、键和值的每个投影版本上,然后我们并行执行注意力函数,产生 dv 维输出值。这些被连接起来并再次投影,从而产生最终值,如图 2 所示。
多头注意力允许模型共同关注不同位置的不同表示子空间的信息。使用单个注意力头,平均会抑制这一点。
MultiHead(Q, K, V ) = Concat(head1,..., headh)W O 其中 headi = Attention(QW Q i , KW K i , V W V i ) 其中投影是参数矩阵 W Q i ∈ Rdmodel×dk , W K i ∈ Rdmodel×dk , W V i ∈ Rdmodel×dv 和 W O ∈ Rhdv ×dmodel。在这项工作中,我们使用 h = 8 个并行注意力层或头部。对于每一个,我们使用k = dv = dmodel/h = 64。由于每个头的维数降低,总计算成本与全维数单头注意相似。
3.2.3注意力在我们的模型中的应用
Transformer 以三种不同的方式使用多头注意力:
• 在“编码器-解码器注意力”层中,查询来自前一个解码器层,内存键和值来自编码器的输出。这允许解码器中的每个位置关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意机制,如[38,2,9]。
•编码器包含自注意层。在自注意力层中,所有键、值和查询都来自同一个地方,在这种情况下,编码器中前一层的输出。编码器中的每个位置都可以关注编码器前一层的所有位置。
•类似地,解码器中的自注意力层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要防止解码器中的向左信息流以保留自回归属性。我们通过屏蔽对应于非法连接的 softmax 的输入中的所有值(设置为 -∞)来实现这种缩放点积注意力的内部。参见图 2。
3.3位置前馈网络
除了注意子层外,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别和相同地应用于每个位置。它由两个线性变换组成,中间有一个 ReLU 激活。FFN(x) = max(0, xW1 + b1)W2 + b2 (2) 虽然线性变换在不同的位置是相同的,但它们使用了从层到层的不同参数。另一种描述的方法是核大小为1的两个卷积。输入和输出的维度是dmodel = 512,内层的维度df f = 2048.
3.4嵌入和Softmax
与其他序列转导模型类似,我们使用学习嵌入将输入标记和输出标记转换为维度dmodel的向量。我们还使用通常学习的线性变换和 softmax 函数将解码器输出转换为预测的下一个标记概率。在我们的模型中,我们在两个嵌入层和 pre-softmax 线性变换之间共享相同的权重矩阵,类似于 [30]。在嵌入层中,我们将这些权重乘以 √dmodel。
3.5位置编码
由于我们的模型不包含递归和没有卷积,为了让模型利用序列的顺序,我们必须注入一些关于序列的相对位置或绝对位置的信息序列中的标记。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了“位置编码”。位置编码具有与嵌入相同的维度 dmodel,以便可以求和两者。位置编码、学习和固定有很多选择[9]。在这项工作中,我们使用不同频率的正弦和余弦函数:
其中 pos 是位置,i 是维度。也就是说,位置编码的每个维度对应一个正弦信号。波长形成从2π到10000·2π的几何级数。我们选择这个函数是因为我们假设它将允许模型轻松学习关注相对位置,因为对于任何固定的偏移 k,PEpos+k 可以表示为 P Epos 的线性函数。我们还尝试使用学习的位置嵌入 [9],并发现两个版本产生了几乎相同的结果(见表 3 行 (E))。我们选择正弦版本,因为它可能允许模型外推到比训练期间遇到的序列长度更长的序列长度。
4为什么自注意力
在本节中,我们将自注意力层的各个方面与通常用于映射一个可变长度的符号表示序列(x1,..., xn) 到另一个长度相等的序列 (z1,..., zn),其中 xi, zi ∈ Rd,例如典型序列转导编码器或解码器中的隐藏层。激发我们对自注意力的使用,我们考虑了三个要求。一是每层的总计算复杂度。另一个是可以并行化的计算量,由所需的最小顺序操作数来衡量。第三个是网络中远程依赖关系之间的路径长度。学习远程依赖关系是许多序列转导任务中的关键挑战。影响学习这种依赖关系的能力的一个关键因素是前向和后向信号必须在网络中遍历的路径的长度。输入和输出序列中任何位置组合之间的这些路径越短,就越容易学习长期依赖关系[12]。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。
如表 1 所示,自注意力层将所有位置与固定数量的顺序执行操作连接起来,而循环层需要 O(n) 顺序操作。在计算复杂度方面,当序列长度 n 小于表示维数 d 时,自注意力层比循环层更快,这通常是最先进模型在机器翻译中使用的句子表示的情况,例如词片 [38] 和字节对 [31] 表示。为了提高涉及非常长的序列的任务的计算性能,自注意力可以仅限于仅考虑大小为 r 的邻域
输入序列以各自的输出位置为中心。这将将最大路径长度增加到 O(n/r)。我们计划在未来的工作中进一步研究这种方法。内核大小为 k < n 的单个卷积层不连接所有输入和输出位置对。这样做需要在连续内核的情况下堆叠 O(n/k) 卷积层,或者在扩张卷积的情况下需要 O(logk(n)) [18],增加网络中任意两个位置之间最长路径的长度。卷积层通常比循环层更昂贵,因子为 k。然而,可分离卷积[6]大大降低了复杂度,为O(k·n·d+n·d2)。然而,即使 k = n,可分离卷积的复杂度也等于自注意力层和逐点前馈层的组合,我们在我们的模型中采用的方法。作为附带好处,self-attention 可以产生更多可解释的模型。我们从我们的模型中检查注意力分布,并在附录中展示和讨论示例。单独的注意力头不仅清楚地学习执行不同的任务,似乎表现出与句子的句法和语义结构相关的行为。
5 Training 6Result
表 2:Transformer 在英语到德语和英语到法语 newstest2014 测试上以训练成本的一小部分实现了比以前的最先进模型更好的 BLEU 分数。
7 结论
在这项工作中,我们提出了 Transformer,这是第一个完全基于注意力的序列转导模型,用多头自注意力替换了编码器-解码器架构中最常用的循环层。对于翻译任务,Transformer 可以比基于循环或卷积层的架构快得多。在 WMT 2014 英德和 WMT 2014 英法翻译任务上,我们达到了新的技术水平。在前一个任务中,我们最好的模型甚至优于所有先前报告的集成。我们对基于注意力的模型的未来感到兴奋,并计划将它们应用于其他任务。我们计划将 Transformer 扩展到涉及文本以外的输入和输出模式的问题,并研究局部、受限的注意力机制,以有效地处理图像、音频和视频等大型输入和输出。使生成不那么顺序是我们的另一个研究目标。我们用于训练和评估我们的模型的代码可在 https://github.com/tensorflow/tensor2tensor 获得。
下一篇 将对transformer 的代码进行解析
从代码中看实现过程