【论文笔记】Attention Is All You Need
文章目录
- 【论文笔记】Attention Is All You Need
- Abstract
- 1 Introduction
- 2 Background
- 补充知识:软注意力 soft attention 和硬注意力 hard attention?
- 补充知识:加法注意力机制和点乘注意力机制
- Extended Neural GPU 介绍
- ByteNet 介绍
- ConvS2S 介绍
- End to end Memory Network 端到端内存网络介绍
- 3 Model Architecture
- 3.1 Encoder and Decoder Stacks
- 3.2 Attention
- 3.2.1 Scaled Dot-Product Attention: “缩放点积注意力”
- 3.2.2 Multi-Head Attention
- 3.2.3 Applications of Attention in our Model
- 3.3 Position-wise Feed-Forward Networks
- 3.4 Embeddings and Softmax
- 3.5 Positional Encoding
- 4 Why Self-Attention
- 5 Training
- 5.1 Training Data and Batching
- 5.2 Hardware and Schedule
- 5.3 Optimizer
- 5.4 Regularization
- 残差 Dropout
- 标签平滑 label smoothing
- 补充知识:标签平滑技术
- 6 Results
- 6.1 Machine Translation
- 补充知识:集束搜索 beam search
- 补充知识:模型的集成
- 6.2 Model Variations
- 6.3 English Constituency Parsing
- 7 Conclusion
Abstract
当时(2017年以及之前),做 序列处理任务 的深度学习模型,都包含了由循环神经网络和卷积神经网络组成的编码器和解码器模块。更进一步的,表现最好的模型额外用了注意力机制来连接编码器和解码器。
We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely.
Transformer 的作者们提出了这个更加简单的序列处理模型,只包含了注意力机制,完全取消了循环和卷积神经网络模块。
实验设置:WMT 2014 机器翻译比赛里面英德、英法两个翻译任务。
评估指标:BLEU 。
实验效果:
- 英德翻译达到 28.4 BLEU,比之前的模型提高了 2 BLEU;英法翻译达到 41.8 BLEU,成为新 sota 模型。
- 更好的翻译质量、更并行化的处理以及更少的训练时间。
泛化性评估:在 English constituency parsing (英语选区分析)任务中采用大量而有限的数据进行训练,也能达到效果,transformer 并非只会机器翻译,还能做其他任务。
英语选区分析是一种自然语言处理技术,用于将句子分解成其各个成分或短语的过程。这种分析有助于理解句子的结构和语法关系,可以帮助计算机更好地理解和处理自然语言文本。英语选区分析通常涉及识别句子中的主语、谓语、宾语等成分,并确定它们之间的依存关系。这种技术在机器翻译、信息检索和问答系统等领域具有重要应用,有助于提高计算机处理自然语言的准确性和效率。
1 Introduction
传统的序列建模和转导问题主要用于语言建模或者机器翻译,这些工作的SOTA模型(2017年)都是由RNN、LSTM和门控网络组成的,到现如今(2017年)也有大量的工作在推进循环语言模型(recurrent language models)以及编码器-解码器(encoder-decoder)的结构。
循环模型通常会沿着输入和输出序列的符号位置进行计算,将位置与计算时间中的步骤对齐,这句话可以解读成循环模型对序列的处理是串行的。它们生成一系列隐藏状态 h t h_t ht , h t h_t ht 先前隐藏状态 h t − 1 h_{t−1} ht−1 和位置 t t t 输入的函数,也就是 h t = f ( h t − 1 , x t ) h_{t}=f(h_{t-1},x_{t}) ht=f(ht−1,xt) 这个式子,只有当 x t x_{t} xt 计算完毕才能计算 x t + 1 x_{t+1} xt+1 也说明是串行处理的。这种固有的顺序处理本质阻碍了训练并行化,这在较长的序列做处理上变得困难,因为内存限制了示例之间的批处理。
当序列变长时,在 GPU 中记录的 中间变量 会线性增多,这就导致批次需要调小,或者使用迷你批次、数据并行和梯度累积等方式。
最近的(2017年)工作通过 分解技巧 和 条件计算 显着提高了计算效率,同时后者还提高了模型的性能。然而,顺序/串行计算的本质局限仍然存在。
分解技巧就是将 LSTM 的权重矩阵分解成两个子矩阵,且子矩阵的元素数量都比原来的少;其次就是把 LSTM 权重矩阵、其输入和隐藏状态分成独立的组。这样设计的目的是提高计算效率。
分解技巧可以和现在的 LORA 微调结合起来,LORA 的特点就是在原来模型参数的基础上增加一对矩阵的乘积 A a × r B r × b A_{a\times r}B_{r\times b} Aa×rBr×b (其中 r < < a , b r<<a,b r<<a,b),且 A A A 和 B B B 的元素数量远小于原来模型参数的数量。
是指在 LSTM 中根据输入数据的不同条件执行不同的计算。在 LSTM 中,通过门控单元(如遗忘门、输入门、输出门)来控制信息的流动,从而实现不同时间步的计算。这种条件计算使得 LSTM 能够更好地处理长序列数据,并学习长期依赖关系。通过调整门控单元的权重和偏置,LSTM 可以根据当前输入以及之前的状态来动态调整计算过程,以适应不同的条件和输入数据。
感觉可以和混合专家模型建立联系,根据样本输入动态地调整模型内组件的“工作量”。
同时可见,当年对 LSTM 的改进,主要是在不改变顺序/串行计算本质基础上进行的改进或优化,没有使用并行计算,因此在当时 LSTM 在计算上仍然低效。
注意机制已经成为各种序列建模和转导任务中的一个很好的组成部分,允许对依赖关系进行建模,而不考虑它们在输入或输出序列中的距离。这句话可以解读成即使两个内容实体在一个句子中相隔较远,注意力机制也能在训练阶段捕获到它们之间的关系。然而,这种注意机制一般与循环网络一起使用。
在这篇论文中提出了 Transformer ,一个避免循环的模型架构,而是完全依赖于注意机制来描述输入和输出之间的全局依赖关系。Transformer 允许更多的并行化,在 8 个 P100 GPU 上进行了短短 12 个小时的训练后,模型获得很强的翻译能力。
循环神经网络(以 LSTM 为代表)存在:本身模型结构复杂 + 串行处理序列 + 对长序列的处理不佳等问题,然后作者认为是循环结构的本质特点造成的。
2 Background
这一部分是系统性的综述,综述主题是“如何降低序列计算”。
减少序列建模的计算量是 Extended Neural GPU 、 ByteNet 和 ConvS2S 的目标,所有的这些模型都使用了卷积神经网络、循环神经网络还有一部分的注意力机制以作为基本构建块,在输入和输出位置并行计算所有隐藏表征。在这些模型中,关联来自两个任意输入或输出位置的信号所需的计算量随着位置之间的距离而增加,对于 ConvS2S 呈线性增长,这是由于中间模块是编码解码组成的互注意力,对于 ByteNet 呈对数增长。这就导致这些模型学习句子中内容距离较长的关系时候变得薄弱,内容关系相距越长需要的计算操作就越多。
补充知识:软注意力 soft attention 和硬注意力 hard attention?
软注意力和硬注意力是深度学习中用于处理序列数据的两种不同的注意力机制。软注意力是一种通过对整个输入序列进行加权求和来计算输出的方法,权重是在 0 到 1 之间连续的实数。而硬注意力则是一种只关注输入序列中特定位置的方法,即只选择一个或少数几个位置进行计算。
软注意力通常用于处理较长的序列数据,可以更好地捕捉全局信息。硬注意力则更适用于需要更精确位置信息的任务,硬注意力模型有一个缺点是不可微分,导致需要梯度流的强化学习过程难以实现。两种注意力机制在不同场景下有各自的优势和应用。
补充知识:加法注意力机制和点乘注意力机制
Additive Attention,也称为 Bahdanau Attention,使用单层前馈网络来计算注意力分数。
Attention ( h i , s j ) = v attention T tanh ( W attention [ h i , s j ] ) \text{Attention}(h_{i},s_{j})=v_{\text{attention}}^{T}\tanh(W_{\text{attention}}[h_{i},s_{j}]) Attention(hi,sj)=vattentionTtanh(Wattention[hi,sj])
其中 v attention T v_{\text{attention}}^{T} vattentionT 和 W attention W_{\text{attention}} Wattention 是训练得到的注意力参数。这里 h h h 指的是编码器的隐藏状态, s s s 是解码器的隐藏状态。 Attention ( h i , s j ) \text{Attention}(h_{i},s_{j}) Attention(hi,sj) 函数是一种对齐得分函数。可以使用对齐分数矩阵来显示源句子和目标句子之间的相关性。在神经网络中,一旦有了对齐分数,就使用这些对齐分数的 softmax 函数计算最终分数(确保其总和为 1 且每个项目都是正数)。点积注意力是一种注意力机制,其中对齐分数函数被计算为:
Attention ( h i , s j ) = h i T ⋅ s j = h i T ⋅ I ⋅ s j \text{Attention}(h_{i},s_{j})=h_{i}^{T}\cdot s_{j} = h_{i}^{T}\cdot I \cdot s_{j} Attention(hi,sj)=hiT⋅sj=hiT⋅I⋅sj
这相当于乘法注意力(没有可训练的权重矩阵,假设这是一个单位矩阵 I I I )。这里 h h h 指的是编码器的隐藏状态, s s s 是解码器的隐藏状态。 Attention ( h i , s j ) \text{Attention}(h_{i},s_{j}) Attention(hi,sj) 函数是一种对齐得分函数。
Extended Neural GPU 介绍
Extended Neural GPU的解说博客在这里。
神经图灵机 (Neural Turing Machine, NMT)通过实验证明:神经网络模型可以通过在神经网络模型中添加内存模块(如计算机的 DRAM)并将内存读/写操作配置为可微分,从而从给定示例中学习广义算法。但是,当从序列性示例数据中学习广义算法时,常规操作都是串行学习,因为学习过程中只有一个步骤就需要用软注意力机制对整个序列至少计算一次,导致似乎没有并行学习的可能。
这篇文章为了克服上述问题(序列处理中的并行计算问题),提出了一个 Extended Neural GPU 的概念。与专门从事具有复杂控制流的无序执行的 CPU 相比,GPU 具有专门用于流处理的硬件结构,具有并行化的优势。这篇文章建立一个在 NMT 中运行良好的模型,并将所提出的架构应用于序列学习问题。
传统 GRU 的实现:
{ u = σ ( W ′ x + U ′ s + B ′ ) r = σ ( W ′ ′ x + U ′ ′ s + B ′ ′ ) z = tanh ( W x + U ( r ⋅ s ) + B ) GRU ( x , s ) = u ⋅ s + ( 1 − u ) ⋅ z \begin{cases} u=\sigma(W^{\prime}x+U^{\prime}s+B^{\prime}) \\ r=\sigma(W^{\prime\prime}x+U^{\prime\prime}s+B^{\prime\prime}) \\ z=\tanh(Wx+U(r\cdot s)+B) \\ \text{GRU}(x,s)=u\cdot s+(1-u)\cdot z \\ \end{cases} ⎩ ⎨ ⎧u=σ(W′x+U′s+B′)r=σ(W′′x+U′′s+B′′)z=tanh(Wx+U(r⋅s)+B)GRU(x,s)=u⋅s+(1−u)⋅z
Neural GPU 基本操作与 GRU 类似,它只将序列数据作为输入。
这张图展示的是输入序列 { i 1 , 1 × 3 ⋯ i n , 1 × 3 } \{i_{1,1\times 3}\cdots i_{n,1\times 3}\} {i1,1×3⋯in,1×3} 到输出序列 { o 1 , 1 × 3 , ⋯ o n , 1 × 3 } \{o_{1,1\times 3},\cdots o_{n,1\times 3}\} {o1,1×3,⋯on,1×3} 的映射。 序列数据的所有元素都会在时间步长为 0 时被使用。因为存在宽度,所以 ∗ * ∗ 是卷积形式的算子。
注意:CGRU都是一直复用的,这里复用了 n n n 次,与序列长度一致。
{ u = σ ( U ′ ∗ s + B ′ ) r = σ ( U ′ ′ ∗ s + B ′ ′ ) z = tanh ( U ∗ ( r ⋅ s ) + B ) CGRU ( s ) = u ⋅ s + ( 1 − u ) ⋅ z \begin{cases} u=\sigma(U^{\prime}* s+B^{\prime}) \\ r=\sigma(U^{\prime\prime}* s+B^{\prime\prime}) \\ z=\tanh(U*(r\cdot s)+B) \\ \text{CGRU}(s)=u\cdot s+(1-u)\cdot z \end{cases} ⎩ ⎨ ⎧u=σ(U′∗s+B′)r=σ(U′′∗s+B′′)z=tanh(U∗(r⋅s)+B)CGRU(s)=u⋅s+(1−u)⋅z
那么,上面这张图的表现形式是: { o 1 ⋯ n } = CGRU 2 n ( ⋯ CGRU 2 ( CGRU 1 ( { s 1 ⋯ n } ) ) \{\mathbf{o_{1\cdots n}}\}=\text{CGRU}_{2n}(\cdots\text{CGRU}_{2}(\text{CGRU}_{1}(\{\mathbf{s_{1\cdots n}}\})) {o1⋯n}=CGRU2n(⋯CGRU2(CGRU1({s1⋯n})) 。训练是在 logit 的 softmax 和目标标签之间的负对数似然损失的情况下完成的。
这就回答了之前 NMT 提到的问题:”学习过程中只有一个步骤就需要用软注意力机制对整个序列至少计算一次“,现在是全步骤需要了。我的理解是整个循环的架构没有改变,一直做递归,但是每次递归都是对整个序列做处理,这样的并行性提高了,但是计算量还是很大。
Extended Neural GPU 实现:
Neural GPU 本身并不能为 NMT 等实际应用提供良好的性能。这是因为语言模型独立地预测每个输出元素。通过配置 编码器-解码器 网络提出了 Extended Neural GPU 。
注意:CGRU 和 CGRU d ^{d} d 同样都是复用的,同样这里复用了 n n n 次,与序列长度一致。
每个解码时间步长都会打印当时的输出元素 o 1 , 2 ⋯ n o_{1,2\cdots n} o1,2⋯n,可以直接将前一个输出元素的预测加入中间状态中用于当前输出元素的预测。
{ u = σ ( U ′ ∗ s + W ′ ∗ p + B ′ ) r = σ ( U ′ ′ ∗ s + W ′ ′ ∗ p + B ′ ′ ) z = tanh ( U ∗ ( r ⋅ s ) + W ∗ p + B ) CGRU d ( s , p ) = u ⋅ s + ( 1 − u ) ⋅ z \begin{cases} u=\sigma(U^{\prime}* s+W^{\prime}*p+B^{\prime}) \\ r=\sigma(U^{\prime\prime}* s+W^{\prime\prime}*p+B^{\prime\prime}) \\ z=\tanh(U*(r\cdot s)+W*p+B) \\ \text{CGRU}^{d}(s,p)=u\cdot s+(1-u)\cdot z \end{cases} ⎩ ⎨ ⎧u=σ(U′∗s+W′∗p+B′)r=σ(U′′∗s+W′′∗p+B′′)z=tanh(U∗(r⋅s)+W∗p+B)CGRUd(s,p)=u⋅s+(1−u)⋅z
对 p p p 的初始化是一个全 0 0 0 的矩阵,当解码输出 o t o_{t} ot 并转化成 p t p_{t} pt 时候存储至 p p p 的存储空间中,其他的仍然为 0 0 0 ,这跟 transformer的解码部分很类似:对未曾见到的部分分配极小的注意力。
这里的 CGRU 递归计算 n n n 我的理解是要跟序列长度保持一致。那么,这就导致当处理 1 , 2 1,2 1,2 与 n − 2 , n − 1 n-2,n-1 n−2,n−1 之间的关系时,计算量是很大的。
ByteNet 介绍
ByteNet的解说博客在这里。
ByteNet 是一个一维卷积神经网络。 ByteNet 由两部分组成,一部分用于编码源序列,另一部分用于解码目标序列。ByteNet 是一种 字符级 神经机器翻译方法,这意味着它 逐个字符(而不是逐个单词) 执行翻译。
主要特点如下:
-
Encoder-Decoder Stacking: for maximize the representational bandwidth between the encoder and the decoder.
最大化表征带宽,也就是说明编码器编码的结果以及解码器前序解码内容可以持续地复用。预测第 n n n 个字符,则使用了 s 0 − s 16 s_{0}-s_{16} s0−s16 以及 t 0 − t n − 1 t_{0}-t_{n-1} t0−tn−1 计算出来的表征进行预测,编码器的编码数据以及解码器前序解码内容高频复用,最大化了编码器表征带宽。
-
Dynamic Unfolding: generates variable-length outputs (maintaining high bandwidth and being resolution-preserving).
这里的理解是整个模型仍然是顺序/串行进行的,这就使得它可以输出长短不一的输出序列。
-
Dilation convolution: Dilation convolution makes the receptive field grow exponentially in terms of the depth of the networks, as opposed to linearly.
膨胀卷积:扩张使感受野随着网络深度呈指数增长,而不是线性增长。
ByteNet是一种深度学习模型,它使用了膨胀卷积来捕捉序列数据中的长距离依赖。膨胀卷积通过引入一个间隔(称为膨胀率)来扩大卷积核的感受野,而不是仅在相邻的输入位置上进行操作。随着网络深度的增加,膨胀率以指数方式增加(例如,1, 2, 4, 8, ⋯ \cdots ⋯)。这意味着每一层可以捕捉到更远距离的信息。随着网络深度的线性增加,模型的感受野以指数方式增加。从信息理论的角度来看,要覆盖整个输入序列,所需的层数与序列长度的对数成正比。这种结构使得ByteNet能够在深度较浅的情况下就实现对长距离依赖的学习。
-
Residual Blocks. 使用了残差结构保证梯度存在。
ConvS2S 介绍
ConvS2S的解说博客在这里。
上部是编码器,底部是解码器。编码器 RNN 处理包含 m m m 个元素的输入序列 x = ( x 1 , ⋯ , x m ) x=(x_1,\cdots,x_m) x=(x1,⋯,xm) ,并输出状态表征 z = ( z 1 , ⋯ , z m ) z=(z_1,\cdots,z_m) z=(z1,⋯,zm) 。解码器 RNN 接收 z z z 并从左到右生成输出序列 y = ( y 1 , ⋯ , y n ) y=(y_1,\cdots,y_n) y=(y1,⋯,yn) ,每次一个元素。为了生成输出 y i + 1 y_{i+1} yi+1 ,解码器会根据之前的状态 h i h_i hi 、之前目标语言单词 y i y_i yi 的嵌入 g i g_{i} gi 以及从编码器输出 z z z 得出的条件输入 c i c_{i} ci 计算出一个新的隐藏状态 h i + 1 h_{i+1} hi+1 。
输入元素 x = ( x 1 , ⋯ , x m ) x=(x_1,\cdots,x_m) x=(x1,⋯,xm) 嵌入到分布空间中,如 w = ( w 1 , ⋯ , w m ) w=(w_1,\cdots,w_m) w=(w1,⋯,wm) 。输入元素的绝对位置 p = ( p 1 , ⋯ , p m ) p=(p_1,\cdots,p_m) p=(p1,⋯,pm) 被嵌入。将 w w w 和 p p p 结合起来,就能得到输入元素表示 e = ( w 1 + p 1 , ⋯ , w m + p m ) e=(w_1+p_1,\cdots,w_m+p_m) e=(w1+p1,⋯,wm+pm) 。因此,使用的是位置相关词嵌入。同样,在解码器上,也使用位置嵌入。
编码器和解码器网络共享一个简单的网络块结构。每个网络块都包含一个一维卷积层,后跟一个非线性层。在解码器中,不对称三角形意味着未来的单词不用于卷积层计算。
在卷积层中,卷积操作对输入序列的每个位置都是局部的,并且共享权重,意味着卷积核所到之处进行 同样的核内线性操作 。那么:假如我们需要关联位置距离较远的信息实体,那么我们就需要更大的卷积核,那么核内线性计算操作量也要随之线性地增大。
卷积层的输出分为 A 和 B 两部分,并通过门控线性单元 (Gated Linear Unit): v [ A B ] = A × σ ( B ) v[A\ B]=A\times \sigma(B) v[A B]=A×σ(B) 。其中 × \times × 是逐点乘法, σ σ σ 是 sigmoid 函数。GLU 在编码器上的输出为 z z z ;GLU 在解码器处的输出 h h h 。从每个卷积的输入到 GLU 模块的输出中添加了残差连接。
在计算注意力前:将当前解码器状态 h i h_{i} hi 与前一个目标元素 g i − 1 g_{i-1} gi−1 的嵌入相结合,得到解码器汇总 d i d_{i} di ;执行解码器汇总 d i d_{i} di 和编码器输出 z z z 的点积(蓝色和黄色的中心阵列)。注意力权重 a i , j a_{i,j} ai,j 是通过在点积元素上使用 softmax 获得的。最后,计算条件输入 c i c_{i} ci ,它是 ( z + e ) (z+e) (z+e) 加权的注意力之和。可见: z z z 是编码器卷积的输出, e e e 是编码器的嵌入。编码器输出表征了潜在的、大量的输入上下文,注意力权重 a i , j a_{i,j} ai,j 提供有关特定输入元素的点信息,在进行预测时很有用。
计算出条件输入 c i c_{i} ci 后,只需将其添加到相应解码器层 h i h_{i} hi 的输出中,即可获得预测的输出。
In the Transformer this is reduced to a constant number of operations, albeit at the cost of reduced effective resolution due to averaging attention-weighted positions, an effect we counteract with Multi-Head Attention.
之前的基于卷积、循环等模型在处理位置相距较远的信息时候会增加计算量。在作者提出的 transformer 中,句子中相距较长的内容实体之间的关系的计算操作次数降低到了 恒定数值 。自注意力机制会计算一个注意力得分矩阵,这个矩阵的大小是固定的,与输入序列的长度无关(与嵌入维度 d e m b d_{emb} demb 有关)。因此,即使输入序列的长度增加,计算注意力得分所需的操作数也不会增加,这使得 transformer 模型在处理长序列时具有更高的效率和扩展性。因为对长的关系也进行相同次数的计算,就会导致每次计算并没用充分考虑内容的信息,因此作者提出“这样会导致分辨率较低”,因此作者继续设计了 多端注意力机制(Multi-head attention) 来弥补这样的过程。
自注意力(Self-attention)(有时称为内部注意力 inner-attention)是一种将单个序列的不同位置相关联的注意力机制,以便计算序列的表征。自注意力已成功应用于各种任务,包括阅读理解、抽象概括、文本蕴涵和学习任务无关的句子表征。文本蕴涵是自然语言处理中的一个重要概念,指的是一个文本的含义是否可以从另一个文本中推断出来。在文本蕴涵任务中,通常会有一个前提文本和一个假设文本,任务是判断假设文本是否可以从前提文本中推断出来。这个任务对于许多NLP应用程序如问答系统、信息检索和对话系统等都非常重要。文本蕴涵可以帮助计算机理解文本之间的逻辑关系,从而提高自然语言处理系统的性能和准确性。
端到端内存网络基于循环注意力机制,并且已被证明在简单语言问答和语言建模任务上表现良好。
End to end Memory Network 端到端内存网络介绍
该架构的第一部分有助于找到查询的相关句子。首先将问题(Question,也成为询问 query) q q q 内的每一个单词转换为大小为 V V V 的向量( V V V 是所使用词库的大小)。使用词袋模型或嵌入 B B B ,将向量转换为大小为 k × V k\times V k×V 的词嵌入。最终将该嵌入称为 u u u ,且 u = embed B ( q ) u=\text{embed}_{B}(q) u=embedB(q) 。与上面的方法类似,文章内的每个句子都被解析,然后使用嵌入 A A A 编码为大小为 k × V k\times V k×V 的嵌入,因此有 m i = embed A ( x i ) m_{i}=\text{embed}_{A}(x_{i}) mi=embedA(xi) 其中 x i ∈ X x_{i}\in X xi∈X。此时模型已经将文章句子集合 X X X 和询问问题 q q q 都做了嵌入。计算询问问题嵌入 u u u 和每个文章句子集合 X X X 嵌入 m i m_{i} mi 之间的内积,然后进行 softmax 运算,以找到最佳匹配。
p i = softmax ( u T m i ) p_{i}=\text{softmax}(u^{T}m_{i}) pi=softmax(uTmi)
在第二部分中,将计算查询 q q q 的最终答案。再次使用嵌入 C C C 将文章句子集合 X X X 的句子 x i x_{i} xi 编码为嵌入 c i = embed C ( x i ) c_{i}=\text{embed}_{C}(x_{i}) ci=embedC(xi)。使用前一部分中的概率向量 p i p_{i} pi 将计算输出如下。
o = ∑ i p i c i o=\sum\limits_{i} p_{i}c_{i} o=i∑pici
在矩阵 W W W 的帮助下,通过 a ^ = softmax ( W V × K ( o + u ) ) \hat{a}=\text{softmax}(W_{V\times K}(o+u)) a^=softmax(WV×K(o+u)) 得出输出预测结果。 o + u o+u o+u 本身就是一种残差连接。
与 LSTM 一样,为了提高结果的准确性,可以增加结构的复杂性,使其包括多个层。
The Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence aligned RNNs or convolution.
作者对上面的四个网络都进行了简单的综述,我在这里进行的详细的介绍,主要是展示这些提出的古早模型与接下来提出的 transformer 之间的关系。这里又再次强调了作者提出的 transformer 完全依赖于自注意力计算输入序列和输出序列的表征,而完全没有依赖于循环神经网络或卷积神经网络。
3 Model Architecture
大多数可以涨点的神经序列转导模型都具有编码器-解码器结构。编码器将由符号(自然语言单词、字符等)表示的输入序列 { x } = ( x 1 , ⋯ , x n ) \{x\}=(x_1, \cdots, x_n) {x}=(x1,⋯,xn) 映射到连续表征向量 z ⃗ = ( z 1 , ⋯ , z n ) \vec{z} = (z_1, \cdots, z_n) z=(z1,⋯,zn) 。给定表征向量 z ⃗ \vec{z} z,解码器每次生成一个位置的输出序列符号 ( y 1 , ⋯ , y m ) (y_1, \cdots, y_m) (y1,⋯,ym) 。在每个步骤中,模型都是自回归的,在生成下一个时将先前生成的符号用作附加输入。Transformer 的特点:堆叠注意力机制、”point-wise“的——通常意味着操作是局部的、独立的,不涉及跨位置的交互,以及编码器和解码器同时存在。
3.1 Encoder and Decoder Stacks
The encoder is composed of a stack of N = 6 N = 6 N=6 identical layers. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple, position wise fully connected feed-forward network. We employ a residual connection around each of the two sub-layers, followed by layer normalization. That is, the output of each sub-layer is LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x)) LayerNorm(x+Sublayer(x)) , where Sublayer ( x ) \text{Sublayer}(x) Sublayer(x) is the function implemented by the sub-layer itself. To facilitate these residual connections, all sub-layers in the model, as well as the embedding layers, produce outputs of dimension d m o d e l = 512 d_{model} = 512 dmodel=512 .
编码器由 N = 6 N = 6 N=6 相同编码层堆叠组成。每个编码层有两个编码子层。第一个编码子层是多头自注意力机制,第二种是简单的、位置级的全连接前馈网络(FFNN)。每个编码子层的周围都使用残差连接(先),然后进行层归一化(后)。也就是说,每个编码子层的输出是 LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x)) LayerNorm(x+Sublayer(x)) ,其中 Sublayer ( x ) \text{Sublayer}(x) Sublayer(x) 是编码子层本身实现的功能,即要么是多头注意力、要么是FFNN。为了强化残差连接,模型中的所有编码子层以及嵌入层都使用维度为 d m o d e l = 512 d_{model} = 512 dmodel=512 的宽度输出。
The decoder is also composed of a stack of N = 6 N = 6 N=6 identical layers. In addition to the two sub-layers in each encoder layer, the decoder inserts a third sub-layer, which performs multi-head attention over the output of the encoder stack. Similar to the encoder, we employ residual connections around each of the sub-layers, followed by layer normalization. We also modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions. This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i i i can depend only on the known outputs at positions less than i i i.
解码器也由相同的 N = 6 N = 6 N=6 个解码层堆叠组成。除了与每个编码层中的两个编码子层相同之外,解码器还插入第三个解码子层,该解码子层对堆叠编码器的最终输出执行多头注意力。与编码器类似,在每个解码子层周围采用残差连接,然后进行层归一化。还修改了堆叠解码器中的自注意力编码子层,以防止位置关注后续位置。这种掩码与输出嵌入偏移一个位置这两件事相结合,确保位置 i i i 的预测只能依赖于小于 i i i 的位置处的已知输出。
3.2 Attention
An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.
注意力函数可以描述为将询问(query)和一组键(key)值(value)对映射到输出(output),其中询问(query)、键(key)、值(value)和输出(output)都是向量。输出被计算为值(value)的加权和,其中分配给每个值(value)的权重是由询问(query)与相应键(key)的兼容性函数计算的。
3.2.1 Scaled Dot-Product Attention: “缩放点积注意力”
输入由维度 d k d_k dk 的 query 和 key 以及维度 d v d_v dv 的 value 组成。使用所有 key 计算 query 的点积,并除以 d k \sqrt{d_k} dk ,然后应用 softmax 函数来获取计算 value 的权重。在实践中,同时计算一组 query 的注意力函数,将其打包到矩阵 Q Q Q 中。Key 和 value 也打包到矩阵 K K K 和 V V V 中,结果计算为:
Attention ( Q , K , V ) = softmax ( Q ( L , d k ) K ( d k , L ) T d k ) V ( L , d v ) \text{Attention}(Q,K,V)=\text{softmax}(\frac{Q_{(L,d_{k})}K^{T}_{(d_{k},L)}}{\sqrt{d_{k}}})V_{(L,d_{v})} Attention(Q,K,V)=softmax(dkQ(L,dk)K(dk,L)T)V(L,dv)
两个最常用的注意力函数是加法注意力函数和点积(乘法)注意力函数。点积注意力与论文算法相同,只是比例因子为 1 d k \frac{1}{\sqrt{d_{k}}} dk1。加法注意力使用单个隐藏层的前馈网络计算兼容性函数。虽然两者在理论上的复杂性相似,但点积注意力在实践中要快得多,空间效率也高得多,因为它可以使用高度优化的矩阵乘法代码来实现。虽然对于较小的 d k d_k dk 值,两种注意力函数的表现相似,但加法注意力函数优于点积(乘法)注意力函数,导致而无需针对较大的 d k d_k dk 值进行缩放。对于较大的 d k d_k dk 值,点积的幅度会变大,从而将 softmax 函数推入梯度极小的区域。为了抵消这种影响,将点积缩放 1 d k \frac{1}{\sqrt{d_{k}}} dk1。
3.2.2 Multi-Head Attention
与其使用 d m o d e l d_{model} dmodel 维度的 key 、 value 和 query 执行单次注意力函数的计算,不如将 query 、 key 、 value 用不同线性投影层投影 h h h 次,投影到相同的 d k d_k dk 、 d k d_k dk 和 d v d_v dv 维度。对 query 、 key 、 value 的每个投影层并行执行注意力函数,产生 h h h 个 d v d_v dv 维输出值。多头注意力允许模型关注来自不同表征子空间的表征信息。
MultiHead ( Q , K , V ) = Concat ( head 1 , ⋯ , head h ) W O where head i = Attention ( Q W Q i , K W K i , V W V i ) W Q i ∈ R d m o d e l × d k , W K i ∈ R d m o d e l × d k , W v i ∈ R d m o d e l × d k , W O ∈ R h d V × d m o d e l \begin{align} \text{MultiHead}(Q, K, V ) = \text{Concat}(\text{head}_{1}, \cdots, \text{head}_{h})W_{O} \\ \text{where}\ \text{head}_{i} = \text{Attention}(QW^{i}_{Q}, KW^{i}_{K}, VW^{i}_{V})\\ W^{i}_{Q}\in R^{d_{model}\times d_{k}}, W^{i}_{K}\in R^{d_{model}\times d_{k}}, W^{i}_{v}\in R^{d_{model}\times d_{k}}, W_{O}\in R^{hd_{V}\times d_{model}} \end{align} MultiHead(Q,K,V)=Concat(head1,⋯,headh)WOwhere headi=Attention(QWQi,KWKi,VWVi)WQi∈Rdmodel×dk,WKi∈Rdmodel×dk,Wvi∈Rdmodel×dk,WO∈RhdV×dmodel
d m o d e l = 512 d_{model}=512 dmodel=512 是嵌入维度,使用 h = 8 h=8 h=8 个端,且 d k = d v = 64 d_{k}=d_{v}=64 dk=dv=64 。由于每个端的维度减少,总计算成本与全维度的单端注意力相同。
3.2.3 Applications of Attention in our Model
在用于计算“编码-解码注意力机制”的解码子层中,query 来自先前的解码子层(该解码子层是计算自注意力机制的),而 key 和 value 来自编码器的输出。这允许解码器中的每个解码层都关联输入序列中的所有位置。这就很像之前提到的端到端记忆力网络了,拿 Question 来查询文章句子集合中的句子。
编码器包含计算自注意力的编码子层。在计算自注意力的编码子层中,所有 key 、 value 和 query 都来自同一位置(同一个内容),也就是编码器中前一编码层的输出。编码器中的每个位置可以关注编码器上一编码层中的所有位置。类似地,解码器中的计算自注意力的解码子层允许每个位置关注当前位置之前的所有位置,因此需要保持解码器中的信息向左流动以保留自回归特性。主要做法是在缩放点积注意力的内部通过屏蔽输入进 softmax 的内容(设置数值为 − ∞ −\infty −∞ )来实现。简单一句话就是:解码器内计算自注意力需要增加掩码。
3.3 Position-wise Feed-Forward Networks
除了注意力子层之外,每个编码层和解码层中都包含一个FFNN,该网络对每个元素的计算单独且相同。FFNN由两个线性层组成,中间有一个 ReLU 激活函数。
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x)=\max(0,xW_{1}+b_{1})W_{2}+b_{2} FFN(x)=max(0,xW1+b1)W2+b2
虽然不同位置的FFNN是相同的,但它们在FFNN之间使用不同的参数,也就是FFNN也是参与训练的。另一种描述方式是内核大小为 1 的两个卷积(卷积核为1也可以当作一个线性层处理)。输入和输出的维度为 d m o d e l = 512 d_{model} = 512 dmodel=512 ,内层的维度为 d f f = 2048 d_{ff} = 2048 dff=2048 。
3.4 Embeddings and Softmax
使用相同的、训练后的嵌入模型将每个输入 token 和输出 token 转换为维度是 1 × d m o d e l 1\times d_{model} 1×dmodel 的向量。
使用常规的线性层和 softmax 激活函数将解码器输出转换为预测的下一个 token 概率。
3.5 Positional Encoding
由于 transformer 不包含循环模块和卷积模块,为了让模型能感受到序列的顺序(而非是无序的一组长向量输入),必须注入一些关于序列中 token 的相对或绝对位置的信息。在编码器和解码器堆栈底部的源句子和目标句子输入嵌入中添加了“位置编码”。位置编码与嵌入具有相同的维度 d m o d e l d_{model} dmodel ,因此两者可以相加。位置编码有很多选择,包括通过参数学习得到的位置编码和固定的位置编码算法。Transformer 使用正弦余弦位置编码。
{ P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i d m o d e l ) P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i d m o d e l ) \begin{cases} PE_{(pos,2i)}&=\sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}}) \\ PE_{(pos,2i+1)}&=\cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}}) \\ \end{cases} ⎩ ⎨ ⎧PE(pos,2i)PE(pos,2i+1)=sin(10000dmodel2ipos)=cos(10000dmodel2ipos)
其中 p o s pos pos 是位置, i i i 是维度。也就是说,位置编码的每个维度都对应于一个正弦曲线(当维度确定时,位置编码就是位置的正弦/余弦函数)。波长形成从 2 π 2\pi 2π 到 10000 ⋅ 2 π 10000\cdot 2\pi 10000⋅2π 。这样的位置编码允许 transformer 很容易地通过相对位置来学习,因为对于任何固定偏移量 k k k , P E ( p o s + k , 2 i ) PE_{(pos+k,2i)} PE(pos+k,2i) 都可以表示为 P E ( p o s , 2 i ) PE_{(pos,2i)} PE(pos,2i) 的线性函数。这里具体参考这个博客。
作者尝试使用训练后的位置编码模型,发现这两个版本产生几乎相同的结果。选择正弦版本,因为它可以允许 transformer 推断出比训练期间遇到的序列长度更长的序列。
4 Why Self-Attention
在本节中,作者在映射一个可变长序列符号表征到另一个等长序列任务上,从各个方面比较自注意机制与循环模块、卷积模块,好比在一个典型的序列转导中编码器或解码器一个隐藏层。
主要包括三个层面:每层的总计算复杂度;可并行的计算量,由所需的最小顺序操作数来衡量;网络中计算长距离关联之间的路径长度。学习长距离依赖是许多序列转导任务中的一个关键挑战。影响学习长距离依赖能力的一个关键因素是前向和后向信息在网络中必须经过的路径的长度。输入和输出序列中的任意两两位置之间的信息走行路径越短,学习长距离依赖就越容易。
首先,作者对计算复杂度做了对比。这里对 transformer 的自注意力机制做分析:这里强调的只是自注意力机制,而不考虑 Q Q Q 、 K K K 和 V V V 的获得。根据公式: attention ( Q , K , V ) = softmax ( Q ( L , d k ) K ( d k , L ) T d k ) V ( L , d v ) \text{attention}(Q,K,V)=\text{softmax}(\frac{Q_{(L,d_{k})}K^{T}_{(d_{k},L)}}{\sqrt{d_{k}}})V_{(L,d_{v})} attention(Q,K,V)=softmax(dkQ(L,dk)K(dk,L)T)V(L,dv) , Q Q Q 矩阵的每一行都乘以 K K K 矩阵的转置,那么每一行就计算了 d k × L d_{k}\times L dk×L 次计算,那么整个 Q Q Q 矩阵总共进行了 L × d k × L = L 2 ⋅ d = n 2 ⋅ d L\times d_{k}\times L=L^{2}\cdot d=n^{2}\cdot d L×dk×L=L2⋅d=n2⋅d 次计算。softmax 之后右乘 V V V 矩阵也是类似 Q Q Q 、 K K K 的矩阵乘法,那么总共就是 2 ⋅ n 2 ⋅ d 2\cdot n^{2}\cdot d 2⋅n2⋅d 次计算,忽略系数则计算复杂度就是 O ( n 2 ⋅ d ) O(n^{2}\cdot d) O(n2⋅d) 。具体参考这个StackOverflow。当序列长度 n n n 小于表征维度 d d d 时,自注意力机制比循环模块计算更快,这符合 word-piece 编码和 byte-pair 编码表征。Transformer 更能捕捉短句子中长依赖,而递归循环模块更适合处理长句子。当然,后续也有很多工作都在实现 transformer 处理更长的句子。为了提高涉及很长序列的任务的计算性能,自注意力机制可以限制为仅考虑输入序列中以相应输出位置为中心的大小为 r r r 的邻域,但是这会将最大路径长度增加到 O ( n / r ) O(n/r) O(n/r) 。
对 Sequential Operations 进行分析,这个好理解,对于自注意力机制和卷积操作,都是可以看成对一批数据进行并行计算(卷积操作可以理解成卷积对图像的操作),而对于递归循环层,必须要按序列顺序进行计算。所以只有递归循环的 Sequential Operations 是 O ( n ) O(n) O(n) 。具体参考这个博客。
Maximum Path Length 可以理解为元素之间的关联性。自注意力机制通过自己的算法实现元素之间都产生了关系(作者的解释是“所有元素之间两两连接”),而循环模块则没有,相隔 n n n 个元素信息就要传递 n n n 次。参考这个博客:maximum path length 可以理解为相距最远的两个信息结点发生沟通所需要的网络层数,而对于限制性自注意力机制(restricted self-attention)只与相邻的 r r r 个单元计算注意力,与步幅为 1 1 1 的卷积层有着相同的信息网络结构。需要的层数实际上是 ceiling [ n + 1 r ] \text{ceiling}[\frac{n+1}{r}] ceiling[rn+1] , ceiling \text{ceiling} ceiling 为向上取整函数。
内核宽度 k k k 小于序列长度 n n n 的单个卷积核不会连接所有输入和输出位置对,如果需要连接所有输入和输出位置对,则在连续内核的情况下需要一堆 O ( n / k ) O(n/k) O(n/k) 卷积层;在膨胀卷积的情况下需要 O ( log k ( n ) ) O(\log k(n)) O(logk(n)) (之前在 ByteNet 中阐述了),从而增加在网络中任意两个位置之间 maximum path length 。可分离卷积降低了复杂性,达到 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 ,可分离卷积的复杂度也等于自注意力层和前馈层的组合。也就是说,循环模块、卷积模块以及限制性自注意力机制在 maximum path length 中都跟序列长度相关,导致序列变长时 maximum path length 跟着变长。
我们观察到:每个注意力端不仅清楚地学习到执行不同的任务的能力,而且许多注意力端似乎表现出与句子的句法和语义结构相关的行为。
5 Training
5.1 Training Data and Batching
使用标准 WMT 2014 英语德语机器翻译大赛数据集进行训练,该数据集包含约 450 万个句子对。句子使用 byte-pair 字节对进行编码,该编码结果是产生了具有约 37000 个 token 的、源句子和目标句子共享的词汇表。使用更大的 WMT 2014 英语法语机器翻译大赛数据集,其中包含 3600 万个句子(比英德数据集多了 8 倍),句子同样使用 byte-pair 字节对进行编码,该编码结果是产生了具有约 32000 个 token 的、源句子和目标句子共享的词汇表。句子对按大致序列长度分批在一起。每个训练批次包含一组句子对,其中包含大约 25000 个源 token 和 25000 个目标 token 。
5.2 Hardware and Schedule
在一台配备 8 个 NVIDIA P100 GPU 的机器上训练模型(显存容量:16384MB,大约 16 GB,8 卡总共 128 GB)。对于使用整篇论文中描述的超参数的基本模型,每个训练步骤大约需要 0.4 秒。基础模型进行了总计 100000 步或 12 小时的训练。对于大型模型,每个训练步骤大约需要 1.0 秒;大型模型接受了 300000 步或 3.5 天的训练。
5.3 Optimizer
使用 Adam 优化器, β 1 = 0.9 \beta_{1} = 0.9 β1=0.9 , β 2 = 0.98 \beta_{2} = 0.98 β2=0.98 和 ϵ = 1 0 − 9 \epsilon= 10^{−9} ϵ=10−9 。
使用变化的学习率:这个变化学习率左边部分是训练步数的二次反比函数,右侧是正比例函数( w a r m u p _ s t e p s warmup\_steps warmup_steps 保持不变的话),那么使用这个学习率在训练前期使用后者变化学习率,学习率随训练步数正比例上升;到后期使用前者学习率,学习率随训练步数二次反比例下降。临界点就是 s t e p _ n u m = w a r m u p _ s t e p s = 4000 step\_num = warmup\_steps = 4000 step_num=warmup_steps=4000 。
l r a t e = min ( 1 s t e p _ n u m , s t e p _ n u m w a r m u p _ s t e p s ) d m o d e l lrate = \frac{\min(\frac{1}{\sqrt{step\_num}}, \frac{step\_num}{\sqrt{warmup\_steps}})}{\sqrt{d_{model}}} lrate=dmodelmin(step_num1,warmup_stepsstep_num)
5.4 Regularization
残差 Dropout
将 dropout 正则化应用于每个编码子层和解码子层的输出——将其添加到每个编码子层和解码子层输入并进行归一化。将 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 的标签平滑技术。这会损害困惑度,因为模型会变得更加不确定,但会提高准确性和 BLEU 分数。
补充知识:标签平滑技术
Label Smoothing is a regularization technique that introduces noise for the labels. This accounts for the fact that datasets may have mistakes in them, so maximizing the likelihood of log ( y ∣ x ) \log(y|x) log(y∣x) directly can be harmful. Assume for a small constant ϵ \epsilon ϵ , the training set label y y y is correct with probability 1 − ϵ 1−\epsilon 1−ϵ and incorrect otherwise. Label Smoothing regularizes a model based on a softmax with k k k output values by replacing the hard 0 and 1 classification targets with targets of ϵ k − 1 \frac{\epsilon}{k-1} k−1ϵ and 1 − ϵ 1−\epsilon 1−ϵ respectively.
标签平滑是一种为标签引入噪声的正则化技术。这说明了数据集可能存在错误的事实,因此直接最大化 log ( y ∣ x ) \log(y|x) log(y∣x) 的可能性可能是有害的。假设对于一个小常数 ϵ \epsilon ϵ ,训练集标签 y y y 正确的概率为 1 − ϵ 1−\epsilon 1−ϵ ,否则不正确。标签平滑把输出的 k k k 个目标从原来的硬 0 和 1 分类目标进行替换,对模型进行基于 softmax 正则化,分别为 ϵ k − 1 \frac{\epsilon}{k-1} k−1ϵ 和 1 − ϵ 1−\epsilon 1−ϵ 。用公式表示如下。 N N N 表示模型输出的最大内容。
1 = ( k − 1 ) ⋅ ϵ k − 1 + ( 1 − ϵ ) = ϵ + 1 − ϵ = 1 , k ≤ N 1=(k-1)\cdot \frac{\epsilon}{k-1}+(1-\epsilon)=\epsilon+1-\epsilon=1,k\le N 1=(k−1)⋅k−1ϵ+(1−ϵ)=ϵ+1−ϵ=1,k≤N
6 Results
6.1 Machine Translation
在 WMT 2014 英语德语翻译任务中,大型 transformer 模型比之前报道的最佳模型(包括集成版本)超过 2.0 BLEU,以 BLEU 分数是 28.4 的结果建立了一个新的、最先进的模型。即使是基础模型也超过了之前发表的所有模型和集合版本,而训练成本只是任何竞争模型的一小部分。训练成本比其他模型低了 1 至 2 个数量级。大的英语法语翻译模型在 dropout 正则化中使用了更高的正则化率, P d r o p = 0.3 P_{drop} = 0.3 Pdrop=0.3 。
对于基本模型,使用通过平均最后 5 个检查点获得的单个模型,这些检查点以 10 分钟的间隔获得一次。对于大型模型,对最后 20 个检查点进行了平均。使用集束搜索,波束尺寸为 4 ,长度损失 α = 0.6 \alpha=0.6 α=0.6 。这些超参数是在开发集上进行试验后选择的。
在推理过程中将最大输出长度设置为输入长度 + 50 + 50 +50 ,但尽可能提前终止。感觉就是同样一个意思,英语、法语和德语的表达单词数量应该差不多,那么 + 50 + 50 +50 是更像是保证它尽可能翻译完。
补充知识:集束搜索 beam search
参考这个博客。定义:Beam search is an approximate search algorithm commonly used in natural language processing. It is applicable to any problem that involves search, which gives it broad applicability. It balances time and memory usage with the quality of its final answer by only ever keeping the top k solution candidates in memory at a time and choosing the best result found at the end of the search. 集束搜索是自然语言处理中常用的近似搜索算法。它适用于任何涉及搜索的问题,具有广泛的适用性。它通过一次在内存中只保留前 k k k 个候选解决方案,并在搜索结束时选择找到最佳结果,来平衡时间、内存使用与最终答案的质量。在高层次上,从某个搜索空间的起始状态开始,生成所有可能的后继状态,收集起来记为 S 1 S_{1} S1 ,并只保留“最佳” k k k 个候选状态: s 1 ; 0 ⋯ s 1 ; k − 1 ∈ S 1 s_{1;0}\cdots s_{1;k-1}\in S_{1} s1;0⋯s1;k−1∈S1 。然后,为这些 k k k 个状态生成所有后继状态,并把这些状态收集起来记为 S 2 S_{2} S2 ,再次只保留这些选项中的前 k k k 个状态 s 2 ; 0 ⋯ s 2 ; k − 1 ∈ S 2 s_{2;0}\cdots s_{2;k-1}\in S_{2} s2;0⋯s2;k−1∈S2 ,依此类推。搜索结束后,就选择迄今为止找到的最佳搜索结果。
这就留下了两个问题:如何决定哪些状态是“最佳”,以及算法何时终止?需要某种状态评估函数(这里借用强化学习的状态函数 V ( s ) V(s) V(s) )。当寻找一个最终目标状态时,这个函数可以是一个启发式函数,用来估计当前状态离目标状态有多近。其他函数试图以更客观的意义上衡量状态的整体质量。当试图找到某个概率最高的状态时,状态评估函数会估计一个状态的可能性。此示例在文本生成中用于搜索高概率词序列。
集束搜索具有许多可能的终止条件。也许最简单的方法是,在达到终止或目标状态后立即停止。但并非所有问题都有这样的预定义状态(再用强化学习的表述就是并非所有任务都是 goal-conditioned),即使有,也可能希望继续搜索以找到实现目标的更好路径。一旦达到某个最大搜索深度,可以采取停止。另一个常见的解决方案是,当状态的质量看起来不再显着提高时(状态估计收敛),使用一些启发式方法停止。
集束搜索最重要的用途也许是在自然语言处理中。语言模型为单词和单词序列分配概率。特别是,它们经常用于下一个单词预测,这涉及根据前面的所有单词来猜测下一个单词应该是哪个。重复此过程以生成整个句子或更多句子。
使用 k k k 个集束运行集束搜索通常比运行 k k k 个单独的搜索更有效。相关地,集束搜索是高度可并行化的,可以在单独的处理器上并行运行不同的集束,从而显着加快搜索速度。集束宽度 k k k 是可配置的,可以轻松调整希望专用于搜索过程的时间和内存预算。由于内存中一次只有 k k k 个解决方案,因此如果可用内存较多,则可以增加 k k k ;如果可用内存很少,则可以减少 k k k 。
但是,集束搜索是一个不完整的算法,这意味着它不能保证找到最佳解决方案,或者任何解决方案。当搜索空间中的某些分支看起来不再有希望时,它会放弃它们,如果这些分支实际上是通往最佳解决方案的唯一途径,那么它将永远无法找到所述解决方案。此外,集束搜索可能会卡在局部最优值(陷入局部最小的情况)。该算法可能会发现自己处于一种状态,即任何局部更改都会使解决方案变得更糟,并且只有相对较长的一系列步骤才能使其变得更好。如果每个中间步骤对启发式评估函数来说都很糟糕,那么集束搜索将不会探索这些路径。可以随机而不是确定性地选择后继状态(当然,优先考虑得分较高的状态)以鼓励探索。此外,可以对与已经包含的候选状态过于相似的候选状态进行惩罚,这需要对状态相似性进行某种程度的衡量。
细节:随着在空间中搜索得更深,每个状态出现的概率会降低,因为集束搜索会连续地将状态之间的概率相乘。这通常会导致集束搜索更喜欢短序列而不是长序列,这可能是不可取的。为了避免这个问题,经常根据状态对应的序列长度对状态的概率进行归一化。为了实现这一点,首先取每个概率的对数,这在机器学习中是相当标准的;然后我们除以序列的长度。因此,我们搜索具有最高平均对数概率的序列,这显着减少了长答案的惩罚。
补充知识:模型的集成
参考这个博客。集成模型是一种在预测过程中结合多个其他模型的机器学习方法。这些模型被称为基本估计器。集成模型是克服单个估计器存在的以下问题:1. 高方差:单个估计器对所学习特征的输入非常敏感;2. 准确性低:适应整个训练数据集的一种模型或一种算法可能不足以满足预期;3. 特征噪声和偏差:模型在进行预测时严重依赖一个或几个特征。
单一算法可能无法对给定的数据集做出完美的预测。机器学习算法有其局限性,生成高精度模型具有挑战性。如果我们构建并组合多个模型,整体准确性可能会得到提高。这种组合可以通过聚合每个模型的输出来实现,其目标有两个:减少模型误差并保持其泛化性。
6.2 Model Variations
这一部分主要是消融实验,为了评估 transformer 不同组件的重要性,以不同的方式改变基础模型,在 2013 年的英语德语机器翻译开发集研究性能变化。使用了前一节所述的波束搜索,但没有进行检查点平均。改变的点在于注意力端的数量、键和值维度,在变化中始终保持计算量不变。得到的结论是:单端注意力机制比最好的参数设定差 0.9 BLEU,且机器质量也会下降。
6.3 English Constituency Parsing
为了评估 transformer 是否可以推广到其他任务,采用英语选区解析任务进行了实验。这项任务的挑战是:输出受到强大的结构约束,并且明显长于输入。基于循环神经网络的序列处理模型尚未能够在小数据情况下获得很好的结果。
在 Wall Street Journal 部分用 d m o d e l = 1024 d_{model}= 1024 dmodel=1024 训练了一个 4 层 transformer ,大约 4 万个训练句子。在 Wall Street Journal 的参数设置中使用了 16 k 16k 16k token 的词汇。在半监督学习的设置下对模型进行了训练,使用了更大的、高置信度的 Berkley Parser corpora ,来自大约 1700 万个句子,使用了 32 k 32k 32k token 的词汇。在推理过程中,将最大输出长度增加到输入长度 + 300 + 300 +300 ,仅对 Wall Street Journal 和半监督设置都使用了 21 和 α = 0.3 α = 0.3 α=0.3 的集束尺寸。
作者得到的结论是:尽管缺乏特定任务的调优, transformer 模型仍然表现良好,除了 Recurrent Neural Network Grammar 外,产生了比之前报道的所有模型更好的结果。
7 Conclusion
在这项工作中,作者提出了 transformer ,第一个完全只基于注意力机制的序列转导模型,用多端自注意力机制取代了编解码器结构中最常用的循环模块。对于翻译任务, transformer 的训练速度可以比基于循环模块或卷积模块的架构要快得多。在 WMT 2014 英语德语机器翻译和 WMT 2014 英语法语翻译翻译任务中,展现了新的模型。在前一项任务中,最好的模型甚至优于所有之前报道的模型以及集成版本。
作者计划将 transformer 扩展到涉及文本以外的输入和输出模态的问题,并研究局部的、受限的注意力机制,以有效地处理大型输入和输出,如图像、音频和视频。
附录部分主要展示不同端下注意力机制到底关注了什么。