Attention Is All You Need 架构分析

Attention Is All You Need 架构分析1

1. 序列问题

序列建模和转换问题中应用最先进的模型有:递归神经网络(RNN),长短期记忆网络(LSTM),门控递归神经网络。最近处于发力点的模型有循环语言模型编码器-解码器架构

序列建模和转换模型中,注意力机制作为其中重要组件,允许对依赖关系进行建模,而不用考虑依赖关系在输入序列或者输出序列中的距离。注意力机制通常与递归网络协同使用。

Transformer的提出是为了避免递归网络的使用,是为了干掉递归网络的。Transformer的模型思路是完全依赖某种注意力机制,以绘制输入和输出之间的全局依赖关系,支持更强的并发运行。

2. 模型架构

同大多数seq2seq模型一样,Transformer同样也是基于encoder-decoder结构。

encoder的作用是将一个符号集表示的输入序列 ( x 1 , x 2 , . . . , x n ) \ (x_1,x_2,...,x_n)  (x1,x2,...,xn),编码映射成一个连续表示的输出序列 z = ( z 1 , z 2 , . . . , z n ) \ \boldsymbol{z}=(z_1,z_2,...,z_n)  z=(z1,z2,...,zn)

decoder的作用是对于给定序列 z \ \boldsymbol{z}  z,每次都生成输出序列 ( y 1 , y 2 , . . . , y m ) \ (y_1,y_2,...,y_m)  (y1,y2,...,ym)中的其中一个元素,且每一步都是自回归的(auto-regressive),生成下一个符号时,都会将之前已生成的符号集作为额外输入。

Transformer采用 stacked self-attention和point-wise的方式遵循此架构,下图左右分别展示的是encoder和decoder的全连接层。

在这里插入图片描述

2.1 Encoder和Decoder堆栈

Encoder

encoder由N=6个相同层堆栈构成,这6个相同层内部都有2个子层,前一个是Multi-Head Attention,后一个是全连接position-wise前馈网络。2个子层后面紧跟一个残差+归一化。也就是说,每个子层的输出为:
L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x+Sublayer(x)) LayerNorm(x+Sublayer(x))
其中, S u b l a y e r ( x ) \ Sublayer(x)  Sublayer(x)是由子层负责的函数功能实现。为了有效利用这些残差连接,所有的子层及嵌入层的输出维度都是512,即 d m o d e l = 512 \ d_{model}=512  dmodel=512

Decoder

decoder由N=6个相同层堆栈构成,这6个相同层里面有三个子层,子层后面依然紧跟一个残差+归一化。为了防止positions参与随后的positions,还对self-attention sub-layer进行了调整。由于output embeddings会有一个position的偏移,masking会确保对position i \ i  i的预测只依赖于position小于 i \ i  i的已知输出。

我在理解outputs是什么的时候脑子一直没反应过来,所以在这里note一下,output其实就是在训练时你希望得到的输出真值,比如inputs假设是"I love you",那么训练集的output真值就是“我爱你”,不管是input还是output,在训练时都是已知的,output可认为是真值标签。

2.2 Attention

Attention方法可以认为是将一条query和一组key-value映射到一条output中。query, key, value, output均为向量。

通过计算values的加权和得到output,其中权重是通过query和相应key的兼容性函数(compatibility function)计算得到。

Scaled Dot-Product2 Attention

如下图所示,这个特别的注意力模块就叫做Scaled Dot-Product Attention。

在这里插入图片描述

在此模块中输入由三部分组成queries, keys, values。其中queries和keys的维度为 d k \ d_k  dk,values的维度为 d v \ d_v  dv。首先计算单个query和其对应的所有keys的点积,并分成 d k \ \sqrt{d_k}  dk 份,随后再跟一个softmax用于提取values所对应的weights。

在实际操作中,可以简化成一组queries同时计算,keys和values也同样一起打包成矩阵K, V。于是输出变为一个矩阵,可写作:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V
在注意力机制中,最常用的注意力算法分别是additive attention和dot-product attention。上述算法中,除开缩放因子 1 d k \ \frac{1}{\sqrt{d_k}}  dk 1,其余部分与dot-product attention是相同的。

Additive attention是指使用具有单个隐藏层的前馈网络来计算兼容性的算法。尽管两者在理论复杂度上时相似的,但在实际中,由于dot-product可以使用高度优化的矩阵乘法码来实现,因此其速度和空间效率都要更优秀。

虽然两种机制在 d k \ d_k  dk都较小时,表现出来的效果都相似,但在 d k \ d_k  dk偏大时,additive attention的结果表现会优于dot product。这是因为当 d k \ d_k  dk足够大时,点积结果会大规模增长致使softmax之后造成梯度很小,不利于计算。为了抵消这种梯度变小的现象,才对点积结果按 1 d k \ \frac{1}{\sqrt{d_k}}  dk 1进行缩放。

Multi-Head Attention

对queries, keys, values进行h次不同的线性变换,分别投影到 d k , d k , d v \ d_k,d_k,d_v  dk,dk,dv维上,这样得到效果会更好,而不是对 d m o d e l \ d_{model}  dmodel维的keys, values, queries粗暴地仅使用单次注意力函数。

在这里插入图片描述

经过h次不同的投影后,queries, keys, values会有h个不同版本的副本。Multi-Head Attention对每个版本副本平行地执行注意力函数,然后平行地生成 d v \ d_v  dv维的输出向量。这些输出向量会被简单拼接在一起(concatenated),再重新线性投影一次得到最终的值。

Multi-head attention 允许模型可以共同地处理不同表示子空间不同位置的信息。
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O\\ where \,head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)
其中投影是以参数矩阵表示的:
W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l × d k , W i V ∈ R d m o d e l × d v , W O ∈ R h d v × d m o d e l W_i^Q\in\bold{R}^{d_{model}\times d_k},W_i^K\in\bold{R}^{d_{model}\times d_k},W_i^V\in\bold{R}^{d_{model}\times d_v},W^O\in\bold{R}^{hd_v\times d_{model}} WiQRdmodel×dk,WiKRdmodel×dk,WiVRdmodel×dv,WORhdv×dmodel
对于平行attention层或者heads,将h的值设为8。
d k = d v = d m o d e l / h = 64 d_k=d_v=d_{model}/h=64 dk=dv=dmodel/h=64

Applications of Attention in Transformer Model

在Transformer中,对multi-head attention的使用时是以三种不同方式进行的。

  • Encoder-decoder attention layers:在这个模块中,queries是从上一个decoder层得到的,记忆keys和values是从encoder的输出获取的。此模块对应图1右侧中间的multi-head attention
  • Encoder self-attention layers:在这个模块中,所有的keys, values, queries都是从位于encoder中self-attention layers的上一层的输出得到的。此模块对应图1左侧multi-head attention
  • Decoder self-attention layers:在这个模块中,与之前的dot product不同,它增加了一层mask,用于处理非法连接产生的值。此模块对应图1右侧最下面的masked multi-head attention

2.3 Position-wise3 Feed-Forward Networks

此模块为一个前馈全连接网络,统一且独立地在每一个position使用。由两个线性变换组成,且中间放置了一个ReLU激活层。其实质就是一个MLP网络4
F F N ( x ) = max ⁡ ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=\max(0,xW_1+b_1)W_2+b_2 FFN(x)=max(0,xW1+b1)W2+b2
这个线性变换在当前层的每个position上参数都是相同的,所以可以看作是一个1*1的卷积,但是,层与层之间的参数是发生变化了的。隐藏层维数为2048,维数变化为512–>2048–>512。

2.4 Embeddings and Softmax

Embeddings是用来编码向量的,用于将input token和output token转为 d m o d e l = 512 \ d_{model}=512  dmodel=512维度的向量。token, 即tokenization(分词)。分词就是将句子、段落、文章这类型的长文本,分解为以字词(token)为单位的数据结构5

至于架构中的线性变换+softmax是用来处理decoder的输出的。用于将这个decoder输出转换成下一个token的预测概率。

根据文章描述,encoder和decoder的两个embeddings还有一个在softmax之前的线性变换(the pre-softmax linear transformation)是共享了相同的权重。有个小不同是embeddings的部分权重乘了 d m o d e l \ \sqrt{d_{model}}  dmodel 大小。

2.5 Positional Encoding

这个模块是用于加入token在序列中相对或绝对位置信息的,可以从架构图里面看到,Encoder和Decoder的下方都是各自加了一个Positional Encoding模块的。Positional Encoding的维数同Embeddings是一样的,都是 d m o d e l \ d_{model}  dmodel,进而两者就可以进行加和了。对位置进行编码也有不同的方式,learned and fifixed。

在这篇文章中使用的编码方式是sine and cosine functions。
P E ( p o s , 2 i ) = sin ⁡ ( p o s / 100 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s / 100 0 2 i / d m o d e l ) PE_{(pos,2i)}=\sin(pos/1000^{2i/d_{model}})\\ PE_{(pos,2i+1)}=\cos(pos/1000^{2i/d_{model}}) PE(pos,2i)=sin(pos/10002i/dmodel)PE(pos,2i+1)=cos(pos/10002i/dmodel)
其中pos表示位置,i表示维度。对于位置编码是如何编码的原文没有解释得很清楚,可以参考这篇文章6

3. 总结

至此,Transformer的整体架构就全部解释完毕,正如一开始的架构图所画的那样,Transformer可以大致分成4个模块。

Multi-Head Attention,多头注意力机制其实是由Scaled Dot-Product Attention变化而来。根据Multi-Head Attention模块的输入来源不同,可以分成Self-attention和Encoder-decoder attention,Self-attention是因为同一串序列复制成了三份,分别作为QKV,进行输入,所以叫它自注意力机制。Encoder-decoder attention的输入是怎么构成的可以直接看架构图右侧中间那个Multi-Head Attention。

Feed-Forward Networks其实就是一个带一个隐藏层的全连接感知机,中间放了一个ReLU激活层。

紧接着是Embeddings and Softmax,Embeddings的作用是将input/output token编码成512维的向量表示。softmax用在全架构的最后,用于输出下一个token的预测概率。

Positional Encoding在encoder和decoder的输入之前都放置了,它的功能是对token在各自序列中的位置进行编码,也就是提供了一个位置信息,得到这个信息之后再与Embeddings的输出进行加和。

这篇文章只是分析了Transformer的整体架构,各个模块的功能是什么,但是还有一些细节算法没有解释。比如auto-regressive,训练过程是怎样的,测试过程是怎样的等等,将在之后发布在此专栏中。

Reference


  1. Vaswani, Ashish, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser和Illia Polosukhin. 《Attention Is All You Need》. ArXiv:1706.03762 [Cs], 2017年12月5日. http://arxiv.org/abs/1706.03762. ↩︎

  2. Dot products:点积,又称数量积 ↩︎

  3. “逐”的意思。e.g. element-wise product,就是对于每一个element做product。 ↩︎

  4. MLP 网络,即多层感知机,中间可含多个隐藏层。 ↩︎

  5. NLP中什么是span和token ↩︎

  6. 对Transformer中的Positional Encoding一点解释和理解 ↩︎


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部