NLP预训练语言模型(3):变压器结构的逐步分析

Transformer是近两三年NLP领域非常流行的一种模型,本质上是一种编解码结构,所以经常用在机器翻译(输入一句话输出一句话)、语音识别(输入语音输出文本)、问答系统等领域。基于《你需要的只是关注》一文,本文阐述了变压器的结构。涉及的图片都是论文中或者经典图片,参数值都是论文中的。具体问题可以具体调整。

Transformer由模块组成:关注(包括多头自关注&;Context-Attention)、归一化(使用层范数,与批范数不同)、掩码(填充掩码& amp;序列掩码),位置编码,前馈网络(FFN).

变压器的总体架构如下图所示:

这是典型的变压器结构。简单来说,Transformer =预训练(输入)+编码器* N+预训练(输出)+解码器* N+输出。

模型的运行步骤如下:

①嵌入输入,可以使用Word2Vec等工具,维度为512。嵌入后再结合位置编码,记录输入单词的位置信息。

(2)预处理后的输入向量经过多头注意层处理,加残差和正则化,数据给FFN(全连接层),再加残差和正则化。重复地,在六个这样的编码器(即Nx=6x)之后,编码部分结束。

③编码部分第一个解码器的第一个注意接受来自输出的信息,其余的都接受来自编码器和上级解码器的信息。最终输出的串行生成,每个生成的输出都被输入到解码器底部的解码器的输入中。

④还有六个解码器,最终输出要经过线性层和Softmax才能得到最终输出。

需要注意的是,编码器和解码器的结构是一样的,只是不享有重量;在编码器部分,每个单词在注意路径层都有一个依赖关系,它是串行执行的,而在FFN层没有依赖关系,它是并行执行的。

在这个结构中,有几种注意,包括:自我注意&;语境注意和。规模点产品的关注和。多头关注.需要注意的是,比例点积关注度和多头关注度是关注度的两种计算方法,后面会介绍。

这种关注的计算公式是:

以第一个编码器为例,说明如下过程:

①为编码器的每个字创建以下三个向量:查询向量、关键向量、值向量。这三个向量是通过将输入嵌入乘以三个向量矩阵而获得的。需要注意的是,嵌入向量维数为512,Q K V向量维数为64。

②计算分数:对于每个单词,计算其自身与所有的乘积。

③关注度的计算:根据上面的关注度公式,将分数除以一个固定值(这个操作称为“scaled”),进行Softmax变换,使所有分数之和为1。最后乘以相应的位置,得到这个词的关注度。

这是缩放点积注意力机制的计算方法,在Transformer架构中两种注意力都使用,不同的是Q K V的来源有些不同。

注:Softmax为什么要除以一个根号?文中给出的理由是,原和既是均值为0的变量,方差为1。假设两者相互独立,其乘积的分布是均值为0,方差为0。除以根号使得Softmax中的值保持均值为0,方差为1,有利于梯度计算。如果不加根号,计算会收敛很慢,因为Softmax中的值在渐变消失区。

进一步思考:为什么很多关注中没有成比例的步骤?注意有两种,一种是乘法,一种是加法。实验表明,加法虽然看起来简单,但是计算起来并没有快多少(tanh相当于一个完整的隐藏层),在维数较高的情况下确实更好,但是如果加上Scaled就差不多了。为了加快计算速度,在Transformer中选择了乘法,如果维度很大,则会添加缩放。

多注意机制也是一种处理技能,主要提高注意层的性能。因为上面说的自我关注包含了其他位置的代码,所以占主导地位的仍然是自己位置上的词,有时候我们需要更多的关注其他位置,比如机器翻译中代词指的是哪个主语。

多头关注的机制是通过H个线性变换投影Q、K、V三个矩阵,然后计算H次自我关注,最后拼接H次计算结果。

在编码器的自我关注中,Q K V是前一个编码器的输出。对于第一个编码器,它们是输入嵌入和位置编码的总和。

在解码器的自我关注中,Q K V也是前一个解码器的输出。对于第一个解码器,它们是输入嵌入和位置编码的总和。需要注意的是,在这一部分,我们并不想得到后期的数据,只想考虑预测的信息,所以我们要进行序列屏蔽(后期)。

在编码器-解码器注意(即上下文注意)中,q是解码器上层的输出,K V是编码器的输出。

LN用于Transformer,而不是BN(批量归一化)。什么是规范正常化?一般来说,它可以用下面的公式来表示:

配方1为规范化治疗前,配方2为治疗后。归一化是对数据分布的调整,比如数据本身是正态分布,调整后的数据分布是标准正态分布,相当于调整均值和方差。这样做的意义在于激活值落入激活函数的敏感范围,梯度更新变大加速训练,消除极值提高训练稳定性。

变压器用的是LN,不是BN。先看两者的区别如图:

LN对每个样本本身进行标准化,而BN对同一维度的一批数据进行标准化,这就是跨样本。在CNN任务中,BatchSize较大,训练时全局记录样本的均值和方差,适用于BN。在时间序列问题中,统计每个神经元是不现实的。LN的极限相对小很多,即使BatchSize=1。

掩码有两种,一种是填充掩码,一种是序列掩码,出现在《变形金刚》中的不同位置:填充掩码出现在所有缩放的点积关注中,序列掩码只出现在解码器的自关注中。

因为每批输入序列的长度不同,所以使用填充掩码来对齐序列长度。简单来说,短序列与长序列对齐,对齐方法是加0。补充的地方没有意义,不要关注。其实我们并不是直接在对应的位置上加0,而是加-inf(负无穷大),这样在Softmax之后,这些位置的概率就接近于0了。

在处理过程中,填充掩码是一个布尔张量,其中false是加0的地方。

前面说过,序列掩码的作用是防止解码器看到当前时刻之后的信息,所以后面的部分信息要完全覆盖。具体就是生成一个上三角矩阵,上三角的值都是1,下三角和对角线都是0。

在解码器的自关注部分,序列掩码和填充掩码同时工作,它们作为掩码相加。

RNN处理顺序问题是自然有序的,《变形金刚》消除了这种对时间顺序的依赖。以机器翻译为例,如果输出的是一个完整合理的句子,就需要在输入的数据中加入位置信息,否则输出的每一个字可能都是对的,但不会成句。位置编码是对输入信息的位置进行编码,然后添加到输入嵌入中。

位置编码使用正弦和余弦编码:

在偶数位置,使用公式1的正弦编码,在奇数位置,使用公式2的余弦编码。由于正余弦函数的特性,这种编码既是绝对位置编码,也是相对位置编码。

相对位置编码信息主要取决于三角函数和角度公式:

FFN是一个全连通网络,依次经历线性变换、ReLU非线性变换、线性变换。公式如下:

参考资料:

【整理】说说变形金刚

推特:变形金刚的细节

举例说明什么是变形金刚。

文本分类练习(八)——变压器模型

深度学习:变形金刚模型