5.LayerNorm
在NLP中很少使用BN,基本都使用LN,因为BN的效果很差;
后续也有很多对BN的改进,以支持NLP任务。
特征缩放是为了消除量纲的影响,让模型收敛得更快。
BN是对一个Batch中的多个样本的同一维度的数据进行归一化处理,可以看作一个Batch中的所有样本的同一个特征(例如人的身高、体重等多个维度分别进行BN)。
BN优点:
可以解决内部协变量偏移;
缓解了梯度饱和问题(如果使用sigmoid激活函数的话),加快收敛。
BN的缺点:
batch_size较小的时候,效果差
BN的假设是使用一个Batch中样本的均值和方差来模拟全部数据的均值和方差,此时如果Batch的数量很少时,就会出现假设偏差较大的情况。
BN在RNN中效果比较差
这一点和第一点原因很类似。
- 因为RNN的输入是动态的,即数据的长度可能不一样,因此不能有效地得到整个Batch的均值和方差。
LN是对一个样本的所有特征进行缩放,例如对一个句子样本的所有单词做缩放。
为什么使用LN、不使用BN:
可以看到,相比于BN,LN在NLP任务中更有意义,例如我和今具有不同的语义信息,而LN是对一个句子进行缩放,一个句子的所有词存在于同一个语义信息中,这样可以得到更容易理解的语义。
前馈神经网络:
同时,FFN也是只考虑对单个位置进行建模,不同位置之间共享参数,类似于1*1的pointwise的CNN。
6.Decoder
之所以要进行Mask遮挡:
没有遮挡
可以看到, 所有单词都会为You这个单词提供信息。
但是通过这样的方式训练出来的模型,在预测阶段会出现问题,比如预测阶段的当前单词为You,并不知道ground truth中You后面的信息(单词)什么(这也就是预测的出发点),看不见未来时刻的单词;因此如果在训练时不遮挡掉后面的单词,则模型在训练和测试时就会存在gap。
有遮挡
在训练和测试时都遮挡掉当前单词后面的单词,从而消除了训练和测试的gap,保证了一致性。
遮挡可以直观地理解为:在进行翻译时,遮挡掉后面的单词,让人来翻译得到后面位置的单词,也就是通过训练得到答案,而不是直接给出答案。
同时需要注意,在进行Mask时,有2个地方需要分别考虑:
(1)自注意力层Mask Multi-Head Attention,有2部分需要进行Mask,一部分是解码端输入的Padding的 Mask,另一部分是当前单词后面的单词进行Mask(上三角矩阵):
图示如下:
矩阵中,为1的位置是应该遮挡起来、看不到的。