批归一化(Batch Normalization)

一:前言

        深度神经网络训练时,由于每一层的参数都会随训练进行而不断更新,参数的变化导致每一层的输入分布会发生改变,进而上层的网络需要不停地去适应这些分布变化(这一过程被称作Internal Covariate Shift),使得我们的模型训练变得困难。

Internal Covariate Shift(内部协变量偏移)会给深度神经网络的训练过程带来诸多问题:

1.上层的网络需要不断适应输入数据的分布的变化,导致学习速率降低,并使学习过程变得不稳定

2.网络的训练过程容易陷入梯度饱和区,使得网络收敛速度减慢,从而导致学习过程过早停止。

3.网络参数的更新在实际应用中一般会采用较小的学习率,这同样也会降低收敛速度。

此前对于梯度饱和问题,有两种解决思路。第一种就是使用非饱和性激活函数,比如ReLU。另一种思路是,我们可以让激活函数的输入分布保持在一个稳定状态来尽可能避免它们陷入梯度饱和区,这也就是Normalization的思路。

但以上思路同样存在着一些问题。比如第一种思路我们在网络的训练过程中就无法用到饱和性激活函数(如sigmoid,tanh等);而第二种思路使用常见的正态分布归一化时,虽然让每一层网络的输入数据分布都变得稳定,但归一化后的输入数据会被限制在正态分布下,导致网络不能很好地进行学习,进而削弱了网络的性能。

二:Batch Normalization(BN)的思路

为了解决上述存在的问题,Batch Normalization在正态分布式的归一化的基础上进行修改,增加了尺度变换γ偏移β,使得网络可以为每个神经元自适应地学习一个量身定制的分布(均值为β,标准差为γ),这样每一层可以进行独立的学习,网络不必不断去适应上一层网络中输入的变化,进而提高了整个神经网络的学习速度,具体步骤如下图所示:

 三:Batch Normalization的作用

        通过增加尺度变换和偏移,使得网络每一层可以进行独立的学习,缓解了网络训练过程中带来的梯度消失问题,在保留了原始输入数据分布信息的同时也保证了网络的收敛速度。

 四:批归一化BN层在网络上的位置

1.放在激活层之前。可以有效避免归一化破坏非线性特征的分布,还可以使数据点尽量不落入饱和型激活函数的饱和区域,缓解梯度消失的问题。

2.放在激活层之后。对于ReLU等非饱和型激活函数而言,可以避免数据在激活层之前被转化成相似的模式从而使得非线性特征分布趋于同化。

总结:BN层无论放前面还是后面,具体视实验效果而定。起初原作者是放前面的,出发点是可以解决梯度消失问题,但大多数实验表明放后面更好,可以提升收敛速度,解决过拟合问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值