庖丁解牛式读《Attention is all your need》

我的观点废话

弄清楚Transformer模型内部的每一个细节尤为重要
attention机制首次被应用在nlp领域是在 2015年的一篇论文中:《Neural Machinie Translation by Jointly Learing to Align and Translate》
这篇论文是transformer机制的首次提出,但并非是Attention机制的首次提出。所以我觉的文章是不是改成《Transfomer:Attention is all your need》会更好呢?
本博文part1部分【section 0~7】是对源论文的翻译;part2部分【section 8】是对原论文中的一些问题进行释疑。
本博文中英混注(我实在无力将有些句子&词翻译出来),不习惯的可以关网页撒~

part 1. 《Attention is all your need》翻译
0.摘要

主流的序列推导模型(sequence transduction model)【后面答疑部分会解释什么是sequence transduction model】是基于复杂的 RNN 或者 CNN 网络的,这些网络都包含encoder 和 decoder 两个部分。性能最好的模型同样是通过注意力机制(attention mechanism)连接 encoder 和 decoder【这句话也能侧面说明Attention机制很早前就提出来咯】。我们提出一个新型、简单的网络结构 —— Transformer,它仅仅基于注意力机制,而不用RNN和CNN。当要求并行化且更少的时间去训练模型时,我们的(这个基于transformer的)模型在两个机器翻译任务上的实验证明这些模型【这里的“这些”指的是两个机器翻译任务上的两个模型,但本质上应该还是一个】在性能上更优。在WNT 2014 英转德翻译任务上,我们的模型达到了28.4的BLEU值 ,超越了当前的最佳结果,包括ensembles【后面答疑部分会解释何为ensemble】,都超过2个BLEU值。在使用8个GPU训练3.5天后(这仅仅是参考文献中最好模型的一小部分时间),我们的模型在WMT2014英转德翻译任务中,创立一个新的单模型SOTA的BLEU分数—41.8。我们将Transformer 成功地应用于具有大量和有限训练数据的English constituency parsing【这里的English constituency parsing到底怎么理解? 见后答疑部分】,证明它可以更好的推广到其它任务中。

1.介绍

RNN,特别是LSTM 以及GRNN(gated recurrent networks),在 序列建模(sequence modeling) 和转导问题中(如语言建模和机器翻译)已经被牢固地确立为最先进的方法。此后,无数的努力去不断推动循环语言模型和encoder-decoder结构边界。

递归模型沿着输入和输出序列的符号位置进行【这里其实为后文埋下了伏笔,表意是描述递归模型,但实指出递归模型的弊端:顺序处理,无法并行】。【原文:Recurrent models typically factor computation along the symbol positions of the input and output sequences.】在计算时间中,将位置与步骤配齐,它们产生一系列隐藏状态

hth_t

ht​,作为一个之前的隐层状态

ht1h_{t-1}

ht−1​ 以及输入位置t的函数【原文:Aligning the positions to steps in computation time, they generate a sequence of hidden states

hth_t

ht​,as a function of the previous hidden state

ht1h_{t-1}

ht−1​ and the input for position t

这种内在的序列特性阻碍训练样本的并行化,然而(并行化)在长序列(训练)中就变得十分关键,因为内存大小限制了批处理的规模。最近的工作通过分解任务和条件计算在计算效率上取得了明显提升, 同时,也提高了后者的模型性能。然而序列计算的基础限制依然存在

在各种引人注目的的序列建模和推导模型中,注意力机制已经变成一个密不可分的部分,允许建立依赖关系的模型,而不用在意它们(指的是句子中的各个词)在输入和输出序列的距离。然而,除了少数情况,这样的注意力机制大多数与递归网络一起使用。

在这篇论文里,我们提出Transformer,一种避开了递归、完全依赖注意力机制的模型结构,它(这种机制)可以获取输入输出间的全局依赖。Transformer允许显著的并行化,并且在8个P100GPUs 上仅仅训练了12小时之后就可以得到一个更优的翻译效果。

2.背景

减少序列计算(sequential computation)的目标也是Extended Neural GPU、ByteNet、以及ConvS2S等模型的基础,所有这些都是使用CNN作为基础块,对于所有的输入输出位置并行计算隐层表示。在这些模型当中,模型ConvS2S将任意输入输出信号联系起来要求操作的次数与这两者位置间的距离呈线性关系,而模型ByteNet则呈对数关系。 这使得学习远距离的依赖变得更加困难。然而在Transformer,这个复杂度被减至一个常数操作,尽管由于平均 attention-weighted 位置在以减少有效地解析为代价,但我们提出一种 Multi-head Attention(在3.2中讲到) 用于抵消这种影响。

自我注意(self-attention),有时也称为内部注意,是一个注意力机制,这种注意力机制:将单个句子不同的位置联系起来,用于计算一个序列的表示。 【原文:Self-attention, sometimes called intra-attention is an attention mechanism relating different positions of a single sequence in order to compute a representation of the sequence.】 自我注意已经被成功应用在个各种各样的任务中,诸如阅读理解,抽象总结,文本蕴含,以及学习独立任务的句子表示中。

端到端的记忆网络是基于递归注意力机制,而不是对齐序列递归,同时在单一语言问答系统以及语言建模任务中,端到端的网络已经被证明效果很好。

然而,据我们所知,Transformer 是第一个完全依赖于自我注意的推导模型。在接下来的部分中,我们将描述Transformer,自驱动的自我注意力机制,并且讨论它们的优缺点。

3.模型结构

大多数竞争性的神经序列推导模型有一个encoder-decoder结构。这里,encoder 将一个表示输入的字符序列

(x1,x2,...xn)(x_1,x_2,…x_n)

(x1​,x2​,…xn​)映射成另一种连续表征序列

Z=(z1,z2,...zm)Z=(z_1,z_2,…z_m)

Z=(z1​,z2​,…zm​)。 基于Z,decoder 将产生一个输出序列

Y=(y1,...ym)Y=(y_1,…y_m)

Y=(y1​,…ym​),每次产生一个元素。在模型的每个步骤都是自回归的 —— 消费之前产生的表征作为下次的输入。
Transformer 遵循了这种总体的架构:在encoder和decoder中都使用数层self-attentionpoint-wise,全连接层。相对的各个部分正如Figure 1中左右两部分描述的一样。
庖丁解牛式读《Attention is all your need》

3.1 Encoder and Decoder Stacks

Encoder
由6个相同的层叠加而成。每层又分成两个子层。第一层是multi-head self-attention机制,第二层则是简单的position-wise fully connected feed-forward network。在每个子层中,我们都使用残差网络,然后紧接着一个 layer normalization。也就是说:其实每个子层的实际输出是 LayerNorm(x+Sublayer(x)),其中Sublayer(x)是由sub-layer层实现的。为了简化这个残差连接,模型中的所有子层都与 embedding 层相同,输出的结果维度都是

dmodel=512d_{model}=512

dmodel​=512 。

Decoder
decoder 同样是由一个N=6个相同layer组成的栈。除了encoder layer中的两个子层之外,decoder 还插入了第三个子层,这层的功能就是:利用 encoder 的输出,执行一个multi-head attention。与encoder相似,在每个子层中,我们都使用一个残差连接,接着在其后跟一个layer normalization。为了防止当前位置看到后序的位置,我们同样修改了decoder 栈中的self-attention 子层。这个masking,是基于这样一种事实:输出embedding 偏移了一个位置,确保对位置i的预测仅仅依赖于位置小于i的、已知的输出。(原文: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 can depend only on the known outputs at positions less than i.)。
【那这个只能利用单词前面的词,不是明显存在缺点吗?也不是,或许在encoder中就已经捕捉到了上下文的信息】

注:

【如果N=6,那么得到的transformer结构就是:
庖丁解牛式读《Attention is all your need》只有最顶层的encoder 会把输出输入到各层的decoder中。】

3.2 Attention

一个Attention function 可以被描述成一个“映射query和一系列key-value对到输出”,其中query,keys,values,output 都是一个向量。 其中计算值的权值和得到输出,这些权值是由querys 和 keys通过 相关函数计算出来的。(原文: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就是没有复数形式】
庖丁解牛式读《Attention is all your need》

3.2.1 Scaled Dot-Product Attention

本文中使用的attention 被称作Scaled Dot-Product Attention(Figure 2)。输入包含了

dkd_k

dk​维的queries 和 keys,以及values 的维数是

dvd_v

dv​。 我们使用所有的values计算query的dot products,然后除以

dk\sqrt{d_k}

dk​​,再应用一个softmax函数去获得值的权重。【需要关注value在不同地方的含义。是key-value,还是计算得到的value?】

实际处理中,我们将同时计算一系列query 的 attention,并将这些queries 写成矩阵Q的形式。同样,将keys,values 同样打包成矩阵K和矩阵V。我们计算公式如下:

Attention(Q,K,V)=softmax(QKTdk)V
Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V

Attention(Q,K,V)=softmax(dk​​QKT​)V
最常用的的attention 是 additive attentiondot-product(multiplicative) attention。除了使用放缩因子

1dk\frac{1}{\sqrt{d_k}}

dk​​1​之外,本文中使用的算法与Dot-product attention算法完全一致。Additive attention 使用一个只有一层的前向反馈网络计算compatibility function。然而两者在理论复杂度上是相似的,实际上,dot-product attention更快些,且空间效率更高些,这是因为它可以使用高度优化的矩阵乘法代码来实现。

While for small values of dk the two mechanisms perform similarly, additive attention outperforms
dot product attention without scaling for larger values of dk [3]. We suspect that for large values of
dk, the dot products grow large in magnitude, pushing the softmax function into regions where it has
extremely small gradients 4 . To counteract this effect, we scale the dot products by

1dk\frac{1}{\sqrt{d_k}}

dk​​1​ .

3.2.2 Multi-Head Attention

与在

dmodled_{modle}

dmodle​维的keys,values 以及 queries执行单个 attention function相反,我们发现将queries, keys, values使用不同的、学习得到的投影,做h次线性投影, 分别投影到

dk,dk,dvd_k,d_k, d_v

dk​,dk​,dv​维度。(原文:we found it beneficial to linearly project the queries, keys and values h times with different, learned linear projections to $d_k$, $d_k$ and $d_v$ dimensions, respectively.)在得到的每个投影版本的queries,keys,values 的基础上,我们再并行执行attention function,产生维度为

dvd_v

dv​的输出值。 这些值被连接起来并再做一次映射,然后就生成了最后的值。如Figure 2所示。

Multi-head attention 允许模型从不同的位置的不同的表示空间中联合利用信息。(原文:Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions.) 如果只是单头attention ,那么平均将会抑制这种状况。

MultiHead(Q,K,V)=Concat(head1,....headh)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)
MultiHead(Q,K,V) = Concat(head_1,….head_h)W^O \\
where \space head_i = Attention (QW_i^Q,KW_i^K,VW_i^V)

MultiHead(Q,K,V)=Concat(head1​,….headh​)WOwhereheadi​=Attention(QWiQ​,KWiK​,VWiV​)

由于减少了每个头的维度,总得计算成本和单头的attention计算所有的维度的复杂度是相似的。

在本论文中,我们使用h = 8 个并行的 注意力层, 和头。对于这些,我们使用

dk=dv=dmodel/h=64d_k = d_v = d_{model}/h = 64

dk​=dv​=dmodel​/h=64。由于减少了每个头的维度,总得计算损失与单个完全维度的attention 是相似的。

3.2.3 Applications of Attention in our Model

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

encoder-decoder attention层, queries 来自之前的decoder层, 并且the memory keys and values来自encoder的输出。这就允许decoder每个位置上 去注意输入序列的所有位置。这模仿了seq2seq中经典的encoder-decoder注意力机制。
encoder包含 self-attention 层。在self-attention 层中,所有的keys ,values,以及queries 来自相同的位置——上一层encoder的输出。(当前层的)encoder中每个位置都能注意到上一层encoder的所有位置。
相同的, decoder栈中的self-attention 层允许decoder中的每个位置去注意decoder中所有的位置,(原文:Similarly, self-attention layers in the decoder allow each position in the decoder to attend to all positions in the decoder up to and including that position.

We need to prevent leftward information flow in the decoder to preserve the auto-regressive property. We implement this inside of scaled dot-product attention by masking out (setting to −∞) all values in the input of the softmax which correspond to illegal connections. See Figure 2.

3.3 position-wise Feed-Forward Networks

除了 attention sub-layers 【这里的attention sub-layers应该是一个名词】之外,encoder 和 decoder 的每层包含了一个全连接前馈网络,它分别相同地应用到每一个位置。这包含一个用ReLu做连接的两个线性转换操作。

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

FFN(x)=max(0,xW1​+b1)W2​+b2​
尽管不同的位置有着相同的线性转换,但是它们使用不同的参数从一层到另一层。另一种描述这个的方法是:可以将这个看成是两个卷积核大小为1的卷积。输入和输出的维度都是

dmodel=512d_{model}=512

dmodel​=512,同时,内部层维度是

dff=2048d_{ff}=2048

dff​=2048
【其实就是一个简单的FFN,没啥特别之处。搞不懂为啥要叫position wise】

3.4 Embedding and softmax

与序列推导模型相似,我们使用embeddings 去将 input tokens和 output tokens转换成维度是

dmodeld_{model}

dmodel​的向量,我们同时使用通常学习的线性转换和softmax 函数,用于将decoder 输出转换成一个可预测的接下来单词的概率。在我们的模型中:在两个embedding layers 和 pre-softmax 线性转换中共用相同的权重矩阵。在embedding layers,我们将这些权重乘以

dmodel\sqrt {d_{model}}

dmodel​

3.5 positional Encoding

因为我们的模型没有包含RNN和CNN,为了让模型充分利用序列的顺序信息,我们必须获取一些信息关于tokens 在序列中相对或者绝对的位置。为了这个目的,我们在encoder 和 decoder 栈底 加上了positional encodings到 input embeddings中。这个positional embeddingembedding有相同的维度

dmodeld_{model}

dmodel​。有许多关于positional ecodings的选择。

在本论文中,我们使用不同频率的sine 和 cosine 函数。公式如下:

PEpos,2i=sin(pos100002i/dmodel)PEpos,2i+1=cos(pos100002i/dmodel)
\begin{aligned}
PE_{pos,2i} = sin( \frac{pos}{10000^{2i/d_{model}}}) \\
PE_{pos,2i+1} = cos(\frac{pos}{10000^{2i/d_{model}}})
\end{aligned}

PEpos,2i​=sin(100002i/dmodel​pos​)PEpos,2i+1​=cos(100002i/dmodel​pos​)​
其中pos 是位置,i是维度。也就是说:每个位置编码的维度对应一个正弦曲线。波长形成了一个几何级数从2π 到 10000*2π。 选择这个函数的原因是:我们假设它让我们的模型容易学习到位置信息,因为对任何一个固定的偏移k,

PEpos+kPE_{pos+k}

PEpos+k​ 可以代表成一个

PEposPE_{pos}

PEpos​的线性函数。

We also experimented with using learned positional embeddings [9] instead, and found that the two
versions produced nearly identical results (see Table 3 row (E)). We chose the sinusoidal version
because it may allow the model to extrapolate to sequence lengths longer than the ones encountered
during training.

4.为什么要Self-Attention?

在这节中,我们将主要比较self-attention 层和RNN/CNN层,RNN、CNN层主要用于将一个变长的序列映射成另一个同等长 度的序列,这是encoder-decoder的传统任务(原文:In this section we compare various aspects of self-attention layers to the recurrent and convolutional layers commonly used for mapping one variable-length sequence of symbol representations (x1, ..., xn) to another sequence of equal length (z1, ..., zn), with xi , zi ∈ Rd , such as a hidden layer in a typical sequence transduction encoder or decoder.)。我们使用self-Attention主要基于如下三个优点:

一是每层的计算复杂度变小;
二是能并行计算的数目,这个数字是是由序列操作要求的最小数得到的。【什么是sequential operation? 见文章后半部分答疑区】
第三是网络中远程依赖关系之间的路径长度。学习长距离依赖是一个关键性挑战在许多序列推导任务中。 影响学习这种依赖能力的一个关键因素是:信号在遍历这个网络时,向前或向后的路径长度(原文: One key factor affecting the ability to learn such dependencies is the length of the paths forward and backward signals have to traverse in the network.)。输入输出序列任意两个位置的结合路径越短,那么学习到长距离的依赖就会越简单。因此,我们同时也比较了最长的距离:在由不同层的类型构成的网络中的任意两个输入输出位置。

正如在Table 1中显示的那样,一个self-attention层用一个常数级的序列执行操作连接了所有的位置,然而一个递归层(recurrent layer)却需要O(n)的序列操作(sequential operations)。在计算复杂度方面,self-attention 层是比recurrent layers 快,当序列长度n 小于表示维度d,而这恰恰又是在机器翻译中sentence representation 被sota模型最常使用的情形,诸如word-piece 以及byte-pair 表示。为了提升涉及到长句子任务的计算性能,self-attention 可以被设计成仅仅考虑一个在输入序列中以各个输出位置为中心的、大小为r的相邻窗口 。这将增加最大的路径长度到

O(n/r)O(n/r)

O(n/r)。这部分工作计划在未来完成~

A