在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于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 Attention 和 Feed 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
这个就是普普通通的全连接层,用来映射每个单词的向量。Transformer 用了两个全连接层,中间使用了一个 ReLU 激活函数,公式如下: 这里需要注意下:Attention 处理单词之间的交互,FFN 则处理一个单词向量的表示,不涉及单词交互,从公式上就可以看出来,公式里面只有一个单词向量 ,没有其他单词向量。 05
对于 NLP 任务,PowerNorm 论文中有一张图,清晰地点明了 Layer Normalization 和 Batch Normalization 的区别。 Transformer 中如果使用 Batch Normalization 进行归一化,效果会很差,因为每句话的序列长度不同。而 Layer Normalization 对序列长度不敏感,所以效果会好一些。 06
为了让 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
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“综述专栏”历史文章
更多综述专栏文章, 请点击文章底部“阅读原文 ”查看
分享、点赞、在看,给个三连击呗!