【论文阅读】Attention Is All You Need

Attention Is All You Need

  • 论文连接:
  • 摘要
  • [1. 介绍](#1. 介绍)
  • [2. 背景](#2. 背景)
  • [3. 模型结构](#3. 模型结构)
    • [3.1 编码器与解码器堆叠](#3.1 编码器与解码器堆叠)
    • [3.2 Attention](#3.2 Attention)
      • [3.2.1 缩放点积注意力](#3.2.1 缩放点积注意力)
      • [3.2.2 多头注意力机制](#3.2.2 多头注意力机制)
      • [3.2.3 注意力机制在本文模型中的应用](#3.2.3 注意力机制在本文模型中的应用)
    • [3.3 按位置前馈网络](#3.3 按位置前馈网络)
    • [3.4 Embeddings and Softmax](#3.4 Embeddings and Softmax)
    • [3.5 Positional Encoding](#3.5 Positional Encoding)
  • [4. Why Self-Attention](#4. Why Self-Attention)
  • [5. 训练](#5. 训练)
    • [5.1 Training Data and Batching](#5.1 Training Data and Batching)
    • [5.2 Hardware and Schedule](#5.2 Hardware and Schedule)
    • [5.3 Optimizer](#5.3 Optimizer)
    • [5.4 Regularization](#5.4 Regularization)
  • [6. Result](#6. Result)
    • [6.1 Machine Translation](#6.1 Machine Translation)
    • [6.2 Model Variations](#6.2 Model Variations)
    • [6.3 English Constituency Parsing 英文句法成分分析](#6.3 English Constituency Parsing 英文句法成分分析)
  • [7. 结论](#7. 结论)
  • [Attention Visualizations](#Attention Visualizations)

论文连接:

《Attention Is All You Need》

摘要

主流的序列转换模型均基于复杂的循环神经网络或卷积神经网络,这类网络都包含编码器和解码器结构。表现最优的模型还会通过注意力机制将编码器与解码器连接起来。我们提出一种新颖且简洁的网络架构 ------Transformer,它完全基于注意力机制,彻底摒弃了循环结构与卷积操作。在两项机器翻译任务上的实验表明,该模型在翻译质量上表现更优,同时具备更强的并行性,且训练耗时大幅缩短。在 WMT 2014 英语→德语翻译任务中,我们的模型达到 28.4 BLEU,相比包括集成模型在内的现有最佳结果,提升超过 2 BLEU。在 WMT 2014 英德翻译任务中,我们的模型取得了41.8 的 BLEU 分值,创下了新的单模型最优水平。该模型在 8 块 GPU 上训练了 3.5 天,其训练成本仅为文献中最优模型的一小部分。我们通过将 Transformer 成功应用于英语句法成分分析任务(无论使用大规模还是有限的训练数据),证明了该模型具有良好的泛化能力。

1. 介绍

循环神经网络,尤其是长短期记忆网络和门控循环神经网络,已成为序列建模与序列转换任务中的主流最优方法,这类任务包括语言建模、机器翻译等。此后,研究人员还开展了大量工作,持续突破循环语言模型与编解码架构的性能边界。

循环模型通常会沿着输入和输出序列的符号位置分步计算。它们将位置与计算时间步对齐,依据前一个隐藏状态 (h_{t-1}) 和第 (t) 个位置的输入,生成一系列隐藏状态 (h_t)。这种固有的串行特性使得训练样本内部无法并行计算,这一点在序列更长时变得至关重要,因为内存限制会制约样本间的批处理能力。近期的研究通过因式分解技巧 [21] 和条件计算 [32] 显著提升了计算效率,其中后者还同时提升了模型性能。然而,串行计算这一根本限制依然存在。

注意力机制已成为各类任务中性能优异的序列建模与序列转换模型的重要组成部分,它能够对依赖关系进行建模,而无需考虑其在输入序列或输出序列中的距离[2, 19]。然而,除少数情况外[27],这类注意力机制均与循环网络结合使用。

在本文中,我们提出 Transformer 模型架构。该架构摒弃了循环结构,完全依靠注意力机制来建立输入与输出之间的全局依赖关系。Transformer 能够实现显著更高的并行化程度,并且仅需在 8 块 P100 GPU 上训练 12 小时,便可在翻译质量上达到全新的最优水平。

2. 背景

减少序列计算这一目标同样也是扩展神经GPU(Extended Neural GPU)[16]、ByteNet [18] 和 ConvS2S [9] 等工作的出发点。这些模型均以卷积神经网络为基本构建单元,对所有输入和输出位置并行计算隐式表示。在这类模型中,关联任意两个输入或输出位置信号所需的运算量会随位置间距离的增加而增长:对 ConvS2S 是线性增长,对 ByteNet 是对数增长。这使得学习远距离位置之间的依赖关系变得更加困难 [12]。而在 Transformer 中,这类运算量被缩减为 常数级 ,尽管代价是因对注意力加权位置取平均而降低了有效分辨率,我们会通过 3.2 节所述的 多头注意力(Multi-Head Attention) 机制来抵消这一影响。

自注意力(Self‑attention),有时也称为内部注意力(intra‑attention),是一种将单个序列的不同位置关联起来,从而计算序列表示的注意力机制。自注意力已被成功应用于多种任务,包括阅读理解、生成式摘要、文本蕴含以及学习与任务无关的句子表示 [4, 27, 28, 22]。

端到端记忆网络基于循环注意力机制,而非序列对齐的循环结构,并且已被证明在简单语言问答和语言建模任务上表现良好 [34]。

然而据我们所知,Transformer 是第一个完全依靠自注意力来计算输入与输出表示、且不使用序列对齐的循环神经网络(RNN)或卷积的序列转换模型。在接下来的章节中,我们将描述 Transformer、阐述自注意力的设计思路,并讨论它相较于 [17, 18] 和 [9] 等模型的优势。

3. 模型结构

大多数具有竞争力的神经序列转换模型都采用编码器--解码器结构 [5, 2, 35]。在这里,编码器将由符号表示组成的输入序列 ( x 1 , ... , x n ) (x_1, \dots, x_n) (x1,...,xn) 映射为一组连续表示序列 z = ( z 1 , ... , z n ) \mathbf{z} = (z_1, \dots, z_n) z=(z1,...,zn)。解码器在得到 z \mathbf{z} z 之后,逐一生成由符号组成的输出序列 ( y 1 , ... , y m ) (y_1, \dots, y_m) (y1,...,ym)。该模型在每一步都是自回归的[10]:在生成下一个符号时,会将之前已经生成的符号作为额外输入加以利用。

图1:Transformer模型架构

Transformer 沿用了这一整体架构,在编码器和解码器中均使用堆叠的自注意力层与逐点全连接层,分别如图 1 的左半部分和右半部分所示。

3.1 编码器与解码器堆叠

编码器:编码器由 N=6 层完全相同的网络堆叠而成。每层包含两个子层。第一个是多头自注意力机制 ,第二个是简单的逐点全连接前馈网络 。我们在两个子层周围均使用残差连接 [11],随后进行层归一化 [1]。也就是说,每个子层的输出为:LayerNorm(x + Sublayer(x)) 其中 Sublayer(x) 是子层本身实现的函数。为了便于这些残差连接,模型中所有子层以及嵌入层的输出维度均为 d_model = 512

解码器:解码器同样由 N=6 层完全相同的网络堆叠而成。除了编码器每层中的两个子层外,解码器还插入了第三个子层,该子层对编码器堆叠的输出执行多头注意力 计算。与编码器类似,我们在每个子层周围都使用残差连接,随后进行层归一化。我们还对解码器堆叠中的自注意力子层做了修改,以防止当前位置关注到后续位置。这种掩码机制 ,加上输出嵌入整体偏移一个位置的处理,确保了对第 i 个位置的预测只能依赖于 i 之前位置的已知输出

3.2 Attention

注意力函数可被描述为将一个查询向量和一组键 - 值向量对映射为一个输出向量的过程,其中查询、键、值和输出均为向量。该输出通过对各个值向量进行加权求和得到,而分配给每个值向量的权重,由查询向量与对应键向量的兼容性函数计算得出。

图2:(左)缩放点积注意力。(右)多头注意力由多个并行运行的注意力层组成。

3.2.1 缩放点积注意力

我们将我们所使用的这种注意力机制称为缩放点积注意力 (图2)。其输入由维度为 d k d_k dk 的查询和键,以及维度为 d v d_v dv 的值组成。我们计算查询与所有键的点积,将每个点积除以 d k \sqrt{d_k} dk ,然后应用 softmax 函数以得到作用在值上的权重。

在实际应用中,我们会将一组查询打包成矩阵 (Q),同时计算注意力函数。键和值也分别打包成矩阵 (K) 和 (V)。输出矩阵的计算公式如下:

Attention ( Q , K , V ) = softmax ( Q K T d k ) V (1) \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V \tag{1} Attention(Q,K,V)=softmax(dk QKT)V(1)

最常用的两种注意力函数是加性注意力 [2]和点积(乘性)注意力 。除了缺少 1 d k \displaystyle\frac{1}{\sqrt{d_k}} dk 1 这个缩放因子之外,点积注意力与我们的算法完全相同。加性注意力通过带有单个隐藏层的前馈网络来计算兼容性函数。尽管两者在理论复杂度上相近,但点积注意力在实际应用中更快、更节省空间,因为它可以借助高度优化的矩阵乘法代码来实现。

当 d k d_k dk 取值较小时,两种机制表现相近;但当 d k d_k dk 较大时,加性注意力 的效果要优于未做缩放的点积注意力 [3]。我们推测,当 d k d_k dk 很大时,点积结果的绝对值会变得非常大,从而将 softmax 函数推向梯度极小的区域。为抵消这种影响,我们用 1 d k \displaystyle\frac{1}{\sqrt{d_k}} dk 1 对点积结果进行缩放。

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所示。

多头注意力使得模型能够在不同位置 上,联合关注 来自不同表示子空间的信息。如果只使用单头注意力,平均化操作会抑制这一能力。

MultiHead ( Q , K , V ) = Concat ( head 1 , ... , head h ) W O w h e r e \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O where MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhere
head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(Q W_i^Q, K W_i^K, V W_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 个并行的注意力层(即注意力头)。对于每个头,我们采用 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 以三种不同的方式使用多头注意力:

  • 编码器‑解码器注意力 层中,查询(queries)来自前一个解码器层,而记忆单元的键(keys)和值(values)来自编码器的输出。

    这使得解码器中的每个位置都可以关注到输入序列中的所有位置。这种机制模仿了典型序列到序列模型(如[38, 2, 9])中编码器‑解码器注意力的工作方式。

  • 编码器包含自注意力层。在自注意力层中,所有的键(keys)、值(values)和查询(queries)都来自同一处,即编码器中上一层的输出。编码器中的每个位置都可以关注到编码器上一层中的所有位置。

  • 同样,解码器中的自注意力层允许解码器中的每个位置都能关注到解码器中直到该位置(含该位置)的所有位置。我们需要在解码器中阻止向左的信息流动 ,以保持自回归特性。我们在缩放点积注意力内部实现这一点:将 softmax 输入中所有对应非法连接的位置进行掩码遮蔽(设为 −∞)。如图 2 所示。

3.3 按位置前馈网络

除了注意力子层之外,编码器和解码器中的每一层都包含一个全连接前馈网络 ,该网络独立且相同地作用于每个位置。它由两个线性变换组成,中间带有 ReLU 激活函数。

FFN ( x ) = max ⁡ ( 0 , x W 1 + b 1 ) W 2 + b 2 (2) \text{FFN}(x) = \max(0, x W_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 Embeddings and Softmax

与其他序列转换模型类似,我们使用可学习的嵌入向量 ,将输入标记和输出标记转换为维度为 d model d_{\text{model}} dmodel 的向量。我们同样使用标准的可学习线性变换与 softmax 函数,将解码器输出转换为预测下一个标记的概率分布。在我们的模型中,两个嵌入层与 softmax 前的线性变换共享同一套权重矩阵 ,做法与文献 [30] 相似。在嵌入层中,我们会将这些权重乘以 d model \sqrt{d_{\text{model}}} dmodel 。

表 1:不同层类型的最大路径长度、每层复杂度以及最小串行操作数。其中 n 为序列长度,d 为表示维度,k 为卷积核大小,r 为受限自注意力中的邻域大小。

3.5 Positional Encoding

由于我们的模型既不含循环结构,也不含卷积 ,为了让模型能够利用序列的顺序信息,我们必须向序列中注入关于标记相对位置或绝对位置 的信息。为此,我们在编码器和解码器堆栈的底部,将位置编码(positional encodings)添加到输入嵌入中。位置编码与嵌入具有相同的维度 d model d_{\text{model}} dmodel,因此两者可以直接相加。位置编码有多种选择,包括可学习的位置编码固定的位置编码[9]。

在本文中,我们使用不同频率的正弦和余弦函数来构造位置编码:

P E ( p o s , 2 i ) = sin ⁡ ( p o s / 10000 2 i / d model ) PE_{(pos,2i)} = \sin\left(pos / 10000^{2i/d_{\text{model}}}\right) PE(pos,2i)=sin(pos/100002i/dmodel)
P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s / 10000 2 i / d model ) PE_{(pos,2i+1)} = \cos\left(pos / 10000^{2i/d_{\text{model}}}\right) PE(pos,2i+1)=cos(pos/100002i/dmodel)

其中 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 的线性函数。

我们还尝试使用可学习的位置嵌入 [9] 进行替代实验,发现两种方式得到的结果几乎完全一致(见表 3 第 E 行)。我们最终选择正弦位置编码,是因为它能够让模型外推到比训练时更长的序列长度

4. Why Self-Attention

本节中,我们将自注意力层的多个方面,与常用于序列映射的循环层(recurrent layers)和卷积层(convolutional layers) 进行对比------这类层的核心功能是将一个变长符号表示序列 ( x 1 , ... , x n ) (x_1, \dots, x_n) (x1,...,xn) 映射为另一个等长序列 ( z 1 , ... , z n ) (z_1, \dots, z_n) (z1,...,zn)(其中 x i , z i ∈ R d x_i, z_i \in \mathbb{R}^d xi,zi∈Rd),例如典型序列转换模型(sequence transduction)的编码器或解码器中的隐藏层。我们提出三个核心需求(desiderata),以此作为采用自注意力机制的设计动机。

第一个(需求)是每层的总计算复杂度 ;第二个(需求)是可并行计算的规模 ------这一指标通过完成计算所需的最小串行操作数来衡量。

第三个(需求)是网络中长程依赖之间的路径长度 。学习长程依赖是许多序列转换任务中的核心挑战。影响模型学习这类依赖能力的一个关键因素,是前向与反向信号在网络中必须传递的路径长度。输入与输出序列中任意位置组合之间的路径越短,就越容易学习长程依赖 [12]。因此,我们还对比了由不同层类型构成的网络中,任意两个输入与输出位置之间的最大路径长度

如表 1 所示,自注意力层通过恒定数量的串行操作 即可连接所有位置,而循环层则需要 O(n) 量级的串行操作(n 为序列长度)。在计算复杂度方面:当序列长度 n 小于表示维度 d 时,自注意力层的速度优于循环层------这是机器翻译领域最先进模型(state-of-the-art models)中句子表示的常见情况,例如词片(word-piece [38])和字节对(byte-pair [31])表示方案。为提升超长序列任务 的计算性能,可对自注意力进行限制:仅考虑输入序列中以对应输出位置为中心、大小为 r r r 的邻域(即受限自注意力)。这种做法会将最大路径长度增加至 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 倍。而可分离卷积 [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,可分离卷积的复杂度也恰好等于自注意力层 + 逐点前馈层的总和------这正是我们模型采用的结构。

作为一个附加优势,自注意力还能让模型更具可解释性 。我们检查了模型中的注意力分布,并在附录中展示和讨论了相关示例。不仅单个注意力头(attention heads)能清晰地学习执行不同的任务,其中许多注意力头还表现出与句子句法结构和语义结构相关的行为。

5. 训练

本节将介绍我们模型的训练方案(training regime)

5.1 Training Data and Batching

我们在标准的 WMT 2014 英德数据集上进行训练,该数据集包含约 450 万句对 。句子使用字节对编码(BPE) [3] 进行编码,源语言与目标语言共享约 37000 个 token 的词汇表。对于英法翻译任务,我们使用规模更大的 WMT 2014 英法数据集,包含 3600 万句对 ,并将 token 划分为包含 32000 个词片(word-piece)的词汇表[38]。句对按照近似序列长度 进行分批。每个训练批次包含约 25000 个源 token25000 个目标 token

5.2 Hardware and Schedule

我们在单台配备 8 块 NVIDIA P100 GPU 的机器上训练模型。

  • 对于本文中描述的、使用标准超参数的基础模型(base models)

    • 每步训练耗时约 0.4 秒
    • 总训练步数:100,000 步(约 12 小时)
  • 对于大型模型(big models)(见表 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, ϵ = 10 − 9 \epsilon = 10^{-9} ϵ=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_{model}^{-0.5} \cdot \min( step\_num^{-0.5},\ step\_num \cdot warmup\_steps^{-1.5} ) lrate=dmodel−0.5⋅min(step_num−0.5, step_num⋅warmup_steps−1.5)

该策略表示:

  • 在前 warmup_steps 步,学习率线性增长
  • 之后,学习率与步数的平方根倒数成比例下降。

本文使用 warmup_steps = 4000

5.4 Regularization

我们在训练过程中使用了三种正则化方法:

表 2:Transformer 在英→德、英→法 newstest2014 测试集上取得了比以往最优模型更高的 BLEU 分数,且训练代价仅为原先的一小部分。

Residual Dropout 我们在每个子层的输出上应用 Dropout [33],然后再将其与子层输入相加并进行归一化。此外,在编码器和解码器堆栈中,我们还对词嵌入 + 位置编码 的和施加 Dropout。对于基础模型,我们使用的丢弃率为 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1

标签平滑(Label Smoothing) 训练期间,我们使用值为 ϵ l s = 0.1 \epsilon_{ls}=0.1 ϵls=0.1 的标签平滑 [36]。这会降低困惑度(perplexity)表现,因为模型会学得更"不确定",但能提升准确率BLEU 分数

6. Result

6.1 Machine Translation

在 WMT 2014 英德翻译任务上,大模型 Transformer(big)(表2中)比此前最优的模型(包括集成模型)高出 2.0 个 BLEU 以上,创下了 28.4 的最新最优 BLEU 分数。该模型的配置在表3最后一行。训练在 8 块 P100 GPU 上花费 3.5 天。即使是我们的基础模型 ,也超过了所有此前已发表的单模型与集成模型,而训练代价仅为其他有竞争力模型的很小一部分

在 WMT 2014 英→法翻译任务上,我们的大型模型达到了 41.0 的 BLEU 分数 ,超过了所有此前已发表的单一模型,且训练代价不到之前最优模型的 1/4 。用于英→法任务的 Transformer (big) 使用的 dropout 率为 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1,而不是 0.3。

对于基础模型,我们取最后 5 个检查点的平均值 作为最终模型,检查点每 10 分钟保存一次。对于大型模型,我们对最后 20 个检查点 取平均。我们使用集束搜索(beam search) ,集束大小 beam size = 4,长度惩罚系数 α = 0.6 \alpha = 0.6 α=0.6 [38]。这些超参数都是在验证集上通过实验确定的。推理时,我们将最大输出长度设为 输入长度 + 50,并在可能时提前终止 [38]。

表 2 总结了我们的实验结果,并将翻译质量与训练代价和文献中其他模型结构进行了对比。我们通过以下三者的乘积来估算训练模型所使用的浮点运算量

  • 训练时间
  • 使用的 GPU 数量
  • 每块 GPU 的持续单精度浮点运算能力估计值

6.2 Model Variations

为了评估 Transformer 不同组件的重要性,我们对基础模型进行了多种改动,并在英德翻译的验证集 newstest2013 上测量性能变化。我们使用了上一节所述的集束搜索,但未使用检查点平均。这些结果展示在表 3 中。

表3:Transformer 结构的变体实验。未列出的超参数均与基础模型相同。所有指标均基于英德翻译验证集 newstest2013。表中困惑度是按字节对编码(BPE)的每个词片(word-piece)计算的,不可与按单词计算的困惑度直接比较

在表 3 的 (A) 行中,我们改变注意力头的数量以及注意力 K、V 的维度 ,同时保持计算量不变(如 3.2.2 节所述)。虽然单头注意力 比最佳设置差 0.9 个 BLEU,但头数过多 时效果同样会下降。

在表3的(B)行中我们发现,减小注意力的键维度 d k d_k dk 会降低模型质量。这表明,计算"匹配度(compatibility)"并不容易,比简单点积更复杂的匹配函数可能会带来增益。在 (C) 和 (D) 行中我们可以看到,如预期一样:

  • 更大的模型效果更好
  • Dropout 对防止过拟合非常有效

在(E)行中,我们将正弦位置编码 替换为可学习的位置嵌入 [9],结果与基础模型几乎完全一样

6.3 English Constituency Parsing 英文句法成分分析

为了评估 Transformer 是否能泛化到其他任务 ,我们在英文句法成分分析任务上进行了实验。该任务具有特定的挑战性:输出受到严格的结构约束,且长度远大于输入。此外,在小数据场景下,RNN 序列到序列模型无法达到最优效果 [37]。

我们在 Penn Treebank 的华尔街日报(WSJ)部分(约 4 万句训练语句)上训练了一个 4 层 Transformer ,模型维度 d model = 1024 d_{\text{model}} = 1024 dmodel=1024。我们还在半监督设置下进行训练,使用更大的 high-confidence 与 BerkleyParser 语料库,约 1700 万句子 [37]。

  • 仅使用 WSJ 时:词汇表大小 16K
  • 半监督设置:词汇表大小 32K

我们只在 Section 22 验证集上做了少量实验,用来选择注意力 dropout、残差 dropout(5.4 节)、学习率和集束大小 ,其余所有参数都与英→德基础翻译模型保持不变 。在推理阶段,我们将最大输出长度设为 输入长度 + 300。无论是仅使用 WSJ 还是半监督设置,我们都使用:

  • 集束大小 beam size = 21
  • 长度惩罚系数 α = 0.3 \alpha = 0.3 α=0.3

表4的结果表明,尽管没有针对任务进行专门调优,我们的模型表现依然出奇地好。除了循环神经网络文法(Recurrent Neural Network Grammar)[8] 之外,我们的结果优于所有此前已发表的模型。

与 RNN 序列到序列模型 [37] 不同,Transformer 即使只在 4 万句的 WSJ 训练集上训练,效果也超过了 BerkeleyParser [29]。

7. 结论

在本文工作中,我们提出了 Transformer ,这是第一个完全基于注意力机制的序列转换模型 。我们使用多头自注意力替代了编码器--解码器架构中最常用的循环层。

在翻译任务上,Transformer 的训练速度显著快于 基于循环层或卷积层的架构。在 WMT 2014 英德翻译与英法翻译两项任务中,我们均取得了新的最优结果 。在前一项任务中,我们的最优模型甚至超越了此前所有的集成模型

我们对基于注意力机制的模型的未来感到兴奋,并计划将其应用于其他任务。我们计划将 Transformer 扩展到文本以外的输入输出模态,并研究局部受限注意力机制 ,以高效处理图像、音频、视频等大规模输入输出。降低生成过程的串行依赖性,也是我们的研究目标之一。

我们用于训练和评估模型的代码已开源,可在以下链接获取:https://github.com/tensorflow/tensor2tensor。

致谢 我们感谢 Nal Kalchbrenner 与 Stephan Gouws,感谢他们富有建设性的意见、修正建议及启发。

Attention Visualizations

图3:6层编码器中第5层自注意力机制捕捉长距离依赖的示例。 多个注意力头会关注动词"making"的远距离依赖项,以补全"making...more difficult"这一短语。 此处仅展示单词"making"的注意力分布情况,不同颜色代表不同的注意力头。建议查看彩色版本以获得最佳效果。

图4:同样位于6层编码器中第5层的两个注意力头,显然参与了指代消解(anaphora resolution)任务。上图:注意力头5的完整注意力分布。下图:仅针对单词"its",提取出的注意力头5和注意力头6的单独注意力分布。需注意,该单词("its")对应的注意力分布非常集中(sharp)。

图5:多数注意力头表现出的行为,似乎与句子结构相关。 上图给出了两个此类示例,均来自6层编码器中第5层的编码器自注意力,且分别源自两个不同的注意力头。这些注意力头显然已学会执行不同的任务。

相关推荐
-To be number.wan2 小时前
算法学习日记 |贪心算法
c++·学习·算法·贪心算法
清钟沁桐2 小时前
算法实现
算法
梦游钓鱼2 小时前
c++中一维数组和二维数组的应用
数据结构·c++·算法
铁甲前沿2 小时前
基于最小二乘拟合减小四轮定位数据采集误差的方法
算法
程序员酥皮蛋2 小时前
hot 100 第二十六题 26.环形链表 II
算法
啊阿狸不会拉杆2 小时前
《机器学习导论》第 16 章-贝叶斯估计
人工智能·python·算法·机器学习·ai·参数估计·贝叶斯估计
ArturiaZ3 小时前
【day27】
算法
望舒5133 小时前
代码随想录day32,动态规划part1
java·算法·leetcode·动态规划
楠秋9203 小时前
代码随想录算法训练营第三十二天| 509. 斐波那契数 、 70. 爬楼梯 、746. 使用最小花费爬楼梯
数据结构·算法·leetcode·动态规划