Transformer论文里Batch Norm和Layer Norm异同

即Attention is all you need。 

Transformer论文里Batch Norm和Layer Norm异同_第1张图片

Batch Norm是每一次我们把我们的列,即每一个特征将其在一个mini-batch里面。

Transformer论文里Batch Norm和Layer Norm异同_第2张图片

将其变为均值为0,方差为1。

我们如何把一个向量变成均值为0,方差为1呢?我们将其均值减掉,再除以方差即可。

这个地方我们算均值的时候,是在每个小批量里面。即这条向量里面算出它的一个均值和方差。

在训练的时候,我们可以做小批量,但是在预测时候,我们需要将全局的均值给算出来。我们可以认为是将所有的数值扫了一遍之后,在所有数据上那些平均的均值方差保存起来,在预测的时候再使用。

且batch norm可以使向量通过学习放成一个任意方差为某个值,均值为某个值的东西。

Layer Norm跟Batch Norm在很多时候都是一样的。除了他们两个做的方法有点不一样之外。

如果同样是上图的一个二维输入的话,Layer Norm就是对每个样本进行了normalization,而不是对每个特征。

Transformer论文里Batch Norm和Layer Norm异同_第3张图片

 从之前的列变为了现在的行均值为0,方差为1。一行代表一个样本

layer norm便是把整个数据转置一下,放到batch norm里面出来的结果,再转置回去。

以上是我们的数据是二维的时候,最简单的一种情况。

但是在我们的Transformer里面,或者正常的RNN里面,输入是一个三维的。

我们输入的是一个序列的样本,每个序列里面有很多的元素,我们给一个句子里面有n个词语

每个词有一个向量, 且还有batch的话,那这是一个三维的。

列是我们的序列长度(seq),对每个seq(每个词)我们有自己的向量

Transformer论文里Batch Norm和Layer Norm异同_第4张图片

如果我们还是使用batch normalization的话,每次我们是取一根特征,

 Transformer论文里Batch Norm和Layer Norm异同_第5张图片

然后将每个样本里面所有的元素,将其均值变为0,方差变为1。

如果是layer norm,那就是黄色的框横切一刀。

Transformer论文里Batch Norm和Layer Norm异同_第6张图片

日常的当中,layer norm会用的多一点。

一个原因是:在持续的序列模型里面,我们每个样本长度可能会发生变化。

 Transformer论文里Batch Norm和Layer Norm异同_第7张图片

 如果这样的话,两种切法会带来不一样的结果。

batch norm:

Transformer论文里Batch Norm和Layer Norm异同_第8张图片

layer norm:

Transformer论文里Batch Norm和Layer Norm异同_第9张图片

这里主要的问题是在算方差和均值上面。

对于batch norm来说,画斜杠的部分是对我们有用有效的,其余0部分无用。

这样的话,我们会发现如果我们的样本长度变化比较大的时候,我们每次做小批量算出来的均值和方差抖动可能会比较厉害。

另外一点使我们前边提到的,我们在做预测的时候,我们要把我们全局的均值和方差记录下来。

那么这个全局的均值和方差,如果碰到了一个新的预测样本,这个样本非常的长,我们在训练的时候没见过这么长的,那么我们之前算的均值和方差可能不是那么好用的。

反过来讲,layer norm相对来说,没有太多这个问题,是因为它每个样本都是自己来算自己的均值和方差,不需要存在一个全局的均值和方差(因为均值方差是每个样本自己来做)。所以不管均值是长还是短,算均值是自己来算的,这样相对来说会稳定一些。

 

 

 

 

 

 

你可能感兴趣的:(NLP&CV,batch)