论文笔记-Attention Is All You Need
Transformer模型是谷歌2017年提出的NLP模型,自从提出以来,就在自然语言处理方面取得了很好的表现,并且可以实现并行化,最近又出现了许多将Transformer应用于计算机视觉的研究。
论文链接:https://arxiv.org/abs/1706.03762
博文参考:https://zhuanlan.zhihu.com/p/48508221
Attention机制介绍:https://www.cnblogs.com/ydcode/p/11038064.html
一、背景介绍
在Transformer提出之前,主要的用于处理序列的模型都是基于循环神将网络或者卷积神经网络,一般都包括一个编码器和解码器。
循环神经网络一般都沿着输入序列的位置进行计算,在每一个时间位置t上都会生成一个隐藏状态来表示上一个吟唱状态和t时的输入,由于内存限制这样处理的限制了模型的并行化。并且在顺序计算时会损失之前的信息,虽然有很多的tricks的提出提高了模型的表现,但是顺序计算的约束依然存在。
注意力(Attention)机制已经成为序列模型的一个组成部分,用于在不考虑起在输入或者输出序列中顺序的情况下建模依赖关系,但是注意力机制依旧是与循环网络结合使用。Attention是Encoder和Decoder之间的连接,它向Decoder提供来自Encoder的隐藏状态,是由各个元素按照其重要程度加权求和得到的,由attention函数实现。
而在Attention is all you need这篇文章中,Transformer可以提高并行化,避免了用 注意力机制去刻画出全局的输入与输出之间的依赖关系。Self-attention机制,可以将单个序列不同位置联系起来以计算序列的表现形式,将序列中任意两个位置之间的距离缩小为常量。Transformer完全依赖于self-attention来计算输入与输出的表示,而不是用序列对齐的RNN或者卷积,提高了并行性。
二、Treansformer的模型
大多数的序列处理模型都有一个编码器和解码器,这里编码器将符号表示的输入序列映射到一个连续的表示。给定,解码器然后一次生成一个元素的符号输出序列。在每一步中,模型都是自回归的,在生成模型时,使用先前生成的符号作为下一步额外的输入。
The Transformer model architecture编码器:编码器由n=6个相同层的堆叠组成。每层有两个子层。第一个子层是自注意力层,第二层是一个简单的、位置相关的全连接前馈网络。在每两个子层的周围使用了一个residual连接,然后是层规一化。也就是说,每个子层的输出是,其中是子层自身实现的函数。为了方便残差连接,模型中的所有子层以及嵌入层都会生成维度是的输出。
解码器:解码器也由n=6相同层的堆叠组成。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头部关注。与编码器类似,在每个子层周围使用了残差连接,然后进行层规一化。解码器中的self attention子层也被修改了,以防止位置涉及后续位置。这个masking,再加上输出嵌入被一个位置偏移,确保位置的预测只能依赖于位置小于的已知输出。
注意力机制:注意力函数可以描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出作为值的加权和计算,其中分配给每个值的权重由查询的兼容函数和相应的键计算。
编码器和解码器中出现的注意力机制叫做Multi-Head Attention,其中又包括了Scaled Dot-Product Attention,内部结构如下图。
- Scaled Dot-Product Attention
输入包括维度为的查询和键,以及维度\sqrt{d_k}$,然后应用softmax函数来获得查询的权重值。实际执行上,会同时计算一组查询的注意力函数,并将其打包到一个矩阵Q中。键和值也打包到矩阵K和V中。输出矩阵计算为
最常用的两个注意力函数是加法注意和点积注意。点积注意与上面的算法相同,只是比例因子为。加法注意利用一个具有单个隐层的前馈网络来计算相容函数。虽然两者在理论复杂度上相似,但点积注意在实践中更快更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
- Multi-Head Attention
使用不同的线性投影分别将查询、键和值时间线性投影到、和维,比使用模型维键、值和查询执行单个注意函数,更加有效。在查询、键和值的每一个投影版本上,并行地执行注意函数,得到 维输出值。这些值被连接起来并再次投影,得到最终值。
Multi-head attention使得模型能够在不同的位置共同关注来自不同表征子空间的信息。只有一个注意头,平均值会抑制这一点。
Transformer中以三种不同的方式使用multi-head attention:
- 在“编码器-解码器注意力”层中,查询来自前一个解码器层,存储键和值来自编码器的输出。这使得解码器中的每个位置都可以覆盖输入序列中的所有位置。这模仿了在序列到序列模型中典型的编码器-解码器的注意机制。
- 编码器包含自我注意层。在self-attention层中,所有的键、值和查询都来自同一个地方,在本例中,是编码器中前一层的输出。编码器中的每个位置可以关注编码器前一层中的所有位置。
- 类似地,解码器中的self-attention层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。为了保持自回归特性,需要防止译码器中的信息流左移。我们通过在点积注意力函数里屏蔽(设置为–∞)softmax输入中与非法连接相对应的所有值来实现。
除了注意力子层之外,编码器和解码器中的每一层都包含一个完全连接的前馈网络,它分别相同地应用于每个位置。这包括两个线性变换,中间有一个ReLU激活:
位置编码:由于Transformer模型不包含递归和卷积,为了使模型利用序列的顺序,必须加入一些关于序列的相对或绝对位置的信息。为此,我们将“位置编码”添加到编码器和解码器堆栈底部的输入嵌入中。位置编码与嵌入具有相同的维度模型,因此可以将两者相加。论文中使用了自己设计的编码规则,通常位置编码是一个长度为 的特征向量,便于和词向量进行单位加的操作。
对于不同的频率使用了正弦和余弦函数。
三、为什么用self-attention?
在本节中,我们将自我注意层的各个方面与通常用于将符号表示的一个可变长度序列映射到具有的另一个等长序列的循环和卷积层进行比较,例如典型的序列转换编码器或解码器中的隐藏层。我们考虑三个因素来激励我们使用self-attention。
一个是每层的总计算复杂度。另一个是可以并行化的计算量,以最小的顺序操作数来衡量。
第三是网络中长程依赖之间的路径长度。学习长程依赖性是许多序列转导任务中的一个关键挑战。影响学习这种依赖关系能力的一个关键因素是网络中前向和后向信号必须经过的路径长度。输入和输出序列中任何位置组合之间的路径越短,就越容易学习长程依赖关系。因此,我们也比较了在由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。
如上表所示,自我注意层用固定数量的顺序执行的操作连接所有位置(O(1)),而循环层需要n个顺序操作(O(n))。在计算复杂度方面,当序列长度小于表示维度时,自我注意层比循环层快,这通常是机器翻译中最先进模型使用的情况,例如词条和字节对表示。为了提高包含很长序列的任务的计算性能,可以将自我注意限制为只考虑大小为6的邻域,即以相应的输出位置为中心的输入序列。这也会增加最大路径长度(n/r)。
一个内核宽度为k<n的单个卷积层不能连接所有的输入和输出位置对。这样做需要一堆O(n/k) 的卷积层(对于相邻的核),或者O(logk(n)(对于空洞卷积),才能增加网络中任意两个位置之间最长路径的长度。卷积层通常要比循环层贵k倍。然而,可分离卷积也大大降低了复杂度到O(k·n·d+n·d2)。然而,即使在k=n的情况下,可分离进化的复杂性也等于我们在模型中采用的自我注意层和点态前馈层的结合。
自注意力机制是Transformer的关键,由于注意力机制将序列进行两两比较,导致计算量很大,许多论文都提出了各种加速的模型以及变体。