转载

Transformer理解

Transformer理解

Transformer,是google, 2017年提出的一个特征提取模型,最近大火的Bert就是构建在Transformer的基础

上的,所以我们有必要深入学习一下。下面是我通过阅读原论文、博客资料,得到的一些理解

背景

在Transformer未提出来之前,RNN是自然语言处理领域用得最广的深度学习框架,RNN有两个最大的缺点,

一是RNN无法提取长距离依赖信息,针对这个缺点,后来提出了RNN变体LSTM、GRU。第二个缺点是RNN由于

其本身的性质序列依赖,无法进行并行运算,所以其模型的运行速度较慢。而Transformer完全基于自注意力机制(自注意力机制又称为内部注意力机制,自注意力机制通过关注序列中的不同位置来对序列进行编码),相比于RNN, 可以实现更好的并行性。

模型架构

Transformer是一种典型的Encoder-Decoder模型,Encoder的作用:将输入句子序列 x 1 , x 2 , . . . x n {x_1,x_2,...x_n}

编码为 z 1 , z 2 , . . . z n z_1,z_2,...z_n , Decoder的作用:给定Encoder的输出 z 1 , z 2 , . . . z n z_1,z_2,...z_n ,以一次产生一个元素的形式

形成序列输出 y 1 , . . . . , y m y_1,....,y_m ,特别注意的是,形成每个元素的时候,都会考虑前面已经形成的元素。下面

的动图,是Transformer整体的运行流程。

]]

Encoder & Decoder

Encoder、Decoder的总体的网络框架如下图

Encoder

encoder部分是由6个相同的block叠加而成。每层包括两个子层。第一子层是多头注意力机制,第二子层是全连接的反馈神经网络,并且每层的输入输出之间都添加了残差网络

Decoder

decoder部分同样是由6个相同的block叠加而成。与encoder不同的是,中间多加了一个多头注意力机制层。另外一个是decoder部分的多头注意力机制是Masked Multi-Head Attention,确保在解码位置 i i 的时候,只能看到 i i 左边的解码结果

注意力机制

注意力机制可以描述为将一个query, 一个key-value集合映射为输出。具体过程是query和各个key相计算得到weight.再对weight再和各个value相计算得到值求和得到最后的输出。

Scaled Dot-Product Attention (点积)

注意力机制的计算过程完全可以由上面两张图说明。输入的每个词向量和Query矩阵、Key矩阵、Value矩阵相乘,得到各自的query,key,value向量。计算每个输入的词向量输出时,词的query向量和每个词的的key向量

相乘(包括自己的key向量),得到weight向量(对每个词的关注程度或者称为权重)。weight向量经过除以 d k \sqrt{d_k}

(key向量的维度),softmax,之后得到归一化的weight向量。最后再与对应的每个词的value向量相乘,求和

得到最后的输出。

多头注意力机制

多头注意力机制,其实很简单,上文提到的**Scaled Dot-Product Attention **,分别只有一个query矩阵,key矩阵,和value矩阵,可以认为是单头注意力机制。而多头注意力机制有多个query矩阵,key矩阵,和value矩阵。每头

的注意力机制,可以各自并行得计算出结果。最后将各个结构连接起来,通过一个全连接层映射到输出维度。具体的计算流程如下图

Scaled Dot-Product Attention (点积)中scaled什么意思?

作者认为对于 d k d_k 大的值,点积后的值大幅增大,会造成softmax函数处于极小梯度的位置。所以为了抵消这种影响,除以一个 d k \sqrt{d_k} ,缩放点积

位置编码

以上介绍的多头注意力机制并没有把位置信息考虑进去,而对于序列编码来说,位置信息至关重要。所以在词嵌入的过程中,必须加入位置信息。Transformer用得是正弦位置编码,具体的公式如下:

P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) PE(pos,2i)=sin(pos/10000^{2i/d_{model}})

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+1)=cos(pos/10000^{2i/d_{model}})

上面公式可能难以看懂,举个简单的例子吧,比如pos=3, d(model)=123。那么位置3对于的向量应为

[ s i n ( 3 / 1000 0 0 / 123 ) , c o s ( 3 / 1000 0 1 / 123 ) , s i n ( 3 / 1000 0 2 / 123 ) , c o s ( 3 / 1000 0 3 / 123 ) . . . . ] [sin(3/10000^{0/123}), cos(3/10000^{1/123}), sin(3/10000^{2/123}), cos(3/10000^{3/123}) ....]

pos是词在序列中的位置(3),位置编码向量必须与词嵌入向量维度相同,i就是指位置编码向量的位 ( 0 , 1 , . . 122 ) (0,1,..122)

参考

transformer paper

Transformer - 多头自注意力编码机制

自注意力和位置编码

图解transformer

illustrated-transformer

正文到此结束
本文目录