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的运算。

\[\tilde 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 \tilde 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:

\[\tilde z = \frac{z - \mu}{\sigma} \]

posted @ 2020-04-18 18:10  TABball  阅读(230)  评论(0编辑  收藏  举报