by Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, and Łukasz Kaiser
目录
3.2.1 Scaled Dot-Product Attention(缩放点积注意力)
3.2.2 Multi-Head Attention(多头注意力)
1. 简介
2. 背景
3. 模型架构
大部分有竞争力的序列转换神经网络模型具备一个encoder-decoder(编码器-解码器)结构。其中,编码器将输入符号表征序列(x1, ……, xn)映射为一个连续的表征z = (z1, ……, zn)。给定z后,解码器生成输出的符号序列(y1, ……, ym)。每一步该模型都是自回归的,将前一步生成的符号加入输入,用于生成下一步的输出。
Transformer模型整体上遵循了这一架构,使用了堆叠的self-attention(自注意力机制),编码器和解码器均使用了全连接层,如下图所示。
3.1 编码器和解码器堆叠
编码器:编码器由N=6个完全一致的层堆叠而成。每层有两个子层。第一层是multi-head attention(多头自注意力)机制,第二层是一个简单的、逐点的全连接前馈网络。作者在每个该两层结构使用了残差连接,其后是layer normalization(层标准化)。也即,每一子层的输出为LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层函数自身的输出。为推动这些残差连接,模型中的所有子层,以及嵌入层,输出维度dmodel=512。
解码器:解码器同样由N=6个完全一致的层堆叠而成。
3.2 Attention(注意力)
一个Attention函数可以描述为由一个query和一套key-value对到输出的映射,query、key、value和输出均为矢量。输出为value的加权和,每个value分配到的权重通过一个query和对应key的compatibility function(兼容函数)计算得出。
3.2.1 Scaled Dot-Product Attention(缩放点积注意力)
作者将文章中的注意力成为“Scaled Dot-Product Attention(缩放点积注意力)”(如下图)。
输入query和key的维度为dk,value维度dv。计算query和所有key的点积,再除以根号dk,再用一个softmax函数获得value的权重。
实践中,通常同时计算一系列query的attention函数,将它们堆叠至一个矩阵Q。key和value同样构成矩阵K和V。矩阵输出如下:
最常用的两种attention函数为additive attention和dot-product(multiplicative)attention(点积attention)。点积attention与该文中的算法一致,除了文中的缩放因子。additive attention使用单个隐藏层的前馈网络计算兼容函数。这两种注意力函数理论复杂度上类似,点积注意力函数在实践中更快且空间利用更高效,因其可以通过高度优化的矩阵乘法代码实现。
对于dk维度的较小value值,两种注意力机制表现类似;对于dk维度值较大的value, additive attention表现比无缩放的点积注意力好。作者怀疑,对于dk维度较大的value值,点积增长过快,导致softmax函数梯度极小。为应对这一影响,作者增加了缩放因子。
3.2.2 Multi-Head Attention(多头注意力)
和仅在dmodel维度上的key,values和queries上实现一次attention函数相比,作者发现分别将queries,keys和values按dq,dk和dv维度线性展开h次更为便利。在每一个展开后的queries,keys和values上平行地实行attention函数,获得dv维度的输出value。进而将其拼接并再次线性展开,得到最终values,如下图。
multi-head attention使模型可以同时注意到来自不同位置、不同表征子空间的信息。如果用单个attention head,将抑制这些信息。
参数矩阵和。
本文中使用了h=8个平行attention层,或head头。每个层使用dk=dv=dmodel/h=64.由于每个头的维度减少,总的计算成本和单头全维度的attention接近。
3.2.3 Attention在模型中的应用
Transformer按以下三个方式使用multi-head attention。
- 在“编码-解码attention”层中,从前一个解码层来的queries,以及编码器输出的memory keys和values。Multi-head attention可让解码器注意到输入序列中的每个位置,模仿了序列到序列模型中的编码-解码器attention机制。
- 编码器包含了self-attention(自注意力)。在自注意力层中,所有keys,values和queries都来自同一位置,在本文中是编码器上一层的输出。编码器中的每一位置都可以关注到编码器上一层的所有位置。
- 与之相似,解码器的自注意力层可使解码器中的每一位置关注到所有位置,包含该位置自身。需要阻止解码器中的左向信息流,以维护自回归的信息。在缩放点积attention中通过masking out(值设至-∞)所有softmax的输入。
3.3 位置相关的前馈网络
在attention子层的基础上,所有编码器、解码器层中均包含了一个全连接前馈网络,在每一位置都单独且完全一致的使用。包含两个线性变换,其中使用了ReLU激活函数。
不同位置的线性变换一样,层与层间的参数不同。也可视为核大小为1的两层卷积。输入和输出的维度是dmodel=512,中间层维度dff=2048.
3.3 Embeddings(嵌入向量)和Softmax
与其他序列转换模型相似,本文使用嵌入向量将输入和输出tokens转换为维度为dmodel的向量。也使用了常规的学习到的线性变换和softmax函数将解码器的输出转换为下一token概率的预测。在本模型中,两个embedding层和softmax之前的线性变换使用相同的权重矩阵。在embedding层中,权重均乘以。
3.4 位置编码
由于本文模型不包含循环和卷积,为了让模型利用序列的时序,必须注入序列token的相对或绝对位置的有关信息。为实现这一目的,在编码和解码器堆栈底部的输入embeddings增加了“positional encodings(位置编码)”。位置编码和embeddings的维度均为dmodel,所以两者可以相加。关于位置编码由多种选择可以学习和修正。
本文使用不同频率的sin和cosin函数:
其中pos是位置,i是维度。也即,位置编码(Positional Encoding, PE)的每一维度对应一条正弦曲线。波长构成了从2pi到10000×2pi的等比级数。作者选择这一函数因为它们假设它可使模型通过相对位置更加容易学习,因为对于任意的固定偏移k,PEpos+k可以表示为PEpos的线性函数。
4. 为什么Self-Attention
本章,作者对self-attention层和循环或卷积层的多个方面进行比较,循环(recurrent)和卷积(convolutional)层最常用于将一个可变长度的符号表征序列(x1,……,xn)映射到等长的另一个序列(z1,……,zn),,例如典型的序列转换编解码器中的隐藏层。以下三点促使作者使用self-attention。
一是每层的计算复杂度。二是可以平行进行的计算总量,以可执行的最小序列数量进行衡量。
三是网络中的长范围路径相关性。学习长范围的相关性是许多序列转换任务中的一个关键挑战。影响该学习能力的一个关键因素,是前馈和反馈信号需要在网络中传递的路径长度。输入输出任意位置组合间的传递路径越短,模型更容易学习到长距离的相关性。因此,作者还比较了不同类型的层中,输入输出任意两位置的最大路径长度。
如下表所示,一个自注意力层连接所有位置的执行步骤是一个常数,循环曾需要O(n)。至于计算复杂度,当序列长度n小于表征维度d时,自注意力层比循环曾更快,这也是机器翻译任务中SOAT模型最常见的序列表征,如word-piece和byte-pair表征。为了改进包含很长序列的计算表现,自注意力可以被限制到只考虑输入位置对应的输出位置中心附近r的邻居。这会将最大路径长度增加到O(n/r)。作者计划后续工作研究这一方法。
一个有尺寸为k<n的卷积核的单个卷积层没法连接所有的输入输出位置对。这就需要使用数量为O(n/k)或O(logk(n))的堆叠卷积层,增加了网络中两个位置间的最长路径长度。卷积层通常成本比循环曾成本高k倍。然而,可分离卷积显著地减少了计算量到O(k×n×d+n×d²)。然而既是k=n,可分离卷积的计算复杂度也仅仅和该文中模型的自注意力层和点对点前馈层相同。
另一好处是,自注意力可以获得更多可解释模型。作者在附录中检查并展示了该文中模型的注意力分布和给出了示例。单个注意力头不仅清楚地子啊不同任务中学习了,许多似乎也展现出了与句子语法语义相关结构的行为。