Transformer详解
- 一、RNN循环神经网络
- 二、seq2seq模型
- 三、Attention(注意力机制)
- 四、Transformer
- 4.1 self attention
- 4.2 self-attention的变形——Multi-head Self-attention
- 4.3 Masked Attention
- 4.4 Positional Encoding
- 4.5 Batch Normalization
- 4.6 Layer Normalization
- 4.7 Transformer LN改进方法:Pre-LN
- 五、参考
一、RNN循环神经网络
为了区分不同语境,我们需要神经网络拥有记忆功能。
对于一个文本的每一个词可以看做是一个时序。RNN的每一个时序是一个前馈神经网络,但是为了在每一个时刻都包含前边时序的信息,所以RNN的每个时序共享了隐藏层,即当前时刻的输入不仅包含了当前时刻的词,还包含了前一时刻的隐藏层的输出。
二、seq2seq模型
刚才的例子其实是N对N的循环神经网络,即我的输入序列长度是N,输出也是对应的N长度的序列。其实循环神经网络还有其他的比如:1对N、N对1。
但很多时候我们会遇到输入序列和输出序列不等长的例子但又不是1对N和N对1,如机器翻译,智能问答,源语言和目标语言的句子往往并没有相同的长度。为此我们引出RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型
,也可以称之为Seq2Seq模型
。
Encoder-Decoder框架在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子的语义编码C都是一样的,没有任何区别。而语义编码C是由原句子中的每个单词经过Encoder编码产生的,这意味着原句子中任意单词对生成某个目标单词来说影响力都是相同的,这就是模型没有体现出注意力的缘由。
三、Attention(注意力机制)
图片展示的Encoder-Decoder框架是没有体现“注意力模型”的,所以可以把它看做是注意力不集中分心模型。因为在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子的语义编码C都是一样的,没有任何区别。而语义编码C是由原句子中的每个单词经过Encoder编码产生的,这意味着原句子中任意单词对生成某个目标单词来说影响力都是相同的,这就是模型没有体现出注意力的缘由。
对不同的模块翻译,给予不同的权重
四、Transformer
目前,在NLP领域当中,主要存在三种特征处理器——CNN、RNN以及Transformer,当前Transformer的流行程度已经大过CNN和RNN,它抛弃了传统CNN和RNN神经网络,整个网络结构完全由Attention机制
以及前馈神经网络
组成。
上图中的Transformer可以说是一个使用“self attention”的Seq2seq模型。
如果给出一个Sequence要处理,最常想到的可能就是RNN了,如下图1所示。RNN被经常使用在输入是有序列信息的模型中,但它也存在一个问题——它不容易被“平行化”。那么“平行化”是什么呢?
4.1 self attention
这里就可以看出输出b1是综合了所有的输入xi信息,同时这样做的优势在于——当b1只需要考虑局部信息的时候(比如重点关注x1,x2就行了),那么它可以让 输出的值为0就行了。
4.2 self-attention的变形——Multi-head Self-attention
那么这个Multi-head Self-attention设置多个q,k,v有什么好处呢?
举例来说,有可能不同的head关注的点不一样,有一些head可能只关注局部的信息,有一些head可能想要关注全局的信息,有了多头注意里机制后,每个head可以各司其职去做自己想做的事情。
将每个head上的attention score分数打出,可以具象化地感受每个head的关注点,以入句子"The animal didn’t cross the streest because it was too tired"为例,可视化代码可点此
上图,颜色越深表示attention score越大,我们构造并连接五层的attention模块,可以发现it和animal,street关系密切。
现在我们把8个头全部加上去,见下图,一种颜色表示一个头下attention score的分数,可以看出,不同的头所关注的点各不相同。
4.3 Masked Attention
有时候,我们并不想在做attention的时候,让一个token看到整个序列,我们只想让它看见它左边的序列,而要把右边的序列遮蔽(Mask)起来。例如在transformer的decoder层中,我们就用到了masked attention
,这样的操作可以理解为模型为了防止decoder在解码encoder层输出时“作弊”,提前看到了剩下的答案,因此需要强迫模型根据输入序列左边的结果进行attention。
首先,我们按照前文所说,正常算attention score,然后我们用一个MASK矩阵去处理它(这里的+号并不是表示相加,只是表示提供了位置覆盖的信息)。在MASK矩阵标1的地方,也就是需要遮蔽的地方,我们把原来的值替换为一个很小的值(比如-1e09),而在MASK矩阵标0的地方,我们保留原始的值。这样,在进softmax的时候,那些被替换的值由于太小,就可以自动忽略不计,从而起到遮蔽的效果。
举例来说明MASK矩阵的含义,每一行表示对应位置的token。例如在第一行第一个位置是0,其余位置是1,这表示第一个token在attention时,只看到它自己,它右边的tokens是看不到的。以此类推。
4.4 Positional Encoding
根据前面self-attention介绍中,我们可以知道其中的运算是没有去考虑位置信息
,而我们希望是把输入序列每个元素的位置信息考虑进去,那么就要在 ai 这一步还有加上一个位置信息向量 e^i , 每个 e i都是其对应位置的独特向量。—— e i 是通过人工手设(不是学习出来的)。
Transformer 是以字作为输入,将字进行字嵌入之后,再与位置嵌入进行相加(不是拼接,就是单纯的对应位置上的数值进行加和)
为了使得位置嵌入和字嵌入能够相加,因此位置嵌入维度和字嵌入的维度必须相同
,所以 i∈[0,d),因此就有 k∈[0,d−12]
需要使用位置嵌入的原因也很简单,因为 Transformer 摈弃了 RNN 的结构,因此需要一个东西来标记各个字之间的时序 or 位置关系,而这个东西,就是位置嵌入
4.5 Batch Normalization
- Internal Covariate Shift
在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。
对于激活函数梯度饱和问题,有两种解决思路。第一种就是更为非饱和性激活函数,例如线性整流函数ReLU可以在一定程度上解决训练进入梯度饱和区的问题。另一种思路是,我们可以让激活函数的输入分布保持在一个稳定状态来尽可能避免它们陷入梯度饱和区,这也就是Normalization的思路。
- 我们如何减缓Internal Covariate Shift?
ICS产生的原因是由于参数更新带来的网络中每一层输入值分布的改变,并且随着网络层数的加深而变得更加严重,因此我们可以通过固定每一层网络输入值的分布来对减缓ICS问题。
-
Batch Normalization思路
我们解决了第一个问题,即用更加简化的方式来对数据进行规范化,使得第 l 层的输入每个特征的分布均值为0,方差为1。【但却导致了数据表达能力的缺失】
-
Batch Normalization的优势:
-
BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度
-
BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
-
BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
-
BN具有一定的正则化效果
总的来说,BN通过将每一层网络的输入进行normalization,保证输入分布的均值与方差固定在一定范围内,减少了网络中的Internal Covariate Shift问题,并在一定程度上缓解了梯度消失,加速了模型收敛;并且BN使得网络对参数、激活函数更加具有鲁棒性,降低了神经网络模型训练和调参的复杂度;最后BN训练过程中由于使用mini-batch的mean/variance作为总体样本统计量估计,引入了随机噪声,在一定程度上对模型起到了正则化的效果。
4.6 Layer Normalization
整体做法类似于BN,不同的是LN不是在特征间进行标准化操作(横向操作),而是在整条数据间进行标准化操作(纵向操作)
4.7 Transformer LN改进方法:Pre-LN
五、参考
- NLP中的RNN、Seq2Seq与attention注意力机制
- Transformer入门刨析详解
- Transformer学习笔记一:Positional Encoding(位置编码)
- Transformer 中的 Positional Encoding
- Transformer学习笔记二:Self-Attention(自注意力机制)
- Batch Normalization原理与实战
- Transformer学习笔记三:为什么Transformer要用LayerNorm/Batch Normalization & Layer Normalization (批量&层标准化)