Batch Normalization

背景

由于下层的Layer的参数发生改变,导致上层的输入的分布发生改变,最后深度神经网络难以训练。(注意:底层为最下层)

  • Internal Covariate Shift (内部协变量偏移): 在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程
  • Internal Covariate Shift 带来的问题
    • 上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低
    • 网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度

Batch Normalization

  • 算法流程图
    BN

    ($\epsilon$是为了增加训练稳定性而加入的小的常量数据)
  • 测试阶段如何使用Batch Normalization?

    • BN在每一层计算的$\mu$与$\sigma^2$都是基于当前batch中的训练数据,但是这就带来了一个问题:在预测阶段,有可能只需要预测一个样本或很少的样本,没有像训练样本中那么多的数据,此时$\mu$与$\sigma^2$的计算一定是有偏估计,这个时候该如何进行计算?
    • 利用BN训练好模型后,我们保留了每组mini-batch训练数据在网络中每一层的$\mu{batch}$与$\sigma^2{batch}$。此时我们使用整个样本的统计量来对Test数据进行归一化,具体来说使用均值与方差的无偏估计:
    • 得到每个特征的均值与方差的无偏估计后,我们对test数据采用同样的normalization方法:
  • batch_normalization做了normalization后为什么要变回来?即 scale and shift

    如果只做normalize在某些情况下会出现问题,比如对象是Sigmoid函数的output,而且output是分布在Sigmoid函数的两侧,normalize会强制把output分布在Sigmoid函数的中间的非饱和区域,这样会导致这层网络所学习到的特征分布被normalize破坏。而上面算法的最后一步,scale and shift可以令零均值单位方差的分布(normalize之后的分布)通过调节$\gamma$和$\beta$变成任意更好的分布(对于喂给下一层网络来说)。因为这个$\gamma$和$\beta$是在训练过程中可以学习得到参数。

BN的优势

  • BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度
  • BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
  • BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
  • BN具有一定的正则化效果

    在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。

BN的缺陷

  • 不适用于mini-batch非常小的训练环境
  • 不适用于RNN,因为它是一个动态的网络结构,同一个batch中训练实例有长有短,导致每一个时间步长必须维持各自的统计量,这使得BN并不能正确的使用。

参考

Donate comment here