Batch Normalize#
1、BN具体的操作步骤#
其操作步骤分为两部分:
- 每个 mini-batch 内的特征通过减去 \mu 除以 \sigma 的方式归一化到标准正态分布;
- 对经过上一步骤的输出再过一个线性变换;
以上是文字形式的说明,下面是公式形式。
输入:
一个 mini-batch 内的数据为 \{x_1, x_2, ..., x_m \},其中 m 是 mini-batch-size;
记 x_i^{(j)} 为该 mini-batch 中第 i 条数据的第 j 个特征;
\gamma 和 \beta 为可学习的参数;
输出:
y_i^{(j)} 为该 mini-batch 中第 i 条数据的第 j 个特征经过BN后的结果。
公式:
该 mini-batch 中第j个特征的均值:
\mu_{B}^{(j)} = \frac{1}{m} \sum_{i=1}^{m} x_{i}^{(j)}
该 mini-batch 中第j个特征的方差:
\sigma_{B}^{(j)2} = \frac{1}{m} \sum_{i=1}^{m} (x_i^{(j)} - \mu_B^{(j)})^2
减去均值,除上标准化,\epsilon 用于避免除数为0:
\hat{x}_i^{(j)} = \frac{x_i^{(j)} - \mu_B^{(j)}}{\sqrt{\sigma_B^{(j)2} + \epsilon}}
经过BN后的最终输出结果:
y_i^{(j)} = \gamma \hat{x_i^{(j)}} + \beta
2、BN是为了解决什么问题#
2.1 ICS问题(Internal Covariate Shift)#
在深度模型中,随着训练的进行,网络中的参数随着梯度下降在不断更新。一方面,当底层网络中参数发生微弱变化时,由于每一层中的线性变换与非线性激活,这些微弱变化随着网络层数的加深而被加大;另一方面,参数的变化导致每一层的输入分布会发生变化,进而上层的网络需要不停的去适应这些分布的变化,使的模型训练变得困难。这一现象就是ICS问题。
2.2 ICS会导致的问题#
- 由于下层网络的输出数据分布在不断变化,上层网络就需要不停调整来适应这个变化,这会导致网络学习速度的降低;
- 随着模型训练的进行,模型的参数 W 会变大,则每层的输出 \text{Output} = W * \text{Input} + b 也会变大,当使用饱和激活函数时,就容易陷入梯度饱和区,此时的梯度就会很小甚至于接近0.
3、在BN出现前,是如何解决上述问题的#
3.1 白化操作#
ICS产生的原因是由于参数的更新带来的网络中每一层输入值分布的改变,并且随着网络的加深而越严重。缓解ICS最直观的想法就是:固定每层网络输入值的分布来缓解ICS问题。
白化操作:经过变化操作之后会具有如下两个性质:
- 经过白化后,其特征之间的相关性较低;
- 经过白化后,所有特征具有相同的方差;
在BN出现之前,主要是利用白化操作来缓解ICS问题:主要是PCA白化和ZCA白化。
3.2 白化操作的缺点#
- 计算成本太高;
- 白化操作实际上是改变了网络每一层的分布,所以其也改变了网络的表达能力;
4、BN的作用与优势#
- BN将网络每一层输入数据的分布固定在一定的范围内,使上层网络不需频繁的去适应底层网络,加速了模型的学习速度;
- BN能够使每层网络的输入落在饱和激活函数的非饱和区,缓解梯度消失问题;
- BN具有一定的正则化效果,由于每个 mini-batch 的均值与方差不完全相同,相当于增加了随机噪声,使其具有一定的正则化效果;
- 由于BN操作中可学习参数 \gamma 和 \beta 的存在,BN缓解了上述所说的白化操作的第2个缺点;
- 经过BN操作之后,模型权重的缩放(比如 W => aW )会被“抹去”,这使模型对网络中的参数不再过分敏感,训练时更加稳定。
Reference#
https://zhuanlan.zhihu.com/p/34879333