Bootstrap

Transformer 架构 理解

大家读完觉得有帮助记得关注和点赞!!!

Transformer 架构:encoder/decoder 内部细节。

的介绍,说明 Transformer 架构相比当时主流的 RNN/CNN 架构的创新之处

在 transformer 之前,最先进的架构是 RNN(通常是 LSTM 或 GRU),但它们存在一些问题。

RNN 展开(unrolled)后长这样:

RNN 最大的问题是级联(recurrent connection): 虽然它使得信息能沿着 input sequence 一路传导, 但也意味着在计算出 i−1 单元之前,无法计算出 i 单元的输出。

与 RNN 此对比,一维卷积(1D convolution)如下:

在这个模型中,所有输出向量都可以并行计算,因此速度非常快。但缺点是它们 在 long range dependencies 建模方面非常弱。在一个卷积层中,只有距离比 kernel size 小的单词之间才能彼此交互。对于更长的依赖,就需要堆叠许多卷积。

Transformer 试图兼顾二者的优点

  • 可以像对彼此相邻的单词一样,轻松地对输入序列的整个范围内的依赖关系进行建模(事实上,如果没有位置向量,二者就没有区别);
  • 同时,避免 recurrent connections,因此整个模型可以用非常高效的 feed forward 方式计算。

Transformer 的其余设计主要基于一个考虑因素 —— 深度 —— 大多数选择都是训练大量 transformer block 层,例如,transformer 中只有两个非线性的地方

  1. self-attention 中的 softmax;
  2. 前馈层中的 ReLU。

模型的其余部分完全由线性变换组成,完美地保留了梯度

摘要

主流的 sequence transduction model 都是基于复杂的循环或卷积神经网络, 其中包括一个 encoder 和一个 decoder。效果最好的模型还会通过 attention 机制将 encoder 和 decoder 连起来。

我们提出一种新的简单网络架构 Transformer,它弃用了循环和卷积,完全基于 attention 机制。

在两个机器翻译任务上的实验表明,Transformer 模型的效果好于其他模型,并且更容易并行化,训练时间显著减少。

  • Tranformer 在 WMT 2014 英德翻译任务上达到了 28.4 BLEU,比现有最佳结果提高了 2 BLEU 以上。

  • 在 WMT 2014 英法翻译任务上,Tranformer 在 8 个 P100 GPU 上训练 3.5 天后,创造了新的单模型最佳性能, 这个训练成本也远小于本文引用的性能类似的其他模型。

我们还成功将 Transformer 应用于英语句法分析,展示了 Transformer 在其他任务上的泛化能力。

1 引言

当前,RNN(Recurrent Neural Networks,循环神经网络)—— 尤其是 LSTM RNN(long short-term memory)和 gated RNN —— 已经是序列建模和 transduction 问题(例如语言建模和机器翻译)的最好方式, 现在也仍然有大量的工作在继续扩大 recurrent 类语言模型和 encoder-decoder 架构的能力边界。

1.1 RNN 架构的内在顺序计算限制(来自 RNN 其中的 R

Recurrent models 通常沿输入和输出序列的符号位置进行因子计算。

  • 对于位置 t,根据前一个隐藏状态 ht−1 和位置 t 处的 input 生成新的隐藏状态 ht。

  • 这种内在的顺序性限制了训练数据之间的并行化,序列较长时这一点尤为重要。

近期的工作通过分解技巧(factorization tricks)和条件计算(conditional computation)显著提高了计算效率, 此外,后者还提高了模型性能。然而,顺序计算(sequential computation)这一根本约束仍然存在。

1.2 RNN+Attention 架构:更好的模型效果

Attention 机制已经成为很多任务中序列建模和 transduction 模型的一个重要组成部分, 它允许直接对依赖进行建模(modeling of dependencies), 而不用考虑这些依赖在输入或输出序列中的距离。

但是,绝大部分大部分情况,人们仍然是将 attention 机制与 RNN 一起使用,因而仍然受到顺序计算的约束。

1.3 Transformer:避免 R,一种完全基于 attention 机制的新架构

本文提出 Transformer —— 一种避免循环机制、完全基于 attention 机制 而在输入和输出之间建立全局依赖关系的模型架构。

相比 RNN,Transformer 的并行能力显著提升,在 8 个 P100 GPU 上训练 12 小时就能创造新的最高翻译水平。

2 背景

2.1 CNN:减少顺序计算,但对远距离依赖关系的学习成本很高

Extended Neural GPU、ByteNet 和 ConvS2S 也是想减少顺序计算, 它们都使用 CNN(convolutional neural networks,卷积神经网络)作为基本构建块, 为所有输入和输出位置并行计算隐藏表示。

但是,在这些模型中,从两个任意输入或输出位置(input or output positions)做信号关联,所需的操作数量随着位置之间的距离增加而增加,

  • ConvS2S 线性增长

  • ByteNet 对数增长。

这使得学习远距离位置之间的依赖关系变得困难。而在 Transformer 中,

  • 所需的操作减少到一个常量,不过这里的代价是有效分辨率降低,这是 averaging attention-weighted positions 导致的;

  • 但是,可以通过 Multi-Head Attention 来缓解。

2.2 Self-attention (intra-attention) 机制

Self-attention,有时称为 intra-attention,

  • 是一种注意力机制(2014 paper),

  • 目的是计算序列的一种表示(a representation of the sequence)

  • 方式是对一个输入序列的不同位置做各种关联(relating different positions of a single sequence)。

Self-attention 已经成功地应用于各种任务 [4, 27, 28, 22],包括

  • 阅读理解(reading comprehension)

  • 总结抽象(abstractive summarization)

  • textual entailment

  • 学习任务无关的句子表示(task-independent sentence representations)

2.3 Tranformer:避免 RNN 和 CNN

端到端的记忆网络(end-to-end memory networks)是基于一种 recurrent attention 而非 sequence-aligned recurrence 的机制,在 simple-language question answering 和语言建模任务中表现良好。

但据我们所知,Transformer 是第一个完全依赖 self-attention —— 而不使用 sequence-aligned RNNs 或 CNNs —— 来计算输入和输出表示的 transduction 模型。

3 Transformer 模型架构

3.0 Encoder-decoder:sequence transduction 模型的基本结构

大部分性能较好的 neural sequence transduction 模型都会包含一个 encoder-decoder 结构:

  • encoder 将一个输入序列 (x1,…,xn) 映射到另一个序列表示 𝐳=(z1,…,zn)。

  • 给定 𝐳,decoder 生成一个输出序列 (y1,…,ym) —— 每次生成一个元素:

    • 生成下一个元素时,会将 input 连同上一步生成的元素一起,作为新的 input 输入 decoder;

    • 这种机制叫 auto-regressive(自回归)。

3.1 Encoder/decoder 内部结构

如下图所示,Transformer 沿用了 encoder-decoder 架构,

Figure 1: Transformer 架构,沿用了业界的 encoder-decoder 架构。

3.1.1 Encoder:6 * {multi-head-attention + feed-forward}

Figure 1: Transformer 架构:encoder/decoder 内部细节。

Transformer 的 encoder 由 N=6 个相同的层组成,每层又分为两个子层(图 1 左边):

  • multi-head self-attention 层;

  • 简单的 feed-forward 全连接层。

两个子层后面都会使用 residual connection,然后是 layer normalization。 也就是说,每个子层的输出是 LayerNorm(x+Sublayer(x)), 其中 Sublayer(x) 是子层本身实现的函数。

为了促进这些残差连接,模型中的所有子层以及 embedding 层, 都产生 dmodel=512 维的输出。

3.1.2 Decoder:6 * {masked-multi-head-attention + multi-head-attention + feed-forward}

Transformer 的 decoder 也由 N=6 个相同的层组成,

Figure 1: Transformer 架构:encoder/decoder 内部细节。

但与 encoder 不同,decoder 的每层还插入了第三个子层(图 1 右边),

  • 它对 encoder 的输出执行 multi-head attention。 具体来说,decoder 的输入是 encoder 的输出往右偏移一个位置(the output embeddings are offset by one position),再加上 position embeddings;

  • 这一子层的 self-attention 比较特殊,加了个掩码(masking),这是为了避免它使用当前位置后面的信息(attending to subsequent positions)。 换句话说,这确保了位置 i 处的预测只能依赖 i 位置前面的已知输出。

其他都与 encoder 类似,decoder 的每个子层后面都使用了残差连接,然后是层归一化。

3.2 Attention 内部结构

一个 attention 函数可以描述为将一个查询(query)和一组 key-value pairs 映射到一个 output,其中:

  • 查询、键、值和输出都是向量;

  • output 是 values 向量的加权和,其中每个 value 的权重是由 query 与相应 key 的一个 compatibility function 计算得到的。

3.2.1 Scaled Dot-Product Attention

如图 2 左侧所示,我们的 attention 称为 “Scaled Dot-Product Attention”。

Figure 2:(left) Scaled Dot-Product Attention. (right) Multi-Head Attention consists of several attention layers running in parallel.

输入

  • queries 和 keys:都是 dk 维的向量;

  • values:dv 的向量。

计算过程

分为两步:

  1. query 与所有 keys 的点积,将每个点积除以 dk−−√,然后应用 softmax,得到的是 values 的权重;

  2. 将这些权重与 values 相乘。

如图右侧,实际中,

  • 同时计算一组 queries,将它们打包成一个矩阵 Q。

  • keys 和 values 也被打包成矩阵 K 和 V。

计算输出矩阵为:

Attention(Q,K,V)=softmax(QKTdk−−√)V

(1)两个最常用的 attention 函数是 additive attention [2] 和 dot-product(multiplicative)attention。

  • Dot-product attention 除了缩放因子 1dk√ 与我们的算法不同,其他都是一样的;

  • Additive attention 使用有单个隐藏层的 feed-forward network 来计算 compatibility function。

尽管二者的理论复杂度上类似,但实际上 dot-product attention 更快,更节省空间,因为它可以使用高度优化的矩阵乘法实现。

虽然对于小的 dk 值,这两种机制的性能相似,但对于较大的 dk 值,additive attention 优于不缩放的 dot-product attention。 我们猜测是对于较大的 dk 值,点积变得很大,将 softmax 函数推到到了梯度极小的区域。 为了避免这个问题,我们通过 1dk√ 缩放点积。

3.2.2 Multi-Head Attention 的计算

Figure 2:(left) Scaled Dot-Product Attention. (right) Multi-Head Attention consists of several attention layers running in parallel.

线性变换 query/key,并行 attention 计算,最后再拼接 value

相比于对 dmodel 维的 keys、values 和 queries 执行单个 attention 函数, 我们发现可以并行计算:

  1. 将 queries、keys 和 values 进行 h 次线性变换(投影) —— 每次使用不同的、学习到的变换矩阵 —— 将三者分别变换到 dk、dk 和 dv 维度。

  2. 对变换之后的 queries、keys 和 values 并行执行 attention 函数,就得到 dv 维的输出 values。

  3. 将这些 values 拼接到一起再进行一次线性变换,就得到了最终的 values。

公式和参数矩阵

Multi-head attention 允许模型同时 attend(关注)不同位置的不同表示子空间(representation subspaces)的信息。 如果只有一个 attention head,它的平均(averaging)会削弱这种效果。

MultiHead(Q,K,V)=Concat(head1,…,headh)WO

其中,headi=Attention(QWQi,KWKi,VWVi)

其中,线性变换(投影)就是下面几个参数矩阵:

  • WQi∈ℝdmodel×dk

  • WKi∈ℝdmodel×dk

  • WVi∈ℝdmodel×dv

  • WO∈ℝhdv×dmodel

本文中我们使用

  • h=8,也就是 8 个并行的 attention layers/heads。

  • dk=dv=dmodel/h=64,也就是将 query/key/value 向量都分段投影到 64 维向量。

由于每个 head 的维度降低,总计算成本与完整维度的 single head attention 相似。

3.2.3 Attention 在模型中的应用

Transformer 以三种不同的方式使用 multi-head attention:

“encoder-decoder attention” layers

这一步的用法就是 sequence-to-sequence 模型中 [38, 2, 9] 的典型 encoder-decoder attention 机制。

输入:

  • queries 来自前一个 decoder 层

  • memory keys 和 values 来自 encoder 的输出。

这使得 decoder 中的每个位置都可以关注输入序列中的所有位置。

encoder layers

encoder 层包含了 self-attention layers。

输入:keys、values 和 queries 都来自 encoder 中前一层的输出。

encoder 中的每个位置都可以关注 encoder 前一层的所有位置。

docoder layers

与 encoder 中类似,decoder 中的 self-attention 层允许 decoder 中的每个位置关注 decoder 中到该位置为止的所有位置。

  • 为了保证自回归特性(auto-regressive),需要防止 decoder 中的左向信息流。

  • 我们通过屏蔽与非法连接对应的 softmax 输入中的所有值(设置为负无穷大 −∞)来实现这一点。

3.3 Position-wise Feed-Forward Networks

除了 attention 子层,encoder 和 decoder 中的每个层都包含一个全连接的 feed-forward 网络, 包括两个线性变换和一个 ReLU 激活。

Figure 1: Feed-Forward Network (FFN) 内部结构。

对应的数学公式:

FFN(x)=max(0,xW1+b1)W2+b2

(2)线性变换在不同位置上是功能是相同的,但在不同的层使用的参数不同。 也可以将它们描述为:两个 kernel size 为 1 的卷积。 输入和输出的维度是 dmodel=512,内层的维度是 dff=2048。

3.4 嵌入与 Softmax

与其他 序列转导模型 类似,我们使用 学习到的嵌入 将输入 tokens 和输出 tokens 转换为维度为 dmodel=512 的向量。 我们还使用常见的基于学习的线性变换和 softmax 函数将 decoder 输出转换为下一个 token 的预测概率分布(predicted next-token probabilities)。 我们的模型中,在两个 embedding 层和 pre-softmax 线性变换之间共享相同的权重矩阵,类似于 [30]。 在 embedding 层中,我们将这些权重乘以 dmodel−−−−−√。

3.5 Positional Encoding(位置编码)

3.5.1 目的:向 token 注入位置信息

因为我们的模型不包含循环和卷积,为了使模型能够利用到序列的顺序, 必须向 token 注入一些关于相对或绝对位置的信息。

3.5.2 编码算法:正弦函数

如下图所示,为了注入位置信息,

Figure 1: Transformer 架构,沿用了业界的 encoder-decoder 架构。

我们在 encoder/decoder 的入口都添加了 “positional encodings”,它与 input embeddings 相加之后才开始后面的 attention 计算。。 位置编码与 input embedding 具有相同的维度 dmodel=512,因此可以相加。

位置编码有许多选择,有基于学习的,也有固定的。 本文中,我们使用不同频率的正弦和余弦函数:

PE(pos,2i)=sin(pos/100002i/dmodel)

PE(pos,2i+1)=cos(pos/100002i/dmodel)

其中,pos 是位置,i 是维度。也就是说,位置编码的每个维度对应于一个正弦波。 波长从 2π 到 10000⋅2π 形成一个几何级数。

  • 选择这个函数是因为我们猜测它可以让模型很容易地学习通过相对位置进行 attention, 因为对于任何固定的偏移 k,PEpos+k 可以表示为 PEpos 的线性函数。

  • 我们还尝试使用 learned positional embeddings,发现结果几乎相同。

  • 最终选择了正弦版本,因为它可能会让模型对超出训练期间遇到的序列长度进行外推(extrapolate to sequence lengths)。

4 关注

本节我们对 self-attention 层与循环及卷积层(the recurrent and convolutional layers)进行一个比较, 它们都是常用的将一个变长序列的符号表示 (x1,…,xn) 映射为另一个同样长度的序列 (z1,…,zn) 的方式, 其中 xi,zi∈ℝd,例如典型序列转换 encoder/decoder 中的隐藏层。

4.1 Motivation

我们设计 self-attention 有三方面原因:

  1. 每层的计算复杂度;

  2. 可以并行化的计算量,由所需的最小顺序操作数来衡量;

  3. 网络中长距离依赖(long-range dependencies)的路径长度。

    学习 long-range dependencies 是许多序列转换任务的核心挑战。 影响学习这种依赖的能力的一个核心因素是信号在网络中前向和后向传播的路径长度。 输入和输出序列中任意位置的这种路径越短,long-range dependencies 的学习越容易。 因此,我们还比较了在多层网络中,输入和输出位置之间任意两个位置的 maximum path length。

4.2 与循环网络、卷积网络的计算复杂度对比

如下表所示,

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

对于 sequential operations,

  • 一个 self-attention 层连接所有位置,因此所需的顺序操作是常数(换句话说,可以完全并行化,一次完成);

  • 一个循环层则需要 O(n) 个顺序操作。

在计算复杂度方面,

  • 当序列长度 n 小于表示维度 d 时,self-attention 层比循环层更快,

  • 这在机器翻译领域已经得到证明,例如 word-piece 和 byte-pair 表示。

处理非常长的序列方面:

  • 为了提高计算性能,可以限制让 self-attention 只考虑 输入序列中以各自输出位置为中心的大小为 r 的邻域。

  • 这会将最大路径长度增加到 O(n/r)。我们计划在未来的工作中进一步研究这种方法。

核宽 k < n 的单个卷积层无法连接所有输入和输出位置对。在内核连续的情况下,这样做需要堆叠 O(n/k) 个卷积层;在扩张卷积的情况下,需要堆叠 O(logk(n) 个卷积层,从而增加了网络中任意两个位置之间最长路径的长度。卷积层的成本通常比递归层高 k 倍。然而,可分离卷积会大大降低复杂度,达到 O(k⋅n⋅d+n⋅d2)。不过,即使 k=n 时,可分离卷积的复杂度也相当于自注意层和点式前馈层的组合,而我们在模型中采用的正是这种方法。

4.3 更具可解释性的模型

除了上述优势,self-attention 还能产生更具可解释性的模型。

我们检查了 Transformer 模型的 attention 分布,并在附录中展示和讨论了一些例子。 不仅每个 attention head 都明显学会了执行不同的任务,许多 head 还表现出与句子的句法和语义结构相关的行为。

5 训练

本节描述 Transformer 的训练方案。

5.1 训练数据和批处理

1、我们在 WMT 2014 英德标准数据集上进行了训练,该数据集包含约 450 万个句子对。句子采用字节对编码[3],源目标共享词汇量约为 37000 个标记。

2、对于英语-法语,我们使用了规模更大的 WMT 2014 英语-法语数据集,该数据集包含 3600 万个句子,并将标记拆分为 32000 个词块词汇[38]。

3、句子对按近似序列长度分组。每个训练批包含一组句子对,其中包含约 25000 个源词块和 25000 个目标词块。

5.2 硬件和时间表

在一台 8 * NVIDIA P100 GPU 的机器上训练。

  • 对于本文描述的超参数/尺寸,我们称为基本模型,每个训练步骤大约需要 0.4 秒。整个训练共 100,000 步或 12 小时。

  • 对于尺寸更大的模型,步骤时间为 1.0 秒。整个训练用了 300,000 步(3.5 天)。

5.3 优化器

我们使用了 Adam 优化器,其中 β1=0.9,β2=0.98 和 ϵ=10−9。 根据以下公式在训练过程中改变学习率:

lrate=d−0.5model⋅min(stepnum−0.5,stepnum⋅warmupsteps−1.5)

这对应于在前 warmupsteps 训练步骤中线性增加学习率,然后在此后按比例减少,与步数的倒数平方根成比例。 我们使用了 warmupsteps=4000。

5.4 规范化

我们在训练过程中使用了几种类型的正则化。

Residual Dropout

  • 对每个子层的输出应用 dropout,然后将其添加到子层输入并进行归一化。

  • 对 encoder/decoder 中的 input embeddings + positional encodings 的结果应用 dropout。

对于 base 模型,我们使用了 Pdrop=0.1。

标签平滑

在训练过程中,我们使用了 ϵls=0.1 的 label smoothing。这会降低 perplexity,因为模型 learns to be more unsure,但会提高准确性和 BLEU 分数。

6 结果

6.1 Machine Translation

Table 2:在英语到德语和英语到法语的 newstest2014 测试中,Transformer 的 BLEU 分数高于之前的先进模型,而训练成本仅为之前的一小部分。

在 WMT 2014 英译德翻译任务中,大转换器模型(Transformer (big))的 BLEU 值比之前报道的最佳模型(包括合集)高出 2.0 以上,达到了 28.4 的最新 BLEU 值。该模型的配置见表 2 底行。在 8 个 P100 GPU 上的训练耗时 3.5 天。即使是我们的基本模型,也超越了之前发布的所有模型和合集,而训练成本仅为任何竞争模型的一小部分。

在 WMT 2014 英法互译任务中,我们的大模型获得了 41.0 的 BLEU 分数,超过了之前发布的所有单一模型,而训练成本还不到之前最先进模型的 1/4。针对英译法训练的 Transformer(大)模型使用了 Pdrop=0.1,而不是 0.3。

对于基础模型,我们使用的是通过平均最近 5 个检查点得到的单一模型,这些检查点是以 10 分钟的间隔写入的。对于大型模型,我们取最后 20 个检查点的平均值。我们使用波束搜索,波束大小为 4,长度惩罚 α=0.6 。这些超参数是在开发集上实验后选择的。我们将推理过程中的最大输出长度设定为输入长度 + 50,但尽可能提前终止。

表 2 总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过将训练时间、使用的 GPU 数量和每个 GPU 的持续单精度浮点运算能力的估计值相乘,估算出训练一个模型所使用的浮点运算次数。

6.2 模型变化

表 3:变压器架构的各种变化。未列出的值与基础模型的值相同。所有指标均基于英德翻译开发集 newstest2013。根据我们的字节对编码,列出的困惑度为每字片段的困惑度,不应与每字困惑度进行比较。

为了评估 Transformer 不同组件的重要性,我们以不同方式改变了基础模型,测量了开发集 newstest2013 上英译德性能的变化。我们使用了上一节所述的波束搜索,但没有使用检查点平均法。我们在表 3 中列出了这些结果。

在表 3 行(A)中,我们改变了注意头的数量以及注意键和值的维度,计算量保持不变,如多头一节所述。虽然单头注意力比最佳设置差 0.9 BLEU,但注意力头数过多也会导致质量下降。

在表 3 行(B)中,我们发现减小注意力密钥大小 dk 会降低模型质量。这表明,确定兼容性并不容易,比点积更复杂的兼容性函数可能更有益处。在第(C)行和第(D)行中,我们进一步观察到,正如我们所预期的那样,模型越大越好,而 dropout 对避免过度拟合很有帮助。在第(E)行中,我们用学习到的位置嵌入替换了正弦位置编码,观察到的结果与基础模型几乎完全相同。

6.3 英语选区解析

表 4:转换器在英语选区解析方面具有良好的通用性(结果见《WSJ》第 23 节)

为了评估转换器是否能推广到其他任务,我们进行了英语选区解析实验。这项任务具有特殊的挑战性:输出结果受到强大的结构约束,而且比输入结果要长得多。此外,RNN 序列到序列模型在小数据环境下也无法达到最先进的结果。

我们在宾夕法尼亚大学树库(Penn Treebank)的《华尔街日报》(WSJ)部分训练了一个 dmodel=1024 的 4 层变换器,大约有 40K 个训练句子。我们还使用更大的高置信度语料库和 BerkleyParser 语料库(约有 177 万个句子),在半监督环境下对其进行了训练。在仅使用 WSJ 的设置中,我们使用了 16K 词组,而在半监督设置中,我们使用了 32K 词组。

我们只在第 22 节开发集上进行了少量实验,以选择丢弃率(包括注意力和残差)、学习率和波束大小,所有其他参数均与英德基础翻译模型保持一致。在推理过程中,我们将最大输出长度增加到输入长度 + 300。在仅 WSJ 和半监督设置中,我们使用的波束大小均为 21,α=0.3。

表 4 中的结果表明,尽管缺乏针对特定任务的调整,我们的模型仍然表现出了令人惊讶的出色性能,其结果优于除递归神经网络语法之外的所有之前报道过的模型。

与循环神经网络序列到序列模型相比,即使只在由 4 万个句子组成的 WSJ 训练集上进行训练,Transformer 的表现也优于 BerkeleyParser。

展望未来,我们对基于 attention 的模型充满期待,并计划将其应用于其他任务。 我们计划将 Transformer 扩展到文本以外的涉及输入/输出模态(involving input and output modalities)的场景, 并研究局部、受限的 attention 机制,以有效处理大输入和输出,如图像、音频和视频。 让生成过程尽量避免顺序执行(making generation less sequential)也是我们的一个研究目标。

;