查看原文
其他

【综述专栏】Transformer 论文详细解读

在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。

来源:知乎—北方一瓶川

地址:https://zhuanlan.zhihu.com/p/366014410

在 NLP 中,LSTM、GRU 这种循环神经网络配上一个 Encoder-Decoder 的架构能够实现不错的效果。但是在训练过程中,不同单词之间没法并行,效率低。Transformer[1] 应运而生,它是一个完全依赖 Attention 的模型,用 Positional Encoding 替代了 RNN 的循环结构。Transformer 的并行性很高,速度上提升很多。而且它不光能处理 NLP 领域问题,在 CV 领域也是游刃有余。
Transformer 的模型结构如图 1,左边 Encoder,右边 Decoder,灰色区域是单个 Encoder Layer 和 Decoder Layer 的展开图。
Encoder 由 6 个完全相同的 Encoder Layer 组成,每个 Layer 由两个 Sub-Layer 组成,分别是 Multi-Head AttentionFeed Forward。为了让模型训练更快速稳定,采用了残差连接和 Layer Normalization,所以对于每个 Sub-Layer ,输入是  ,输出是  ,经过绿色模块 Add&Norm 后为  。为了能够进行残差连接,Embedding Layer 和两个 Sub-Layer 的输出维度需要一致,论文里的维度统一设置为  。
Decoder 由 6 个完全相同的 Decoder Layer 组成,每个 Decoder Layer 由三个 Sub-Layer 组成:
1)Maked Multi-Head Attention,相比于 Encoder 的 Attention,它加入了掩码,遮住当前单词后面的内容;
2)Multi-Head Attention,用 Encoder 的输出作为 Key 和 Value,Query 由 Decoder 提供;
3)Feed Forward,与 Encoder 的一致,都是两个全连接层。Decoder 也采用了残差连接和 Layer Normalization,与 Encoder 一致。
我将按照下图中的序号介绍 Transformer。

图1 Transformer整体结构


01

Encoder 的 Multi-Head Attention
一句话中的词语存在相互依赖关系,比如指代关系、修饰关系等,所以单个词语是很难表达完整含义的。因此在 NLP 处理中需要有一种机制来刻画词语依赖,这个机制就是 Attention
我们知道在神经网络中,每个单词都被映射成了一个嵌入向量,这个向量蕴含着一个单词的全部含义。那么 Attention 要做的就是把其他相关单词的信息融入到当前的嵌入向量中,让这个单词的嵌入向量随着模型层数的加深,表述地更加清晰、完整。
所以在神经网络中,如何用可微的操作实现这个过程呢?Self-Attention。简单介绍下 Self-Attention 的原理。
1. Self-Attention 把一个单词的嵌入向量映射成三个相同维度的新向量:查询 Query、键 Key、值 Value
2. 当处理某一个单词时,这个单词就会用自己的 Query 进行查询,跟当前序列中,所有单词的键 Key 进行相似度比对。全部比对完毕后,就得到了一个相似度向量,这个向量的维度和当前句子里的单词数量相等,向量里的每一个元素就代表对应位置的单词和发出 Query 的单词之间的相似度,值越大,相似度越高
3. 有了这个相似度向量以后,就可以对每个单词的值 Value 进行加权求和了,最终得到一个新的向量,这个向量就融入了相关单词的信息
原理上大概是这样,具体公式如下:
其中  代表 Query 的矩阵, 代表 Key 的矩阵(注意  的第二个维度都是  ,必须相同,因为  运算对维度有限制),  代表 Value 的矩阵。论文中他们的矩阵维度相同,都是 [句子长度,嵌入向量维度],也就是要求  。
Self-Attention 里面存在两个问题会影响效果:
第一个问题是  方差大,影响训练稳定性。设  是  中一个单词的向量,  是  中一个单词的向量。我们可以假设  中的每一维都是均值为 0,方差为 1 的独立同分布。那么由统计学知识可得  的均值为 0,方差为  。我们知道,模型中某一层的方差过大时,训练就会不稳定,所以 Transformer 在这里进行了缩放(Scale),让方差归 1,并给这种方法起名叫做 Scaled Dot-Product Attention。公式改为:
第二个问题是 Value 加权求和会降低词语分辨率。对于一个单词,如果他依赖的其他单词只有一个,那加权求和效果很好,但实际情况是多个。即使多个依赖单词的权重都很高,在加权求和后,神经网络也无法清晰地使用多个单词,只能笼统地使用一个“语境”。所以 Transformer 对这种 Single-Head Attention 方法做了改进,提出 Multi-Head Attention。也就是将原有的注意力机制重复了  次,并将结果拼接、映射,同时为了降低算量,缩小了  的维度,论文中是让  ,也就是把  在纵向分割成了  份。
下面用一张图来详细描述下 Multi-Head Attention 的整个过程:

02

Decoder 的 Masked Multi-Head Attention
Decoder 在预测的时候,还是采取自回归的方式,一个单词一个单词地顺序生成。在生成某一个单词的时候,会把前面所有已经生成的单词都输入进去。但在训练时,不输入已经生成的单词,而是直接输入标签。这样的话就需要注意一个点:在训练的时候,Decoder Attention 只能使用当前单词前面的标签,后面的要屏蔽,这样才能和预测场景相符。
所以 Multi-Head Attention 需要加一个 Mask。考虑到标签在输入到 Decoder 的时候向右平移了一位,所以 Mask 在屏蔽的时候,要让当前单词和当前单词以前的向量通过,当前单词以后的设为负无穷。如下图,在 Mask 里面,灰色填充表示通过,白色表示屏蔽,Attention matrix 经过 Mask 后,通过的元素不变,不通过的元素用负无穷替换。

03

Decoder 的 Multi-Head Attention
Decoder 的单词向量要融入 Encoder 的编码信息,所以 Multi-Head Attention 的  由 Decoder 提供,  由 Encoder 提供。得到的加权和是当前单词对 Encoder 编码信息的按需提取,这个结果和 Decoder 的单词向量相加,实现了残差结构,同时也实现了编码信息与解码信息的融合。

04

Feed Forward Networks
这个就是普普通通的全连接层,用来映射每个单词的向量。Transformer 用了两个全连接层,中间使用了一个 ReLU 激活函数,公式如下:
这里需要注意下:Attention 处理单词之间的交互,FFN 则处理一个单词向量的表示,不涉及单词交互,从公式上就可以看出来,公式里面只有一个单词向量  ,没有其他单词向量。

05

Layer Normalization
对于 NLP 任务,PowerNorm 论文中有一张图,清晰地点明了 Layer Normalization 和 Batch Normalization 的区别。
Transformer 中如果使用 Batch Normalization 进行归一化,效果会很差,因为每句话的序列长度不同。而 Layer Normalization 对序列长度不敏感,所以效果会好一些。

06

Positional Encoding
为了让 Transformer 能够提取序列中的位置信息,需要对每个位置进行编码,融入到 Embedding 中,让模型能够感知到相对位置变化。Positional Encoding 包括两个参数,一个是当前单词的位置  ;另一个是嵌入层的当前维度  或  ,当维度为偶数的时候(  ),使用正弦函数,奇数(  )用余弦函数。公式如下:
 前面提到过,是模型中的向量维度,论文中设置为 512。
为什么把 Positional Encoding 设置成这个形式呢?一个很重要的原因是它可以让相对位置只与距离有关。也就是说,两个间隔为  的位置向量,他们可以由一个只与  相关的矩阵进行转换。这样的话,模型能够很好地注意到单词之间的相对位置。论文原话是这样讲的:
We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PEpos+k can be represented as a linear function of PEpos.
下面给出证明过程,先对表达式做一个化简,用  替换掉  ,得到下式:
设  处的位置向量为  ,表达式如下:
当前的位置向量是  ,距离为  的位置向量是  ,目标是找出一个只与  相关的  ,让它满足下式:
为了找出  ,可以对等号右边进行展开。这里选择临近的两个相同  的单元进行展开,如果能够证明这两个单元能够展开成类似等号左边的形式,那么整个位置向量  就能展开成  的形式。展开过程如下:
上面公式最后一行就是变换结果,左边一项对应着  的元素,右边对应着  的元素。
因为任意临近的两个相同  的单元可以变换成上面的形式,所以对于任意  都做这样的展开,拼接后就能得到  ,如下式:
所以存在一个只与  相关的  ,满足下式:
这样的话,模型就能够很好地注意到单词之间的相对位置。

参考

Attention Is All You Need  
https://papers.nips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“综述专栏”历史文章


更多综述专栏文章,

请点击文章底部“阅读原文”查看



分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存