Batch Normalization原理

batch normalization是指在神经网络中激活函数的前面,对每个神经元根据mini bach中统计的m个x=wu+b进行normalization变换,即:

\hat{x}^{(k)}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}

,这种思想源于一种理论:当变量的分布一直变化时,函数很难寻得最优解。但是这样相当于把非线性函数替换为线性函数了(归一化后数据分布集中在0附近,对应sigmoid函数0附近区间的激活函数近似为线性函数),多层线性函数的叠加对神经网络来说是没有意义的。所以论文作者另引进了scale和shift因子来增加非线性:

\hat{y}^{(k)}=\gamma ^{(k)}\hat{x}^{(k)}+\beta ^{(k)},其中scale和shift因子是可学习的参数。这样不就变换过来又变换回去了吗?作者并没有详细说明。可以理解为BN可以在线性和非线性之间取得一个平衡吧,保证网络非线性表示能力的同时提高训练速度。

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

这样做的好处有以下几点:

1、提高梯度在网络中的流动。normalization能够使特征全部缩放到[0,1]之间,这样在反向传播的时候梯度都是在1左右,避免了梯度消失的现象。

2、加快收敛。归一化后的数据能够快速的达到收敛。

3、减小模型训练对初始化的依赖。

4、控制过拟合,可以少用或不用Dropout和正则。

5、允许使用较大的学习率。

注意:如果在batch很小的情况下,batch normalization会对训练过程产生负面影响。

BN的inference过程:

既然BN是基于mini batch统计的那么当inference一个实例时怎么办呢,实际上是把在训练过程中统计全局的E[x]Var[x]保存下来解决的,在推理时直接用即可:

y=\frac{\gamma }{\sqrt{Var[x]+\varepsilon }}.x+(\beta -\frac{\gamma .E[x]}{\sqrt{Var[x]+\varepsilon }})

absorb bn:

实习期间学到的骚操作。仔细看上面那个公式,形式是不是有点眼熟?\frac{\gamma }{\sqrt{Var[x]+\varepsilon }}(\beta -\frac{\gamma .E[x]}{\sqrt{Var[x]+\varepsilon }})都是常数?没错,就是跟卷积操作很像:

x=w.u+b

所以有了absorb bn操作,通过把\frac{\gamma }{\sqrt{Var[x]+\varepsilon }}操作吸收进w里,(\beta -\frac{\gamma .E[x]}{\sqrt{Var[x]+\varepsilon }})吸收进b里面,从而在inference时节省大量计算,同时减小网络模型参数量。

TensorFlow中的batch normalization:

tf.contrib.layers.batch_norm()函数中的decay参数:我就不啰嗦了,上官方参数说明:

decay: Decay for the moving average. Reasonable values for `decay` are close 
      to 1.0, typically in the multiple-nines range: 0.999, 0.99, 0.9, etc. 
      Lower `decay` value (recommend trying `decay`=0.9) if model experiences 
      reasonably good training performance but poor validation and/or test 
      performance. Try zero_debias_moving_mean=True for improved stability. 

 小总结:网络过拟合情况比较严重时,可以尝试使用更小的decay值,比如0.9。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值