读书笔记11:Attention is all you need

这篇文章引用很多,应该是一篇贡献比较大的。

摘要部分:第一句话说现在主流的序列转换模型是基于复杂的循环或者卷积神经网络的,这些网络有一个encoder和一个decoder。然后指出效果最好的模型还会在encoder和decoder之间加上attention机制。接着引出:我们提出了一种简单的新模型,完全不需要循环或者卷积,只用attention就可以。最后介绍了实验结果。这个摘要的结构是首先介绍背景,也就是我们要处理的这种序列问题主流的方法是什么,然后引入我们的方法,最后介绍实验结果。和读书笔记10中介绍的文章的摘要不同,这篇文章摘要介绍自己模型的时候只是介绍了特点“只需要attention”,而笔记10中的还简介了算法是如何操作的。

introduction第一段还是简介背景:RNN、LSTM、GRU已经被认为是sequence modeling最好的方法,很多人在努力提升这些方法。第二段就是介绍recurrent model的工作方式,进而指出他们的缺陷和不足,还说到虽然最近有一些工作对某些不足做了一些改进,但是sequential computation的一些根本性的限制还是存在。第三段开始介绍attention已经成为优秀的sequence modeling和transduction模型的不可或缺的部分,介绍attention的好处,并说明除少数情况,attention都是和RNN一起用的。introduction最后一段才提出了自己的模型,在本文中我们提出了Transformer,一个只用attention的模型,transformer能够显著提升并行能力,并且在试验取得良好结果。introduction的基本结构是第一段介绍背景(针对这个问题主流的模型是什么),第二段指出主流模型的缺陷,第三段从现有的attention机制的介绍入手,引出第四段对于自己模型的介绍。这个介绍自己模型的时候还是没有说出具体操作,只是从模型的特点,能力以及实验结果介绍了模型。

在介绍模型架构之前,作者还加了一个部分叫做background(没有related work部分)。这部分主要还是结合当前模型的不足(抓取长程dependencies需要大的计算量),介绍attention的优点,大致的含义,以及本文要提出什么模型。

接下来是技术部分。首先,整个模型遵从的也是encoder-decoder的模式(如下图),

输入序列symbol representation,先encode成为continuous representation,有了z,decoder再生成输出序列,输出序列的元素也是symbol,每次生成一个元素,在每一步,模型都是自回归的,在生成下一个symbol的时候会将之前生成的symbol都作为额外的输入。encoder是六层相同的网络叠在一起构成的,每一层都有两个sub-layer,第一个是multi-head self-attention mechanism,第二个是全连接的前馈网络,每一个sub-layer都加了一个residual connection,并且后面加一个layer normalization,也即每个sub-layer的输出都是是这个sub-layer自己采用的函数,为了输出和residual connection配合,所有的sub-layer和embedding layer的输出的维度都是。decoder也是6层网络构成的,除了和encoder一样的两层sub-layer,每一个decoder层还插入了第三个sub-layer,是在encoder的输出上进行multi-head attention的,和encoder一样,decoder也采用residual connection,layer normalization,self-attention(也叫intra-attention)机制也被修改了一下,使得后来的不会被记入attention的计算中,与此同时,output embedding也有一个位置的offset(这个操作还不明白是怎么回事,要看后面),这两个操作使得位置i的预测可以只依赖于位置序号小于i的已知的输出。

接下来是attention机制的介绍,attention函数可以被描述为将一个query和一组key-value映射到一个输出,这三个东西全是vector。也就是说,输出是value加权求和得到的,而权重是由query和相应的key之间用compatibility function计算出来的。一种attention是scaled dot-product attention,如下图所示

key和query的维度是,value的维度是,scaled dot-product指的是query和所有的key之间进行dot-product点乘之后除以进行一下scale,然后进行一下softmax就得到需要的权重,这个其实很像之前写的笔记中的attentive convolution的那个计算attention的方法,query就对应那篇文章中卷积核中心对应的位置的特征向量,而key就对应其他参与attention计算的位置的特征向量,而values和key是一个东西(并不是说这篇文章key也和value一样)。实际应用中,一组query会被打包在一起成为Q,key和value也打包成K和V,对所有的query并行计算,。其实additive function和dot-product是两种最常用的attention,本文用的scaled dot-product是因为dot-product实际运行的时候由于高度优化的矩阵相乘算法,会更加快速且节约空间,而加一个scaled项是因为当key的维度变得较大的时候,dot-product就比additive的表现要差劲,这可能是因为维度增大后,点乘得到的数值会变得很大,使得softmax函数到了梯度很小的区域,不好优化,因此用来抵消一下这个效应。multi-head attention是同时为一组数据并行的计算多组attention,具体来讲是用可训练的线性映射将输入的query、key、values进行线性映射到维、维、h次,然后这h组数据并行进行attention的计算,生成维度的输出,这些输出会被连接在一起然后再次投影,得到最终的final value,就像上图右侧所示的。用公式来表达就是

扫描二维码关注公众号,回复: 3233500 查看本文章

,这些W都是待训练的投影矩阵。

本文中h=8,,也就是说总的计算量和single head attention直接计算完整的512维的是一样的。

接着作者介绍了本模型中对attention的使用。主要是介绍了multi-head attention在本文中从三方面得到使用:首先是“encoder-decoder attention layer”,quires是从上一层decoder来的,而memory keys(不知道为什么又加了个memory)和values是从encoder的输出来的,使得decoder出来的每一个位置都能从输入的所有位置进行注意(attend),和一些典型的encoder-decoder中使用的attention机制很像。第二是encoder包含了self-attention层,self-attention层中,所有的keys、values、queries来源都是相同的,也就是前一层encoder的输出的所有位置。encoder的每一个position的都能attend到同在encoder中的前一层的所有位置的信息。第三点,和第二点很像,decoder中的self-attention机制使得decoder中的每一个位置都能attend到此位置之前的所有位置的信息,作者组织了信息由右向左的流动,这是为了保留自回归的特性(应该是说生成出来的东西要和上文保持一致,而不是和下文)。这个操作的实现是通过在scaled dot-product attention的内部mask out(元素值设置成负无穷,这样在softmax的时候数值就是0)掉softmax input中所有对应着非法连接的数值。

接下来介绍的是模型中的position-wise feed-forward networks,有人认为这里其实就是1×1的卷积,文章作者可能是为了不提到卷积和RNN所以另外起了这个名字(因为题目是attention is all you need,意思是卷积和RNN的操作都不需要了,就attention就行了),但其实后文中作者也说了这个可以表述为卷积核尺寸为1的卷积网络。encoder和decoder每个都都包含一个全连接的前馈网络(feed-forward network),这个网络对于每一个位置都独立进行相同的操作,操作包含两个线性变换,之间还夹着一个ReLU激活函数,数学语言表达就是:

                                                            

FFN同一层对于每一个位置采取相同的参数,不同的layer采取不同的参数。输入和输出都是,中间层的维度是2048.

和其他序列模型一样,本文的模型也是为输入的字符和输出的字符进行embedding,变成维度的向量,decoder的输出也用常用的learned linear transformation和softmax函数转化为预测出来的下一个字符的概率。在模型中,两个embedding层和softmax之前的pre-softmax linear transformation使用同样的权重矩阵。

由于模型中不涉及到recurrence和卷积,因此,为了利用上输入序列的顺序信息,作者提出了position encoding操作,每一个位置都采用维度和输入embedding一样的,以便和输入相加,具体操作方式是

                                                              

pos是position,位置,i是维度,每一个维度都对应着一个固定频率的正弦曲线,波长构成了一个从2π到10000*2π的几何增长。选择这个函数是因为作者认为这样能让模型更容易的通过相对位置(relative position)来学习attend,因为对于任何固定的k,都能用的一个线性函数来表示。作者还将实验结果和一个叫positional embedding的方法进行了对比,发现两者产生了几乎一样的结果,使用正弦曲线这种版本是因为它可能有利于增加模型的推广能力,遇到比训练集中更长的序列也能对付。

在技术部分的最后,作者分析了为什么要使用self-attention而不使用CNN或者RNN。主要从三方面入手进行分析的,第一是每一层的计算复杂度,第二是能够被并行的计算量,第三是网络中长程依赖之间的路径长度,也就是两个相距很远的位置之间如果想有信息来回交换,需要多长的路径(像CNN这种靠增加layer数增大感受野的,两个相距较远的位置想有信息交换就不容易,要跨越很多层)长程依赖关系的学习是很多序列转换模型的关键挑战。

上图是集中模型的各个参数对比,包括每层的计算复杂度,sequential operation数量级,最大路径长度。可以看出self-attention层无论连接多少个位置都是一个常数级的sequential operation数量,但是RNN就是O(N)级别的,当序列的长度n小于representation的维度d的时候,self-attention的计算复杂度也是要小于RNN的。单层卷积中不是所有输入位置和所有输出位置都是相连的,卷积核尺寸为k的话,以contiguous kernel的方式卷积(就是正常的卷积),要想达到这个效果,需要层数的数量级是O(n/k),若是dilated convolution的话是。卷积神经网络一般比RNN更消耗资源,是成k倍的关系。separable convolution可以极大地减小计算量到+,然而即使k=n的时候,separable convolution的计算复杂度与self-attention和point-wise feed-forward network结合的复杂度是相等的。此外,self-attention可以生成更容易解释的模型,作者在附录中探讨了attention的分布,作者发现,不仅仅individual attention heads可以学习到执行不同的任务,很多还展示出和句子语义和句法的相关性。

本文的技术部分采取由大到小的层次,先介绍大尺度上,模型由encoder-decoder构成,然后再介绍encoder和decoder分别有哪些层构成,接着介绍这些层都是什么。

整个模型的工作过程大致就是,输入一个序列,先embedding成one-hot形式的序列,然后搞一个positional encoding加进去,输入到encoder,接着进行multi-dead的self-attention,之后接一个feed-forward网络(residual没有说,因为只是简单的相加操作),这样重复6次之后,输入到decoder中,而decoder中已经有了由之前的预测结果得到的output embedding向右平移,经过positional encoding,通过masked multi-head attention并normalized之后的产物,按结构图所示,这个产物和encoder的输出同时输入到一个multi-head attention层中,这个产物应该就是queries,然后用encoder的输出做key和values,进行attention计算之后和residual相加并normalize,再经过1×1的卷积层、线性变换和softmax,得到输出结果。

猜你喜欢

转载自blog.csdn.net/b224618/article/details/81676643