Batch Normalization 与 Layer Normalization

Feature Scaling

假设我们现在训练的模型有很多特征,我们现在训练的网络长下面这个样子:

[z = activate(x_1 W_1 + x_2 W_2 + bias) ]

其中(x_1,x_2)的数据级别差的比较多,比如一个在100左右,一个在0到1之间,那么两个权重矩阵对最后结果的影响是不同的,在train的过程中你从不同方向看它的梯度是不一样的。为了达到比较好的训练效果,我们有如下两个方法。

Down learning rate

这是一个十分常用的方法,通过降低学习率达到矩阵参数学习较好的效果。

Normalization

将不同数据归一化处理,改变数据的分布特性,能够有效地提升训练效果。

常用的归一化方法有Batch Normalization(BN)Layer Normalization(LN)

Batch Normalization

Batch Normalization tutorial on YouTube

Batch Normalization是一种常见的达到Feature Scaling的手段。

Feature Scaling

现在我们要对数据特征做归一化处理。假设Batch size为(N),我们对每一个feature,都去从data batch中计算这一个dimension的均值(mu)和标准差(sigma),注意这两个量也是vector,然后做element wise的运算。

[ ilde z = frac{z - mu}{sigma} ]

In general, gradient descent converges much faster with feature scaling than without it.

In DNN

在DNN中,我们input可以做feature scaling,output对于下一层而言也是input,所以输出也可以归一化,下面以先经过BN再经过Activation function为例。

train set时,我们一般不会只用一组数据去训练,而是选择一个batch。batch size为(N)的训练,我们可以这样计算均值和标准差:

[mu_i = frac{1}{N} sum_j x_{ij}\ sigma_i = sqrt{frac{1}{N} sum_j (x_{ij} - mu_i)^2} ]

Internal Convariate Shift

所谓Internal Convariate Shift是值在训练的时候,我们不断调整整个网络的参数,但是我们调好后面的网络后,前面的网络参数仍然在变化,这导致我们训练的效率就会很低。共享参数的网络模型也面临这样的问题,比如RNN网络。

为解决这个问题,可以降低学习率。通过降低学习率,让后面的网络不会太早的就达到适应前面不准确的网络的参数。然而我们都知道,降低学习率一般意味着时间会长一些。

另一个解决办法就是Normalization,归一化后,数据的统计特性就会比较确定,前面的参数变化影响相对较小,所以解决Internal Convariate Shift也是我们BN的一个优点。

局限

需要注意,BN有一个要求,(N)必须足够大才能表示整个数据集的统计特性。因为要避免上面的 Internal Convariate Shift 问题,如果输入有噪音或者较多离群点,那么我们得到的统计结果是有偏差的,这一次train也是有问题的。

以及在 Back Propagation 时,均值和标准差是依赖于layer的输出(z)的,不能直接将其作为Constant计算梯度。

Testing

用有BN的NN去测试时,我们发现一个问题,就是没有batch了。通常解决方法有下面两个:

  • train结束后矩阵参数已经确定了,可以从训练数据中再跑出适应这个model的均值和方差来使用。
  • 在训练过程中记录一下两个参数,然后给epoch大的参数赋予更大的权值,得到整个过程的加权结果来使用。

Batch Normalization 的优点

larger learning rate

前面已经提到了它允许我们使用较大的learning rate来快速达到想要的结果。

alleviate vanishing gradient

这是我们在Activation function前面进行Normalization的优势之一。它可以让我们的数据分布尽量在梯度较大的区间。比如后面有sigmoid,那么我们会比较希望数据均值在0附近。

如果你希望得到其他的不同分布,来适应一些均值不在0是梯度更大的Activation Function,可以采用下面这种做法:

[hat z = hat sigma ilde z + hat mu ]

不容易受初始化影响

我们可以容易地从数学上证明(W)参数初始化不稳定的影响会被BN消除。

[frac{k W x}{k sigma} = frac{W x}{sigma} ]

Layer Normalization

Why Layer Normalization

在上文中,我们对 Batch Normalization 提出了一个要求就是 batch 要求足够大,但是在一些情况下这个条件很难满足,比如GPU显存无法容纳这么多的data,或者由于RNN这种动态模型Sequence可能长短不一导致最长的那组最后batch过小。

在这种前提下,我们就提出了layer normalization。

做法

相比于BN,Layer Normalization(LN)的计算均值和方差的维度是垂直的,LN不考虑batch,而是考虑data中不同的dimension做归一化,下面是一个RNN的LN例子。

(H)是隐藏层维数。

[mu = frac{1}{H} sum_j x_j\ sigma = sqrt{frac{1}{H} sum_j(x_j - mu)^2} ]

Normalization:

[ ilde z = frac{z - mu}{sigma} ]

一个人没有梦想,和咸鱼有什么区别!
原文地址:https://www.cnblogs.com/TABball/p/12727240.html