Attention Is All You Need----Transformer 论文解读

Attention Is All You Need

    • 1. Introduction
    • 2. Background
    • 3. Model Architecture
      • 3.1 Encoder-Decoder Stacks
      • 3.2 Attention
        • 3.2.1 Scaled Dot-Product Attention
        • 3.2.2 Multi-Head Attention
        • 3.2.3 Applications of Attention in our Model
      • 3.3 Position-wise 前向网络
      • 3.4 Embeddings and Softmax
      • 3.5 Positional Encoding
    • 4. Why Self-Attention

【写在前面】本论文发表于NeurIPS 2017,由谷歌大脑提出的一个新的框架–Transformer,在该框架中完全摒弃了CNN和RNN,而是仅采用了Attention机制,并且融合了位置信息嵌入、前馈神经网络、残差网络和正则化等方式,然后将该模型应用于11项NLP任务,例如机器翻译等,并且都取得了较好的效果。

论文地址:https://arxiv.org/pdf/1706.03762.pdf
论文源码:https://github.com/pytorch/fairseq [Pytorch版本]
https://github.com/tensorflow/models/tree/master/official/nlp/transformer[Tensorflow版本
]

1. Introduction

递归模型通常是沿着输入序列和输出序列的符号位置进行因素计算。为了将计算时间的步骤与位置对齐,我们可以用上一个时刻的隐状态 H t − 1 H_{t-1} Ht1和位置t的输入生成隐状态 H t H_t Ht,这种固有的顺序特性会限制训练过程中并行化的使用。但是Attention机制可以对依赖关系建模而不考虑它们在输入输出序列中的距离。

作者提出的Transformer可以避免循环结构,而是完全采用attention机制来绘制输入输出间的全局依赖关系。此外,Transformer还运行进行并行化

2. Background

现有的一些模型,例如ByteNet、ConvS2S等,都采用了CNN作为基本的Block,因此它们在捕捉长范围的时序依赖有一定的局限性。

self-attention通过联系单个序列不同位置的向量来表示一个序列,self-attention已经被广泛应用在许多任务中,如阅读理解等。

Transformer是第一个仅仅使用self-attention计算输入输出表示的转导模型。

3. Model Architecture

大多数有竞争力的序列转导模型都拥有一个Encoder-Decoder结构,encoder将输入序列 ( x 1 , . . . , x n ) (x_1,...,x_n) (x1,...,xn)映射到一个连续的向量表示 z = ( z 1 , . . . , z n ) z=(z_1,...,z_n) z=(z1,...,zn),然后再由decoder从z生成输出序列 ( y 1 , . . . , y m ) (y_1,...,y_m) (y1,...,ym)。在这个模型中的每一步都是一个自回归模型,即在生成下一字符时,需要使用先前生成的符号作为附加输入。

Transformer也是用了Encoder-Decoder结构,结构中堆叠了self-attention、点操作(point-wise)和全连接层。Attention Is All You Need----Transformer 论文解读_第1张图片

3.1 Encoder-Decoder Stacks

Encoder: Encoder被6个完全一样的layer组成,每个layer有两个子层。第一个子层是多头注意力机制(multi-head self-attention),第二个是点操作全连接前馈网络。在两个子层之后采用了残差连接和正则化,即每个子层输出为 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))。为了促进这些残差连接,每一层的输出维度为 d m o d e l = 512 d_{model} = 512 dmodel=512.

Decoder: Decoder也是由6个完全一样的layer组成,除了Encoder中的两个子层外,它还插入了第三个子层,它对Encoder的输出执行多头注意力操作。与Encoder相同,每个子层之后都使用了残差网网络和正则化操作。此外需要修改Decoder中的第一个子层,为了防止后面位置的参与到前面的位置,这个masking操作确保了位置i的预测只依赖于i之前的位置

  • 输入序列经过encoder部分,将最上面的encoder的输出变换成一组attention向量K和V,这些向量将会用于每个decoder的encoder-decoder attention层,有助于解码器聚焦在输入序列的合适位置。
  • 解码器最后输出一个向量,需要依靠最后面的线性层和softmax层把他变成单词,线性层就是一个很简单的全连接神经网络,将解码器输出的向量映射成一个更长的向量。例如我们又1000个无重复的词,最后的输出向量就有1000维。
  • 输出过程:decoder部分每次的输出的1000维的向量只能筛选出一个单词,然后这个单词会作为下一个step的输入,即output embedding。

3.2 Attention

这个attention函数可以描述为将查询(query)和一组键值对(key-value)映射到输出的过程,其中query,key、values和输出时所有的向量。输出由所有values的加权和计算得来,每个value的权重由query和相关的key计算得到

3.2.1 Scaled Dot-Product Attention

Attention Is All You Need----Transformer 论文解读_第2张图片
在该部分,输入包括queries、keys、values和keys的维度 d k d_k dk以及values的维度 d v d_v dv,我们将每一个query与所有的keys进行点积操作,然后除于 d k \sqrt{d_k} dk ,最后通过一个softmax层后得到每个value的权重,然后权重乘以value得到最终的表示。
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
*常用的attention函数主要有additive attention和dot-product attention,但是dot-product attention可以使用矩阵计算,计算效率更高。当 d k d_k dk是一个小值的时候两个机制相差不多。当 d k d_k dk的值比较大时,点积的大小变大,会将softmax推向具有极小梯度的地方,因此选用 d k \sqrt{d_k} dk

  • self-attention的作用:在模型处理每个单词时,self-attention可以帮助模型查看input序列中的其他位置,寻找相关线索,来达到更好的编码效果。Attention Is All You Need----Transformer 论文解读_第3张图片例如上图中,在第5层时,我们就知道 it 大概指的是 animal 了。
3.2.2 Multi-Head Attention

该论文并没有采用单个attention函数,因为作者发现对queries、keys和values执行h个不同的线性映射是非常有益的。此外,每个版本的线性映射还可以并行执行,得到h个 d v d_v dv维的values输出,这些输出进行拼接然后再次进行映射,得到最终的输出值。
Attention Is All You Need----Transformer 论文解读_第4张图片
多头注意力模型允许模型共同关注来自不同位置的不同表示的子空间信息。计算公式如下:
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 \quad head_i = Attention(QW^Q_i, KW^K_i, VW^V_i) 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^Q_i \in R^{d_model \times d_k}, W^K_i \in R^{d_model \times d_k}, W^V_i \in R^{d_model \times d_v}, W^O \in R^{hd_v \times d_model} WiQRdmodel×dk,WiKRdmodel×dk,WiVRdmodel×dv,WORhdv×dmodel, h = 8 , d k = d v = d m o d e l / h = 64 h=8, d_k = d_v = d_{model}/h = 64 h=8,dk=dv=dmodel/h=64.

3.2.3 Applications of Attention in our Model

Transformer以三种不同的方式使用了多头注意力机制:

1、在“Encoder-Decoder层”(decoder中上面的self-attention),queries来自之前的decoder层,keys和values来自encoder的输出, 这允许decoder中的每一个位置都参与到输入序列的所有位置;

2、Encoder中的attention层。该部分self-attention层的所有keys、values和queries都来自相同的地方,即前一层Encoder的输出。此外,Encoder中的每个位置都可以参与前一层Encoder的所有位置;

3、Decoder中的self-attention允许每一个位置参与该位置之前的所有位置,我们需要放置Decoder中的信息进行向左流入,以保持自回归性。通过在scaled dot-product attention中mask掉(设置为无穷大)一些值来进行。

3.3 Position-wise 前向网络

每个Encoder和Decoder都包含了一个全连接前向网络,它包含了两个线性变换,并采用了ReLU激活函数:
F F N ( x ) = m a x ( 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
此外还可以采用两个卷积核大小为1的卷积操作进行描述,输入输出的维度为 d m o d e l = 512 d_{model} = 512 dmodel=512,内层的维度为 d f f = 2018 d_{ff} = 2018 dff=2018

3.4 Embeddings and Softmax

Transformer采用预学习的嵌入来得到输入和输出tokens的向量,作者还使用预学习的线性变换和softmax函数将decoder的输出转换成下一个tokens的预测概率。在两个embedding层进行参数共享,并且乘以它们的权重 d m o d e l \sqrt{d_{model}} dmodel

3.5 Positional Encoding

由于Transformer没有利用循环或者卷积操作,因此要想充分利用顺序信息,就必须加入一些位置信息。在encoder和decoder在输入部分加入了位置嵌入,其维度与输入相同 d m o d e l d_{model} dmodel,可以直接进行加和操作

这部分,作者使用了不同频率的余弦和正弦函数:
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE_{(pos, 2i)} = sin(pos/10000^{2i/d_{model}}) \\ PE{(pos, 2i+1)} = cos(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
pos是位置,i是维度。每个位置的维度都对应一个正弦波,波长从 2 π 2 \pi 2π 10000 ⋅ 2 π 10000·2\pi 100002π。采用整个模型的原因就是可以让模型很容易地学习出相对位置的表示,即给定一个固定位置k, P E p o s + k PE_{pos+k} PEpos+k就可以通过一个 P E p o s PE_{pos} PEpos的线性函数表示出来。

例如,当input embedding的维度为4时,实际的positional encoding 如下所示:
Attention Is All You Need----Transformer 论文解读_第5张图片

上面的公式表示了位置嵌入向量的前半部分有正弦函数生成后半部分由余弦函数生成,然后将其拼接作为每个位置的编码向量。

4. Why Self-Attention

  1. 整体的计算复杂性不高;
  2. 可以并行化的计算;
  3. 网络中远程依赖关系依赖之间的长度。

参考文献:
http://jalammar.github.io/illustrated-transformer/
https://www.jianshu.com/p/e7d8caa13b21

你可能感兴趣的:(经典模型论文,深度学习,机器学习,自然语言处理,神经网络)