Attention Is All You Need

该文是阅读Attention Is All You Need的笔记,用来记录自己的理解和思考,一来记录自己的学习历程,二来期待和大家讨论研究,共同进步。


0. 概述

现在主流的序列转换模型是基于包含一个编码器和解码器的复杂的循环或者卷积神经网络。表现最好的模型也是通过一个attention机制连接了编码器和解码器,这篇论文提出了一个简单的网络结构,Transformer。它仅仅基于attention机制,与循环和卷积完全分离。经过实验表现来看,这些模型质量上要更好,并行化程度更高,训练时间明显更短。而且Transformer在其他任务上也能表现得很好,无论是大量的还是受限的训练数据中,只要把它成功应用于英语组别分析就可以。

这部分提到了之前火热的RNN和CNN,这两个概念在之前本科的学习过程中有一定的了解,所以还好接受。此外,近两年应用广泛的attention机制是一个新概念,关于这部分的理解我会在另一篇论文学习博客里进行总结讲解。重头戏是Transformer,接下来继续解读该篇论文的其他部分,学习了解。

RNN,LSTM,尤其是GRNN,已经被确立为序列模型和转换问题的最先进的方法,比如语言建模和机器翻译。大量的努力已经把语言建模和编码解码结构的边界不断拓展。
循环模型通常把输入输出序列的标记位置的计算作为因子。在计算过程中对齐位置和步骤,他们生成了一系列隐藏状态ht,作为此前隐藏状态ht-1和t位置的输入的函数。这个固有的序列化的本质排除了训练样例的并行化,这一点在更长的序列长度上就变得非常关键了,因为记忆限制了例子中的批次。最近的研究已经通过因子分解和条件计算在计算效率上取得了显著的提升,与此同时在后者的情况下也提高了
模型的性能。但是序列化计算的根本的局限性还是存在的。
Attention 机制在许多任务中已经成为了序列模型和转换模型的一个必要部分,允许相关性的建模而不再考虑输入输出序列的距离。总之有一小部分情况下,attention机制会用在一个循环网络的连接部分。
在这篇论文中我们提出了Transformer,这是一个回避了循环的模型结构,取而代之的是完全依靠attention机制刻画输入和输出之间的依靠关系。Transformer允许明显更多的并行化,并且在8块P100的GPU上训练12个小时后在翻译质量上能够达到最先进的状态。

1. 模型结构

大部分有竞争力的神经序列传导模型都有一个编码器解码器结构。此处的编码器将一组标志为(x1, …, xn)映射为一个连续的序列(y1, …, ym)的标志,每次一个元素。模型的每一步都是自回归的,在形成下一个的时候,将之前形成的标志作为额外的输入。
Transformer 遵循这个整体结构,用自注意力和逐点的方法来完成,完全链接编码器和解码器,如下图左右两部分展示:
Attention Is All You Need 学习笔记

1.1 编码器和解码器栈

编码器:编码器是由一组N=6的相同的层组成的。每一层都有两个子层。第一个是多首部的自注意力机制,第二个是一个简单的,逐位置的,完全连接着前向反馈网络。这里在每两个子层周围使用了一个残差连接,跟着就是一个正则化层。每个子层的输出都是LayerNorm(x + Sublayer(x)),Sublayer(x)是子层自己实现的函数。为了促成这些残差链接,模型中所有的子层,还有嵌入层1,都产生维度d=512的输出。
解码器:解码器也是由一组N=6的相同的层组成的。除了每个编码层中的两个子层,解码器输入了第三个子层,它表现为编码层栈输出之上的多首部注意力。与编码器类似,在每个子层之间使用残差连接,再跟着一个正则化层。这里也需要修改在解码器栈中的自注意力子层来阻止当前位置进入到子序列的位置。这样的隐藏,和输出向量偏移一个位置的事实一样,都是为了确保位置i的预测仅仅依靠位置少于i的已知的输出。

1.2 Attention

一个attention函数可以描述为把一个问题和一串键值对映射为一个输出,这里的问题,键,值和输出都是向量。输出是这些值的加权求和,每个值的权重是通过问题和对应的键的适应性函数计算的。
Scaled Dot-Product Attention:输入由问题和dk维的键,dv维的值组成。用所有键计算问题的点积,再除以根号dk,再用一个softmax函数来得到值上的权重。事实上,是在一个问题集合上同时计算attention函数,一起打包成矩阵Q。键和值也打包成矩阵K和V。这样计算输出矩阵:
Attention Is All You Need 学习笔记
两个最普遍使用的attention函数是加性注意力,点积(乘法)注意力。点积注意力和这里的算法是相同的,除了缩放因子1/根号dk。加性注意力使用只有一个隐含层的前向反馈网络计算通用性函数。然而二者在理论上的复杂度是相似的,点积注意力实践中更快,空间影响更大,因为它可以用高度优化的矩阵乘法代码来实现。
然而对于dk的小值来说,两种机制效果相似,不把dk的值放大的话,加性注意力比点积注意力表现得更好。对于dk中的大值,点积注意力在数量上大大增长,把softmax函数推向梯度非常小的地方。为了解决这个影响,把点击用1/根号dk缩小。
Multi-Head Attention:不只是用一个有dm维度的键,值和问题的注意力函数,这里发现把问题,键,值的h倍分别线性投影到不同的,学习线性投影的dk,dk和dv维度是有好处的。这些问题,键,值的投影版本中的每一个都可以平行地在注意力函数中使用,得到dv维的输出值。这些东西连接在一起,再投影一次,得到最终的值,如下图所示:
Attention Is All You Need 学习笔记
多首部注意力允许模型与在不同的位置从不同的代表空间中的信息联合。一个注意力头部,取平均来抑制。
Attention Is All You Need 学习笔记
映射的就是这些参数矩阵,这里使用了h=8的平行注意力层,或者首部。所有这些,dk=dv=dm/h=64。由于每个头部减少了维度,所有的计算花销与用满维度的单个首部的注意力相同。
模型中attention的使用:Transformer用三种方式使用多首部注意力:
1: 在“编码器解码器注意力”层中,问题来自前面的解码层,记忆的键值来自与编码器的输出。这就让解码器的每个位置关注输入序列的所有位置。这模仿了序列到序列的典型的编码器解码器注意力机制。
2:编码器包含自注意力层。在自注意力层中所有的键,值和问题都来自相同的地方,在这种情况下,是在编码器中的之前的层的输出。编码器的每个位置可以就可以注意到编码器之前层的所有位置。
3:相似的,解码器中的自注意力层允许解码器中的每个位置注意解码器中的所有位置,上限包括那个地址。需要阻止解码器中左侧的信息流来保存自回归属性。在所放点击注意力中实现,通过隐藏输出所有softmax中输入的值,这些值与非法连接相对应。

1.3 按地址的前向反馈网络

除了attention子层,编码器解码器中的每层都包含一个全连接前向反馈网络,这分别同样地应用于每一个位置。包含了两个线性转化,其中有一个ReLU**。
Attention Is All You Need 学习笔记
然而线性转化在不同位置上是同样地,他们在层与层之间使用不同的参数。描述这个的另一种方式是就像两个核心大小为1的两个卷积。输入输出的维度是dm=512,内层的维度是dff=2048

1.4 Embeddings and Softmax

和其他序列传导模型相似,这里使用嵌入来把输入标记和输出标记转化为dm维的向量。用普遍学习的线性转化和softmax函数来把解码器的输出转化为预测的下一个标记的概率。模型中,在两个嵌入层和pre-softmax线性转化中使用的是相同的权重矩阵。在嵌入层,这些权重要乘以根号dm。

1.5 位置编码

因为模型不包含循环或者卷积,所以为了利用序列的顺序,必须要引进一些关于序列中的标记相对或者绝对位置的信息。最后,在编码器解码器栈的底部向输入向量增加位置编码。地址编码和向量维度相同,都为dm,所以两个可以直接相加。位置编码有许多选择,慢慢学习固定。
这里用的是不同频率的正弦和余弦函数:
Attention Is All You Need 学习笔记
pos是位置,i是维度。位置编码的每个维度对应一个正弦函数。波长形成一个从2π到10000*2π的几何进程。选择这个函数是因为它能够简单的学会关注相关的位置,对于任何固定的偏移k,PEpos+k可以代表PEpos的线性函数。
通过用学习过的位置向量做实验,发现两个版本的效果几乎一样,选择这个正弦的版本是因为它允许模型推断的序列要比训练中生成的更长。

2. 为什么要使用自注意力

这里对比了自注意力层和普遍用来把一个可变长度的标志序列代表(x1,…,xn)映射成另一个相同长度的序列(z1,…,zn)的循环层和卷积层,例如在一个典型序列传导的编码层和解码层中的一个隐藏层。有三点促使这里使用自注意力。
1:每层的整体计算复杂度。
2:可以并行化的计算数量,通过序列操作所需要的最小数字进行衡量的。
3:网络中长范围依赖的路径长度。学习长范围依赖是序列转化任务中的关键挑战。影响学习这种依赖能力的关键因素就是前向和反向信号需要在网络中传播的路径长度。输入输出序列中位置的任何连接之间路径越短,学习长范围依赖越简单。因此,这里还比较了由不同层类别组成的网络中,任意两种输入输出位置之间最长的路径。结果显示,当序列长度比表示维度d小的时候,自注意力层比循环层更快,而卷积层通常比循环成本更高。自注意力能够得到更好解释的模型。

3. 实验训练

这篇论文在标准WMT2014英德和英法数据集上进行了训练,使用了一台有8个英伟达P100 GPU的机器。
训练细节和结果此处不再赘述,感兴趣的同学可以查看原论文。

4. 总结

这篇论文提出了Transformer,这是第一个完全依靠attention的序列转换机制,而不是普遍应用在拥有多首部自注意力的编码器解码器结构中的循环层。
在翻译任务中,Transformer比基于循环或者卷积层的结构训练得更快,在WMT2014的英德和英法翻译任务中,达到了先进水平。
未来期待应用到其他任务中。

相关文章: