Batch Normalization学习

前言

本文旨在学习和记录,如需转载,请附出处https://www.jianshu.com/p/2866e51c387d

1、BN介绍

Batch Normalization是由Sergey Ioffe等人在2015年提出的批归一化处理。论文名叫:
Batch Normalization : Accelerating Deep Network Training by Reducing Internal Covariate Shift
Batch Normalization(简称BN)现已成为深度神经网络最常用的训练技巧之一,在很多经典的网络中都被采用。采用BN处理,能够让我们采用更大的学习率来训练网络,以及不用很小心的调节网络参数初始化,BN也可以看作是正则化的一种,通过BN,某些时候我们在训练网络时不需要加Dropout以防止网络过拟合。

2、Internal Covariate Shift

  • 作者在摘要中提到,训练神经网络时,当前一层的参数发生变化的时候,后面的层的参数分布也会随之变化,这会导致网络训练变慢,这也是之前训练网络为什么要小心调节初始化网络参数的原因,如果我们同时采用饱和的非线性的激活函数(比如sigmoid),这回使训练模型变得十分困难。作者将这一现象称之为Internal Covariate Shift。针对该现象,作者将每一层网络的输入都进行归一化,这就是BN,而且在实验中采用mini-batch训练来归一化。作者解释到采用mini-batch来训练网络时,表明mini -batch输入训练梯度损失是整体训练集的一个估计,随着batch_size的增大,这个估计将会更加靠近;另外,计算一个batch的效率比计算batch个单独训练数据输入的效率要高,因为训练时对batch个训练数据是并行处理的。
  • 作者也提到由于每一层的输入都收到前面层的影响,所以如果有一些小的改变,随着网络层数的加深,其变化也能被放大。层输入数据分布的变化将会导致层需要适应不同的新的分布。

3、BN具体做法

BN的具体做法是对每一层的输入数据进行批规范化,固定为高斯分布。均值为0,方差为1。另外,采用了缩放因子和平移因子。
其中k代表网络的层数

作用:
如果采用tanh或者sigmoid饱和非线性激活函数时,用BN会控制饱和程度,有效减小梯度消失问题。
其中缩放因子和平移因子是需要优化的。
当:

则经过先归一化到0均值1方差,然后缩放平移就成恒等映射了。


算法过程:
eg: 假设X中间特征数据维度为(N,D),N代表数据个数,D代表数据特征维度
正向传播

  1. 求出每一列特征的均值
x_mean = np.mean(x,axis =0 )
  1. 求出其方差
x_var = np.var(x,axis =0 )
  1. 归一化处理
x' = (x -x_mean)/(x_var+eps)^0.5
  1. 放缩和平移
out = \lambda *x' + \beta

注意:
每次迭代循环时需要保存x_mean和x_var。因为和是待学习的参数,在训练中我们实际上需要找到一个x到out的映射关系(其实就是归一化操作),但是我们在测试的时候需要根据训练得到的全局均值和方差来进行归一化,在tensorflow中,如果不设置全局的均值和方差,则测试效果就会特别差。训练时需要对所有batch的均值和方差记录下来,然后测试时对其做无偏估计,作为整体均值和方差然后进行测试。


一般在现有的深度学习框架下面关于BN的调用都含有momentum这个变量,以下是怎么计算整体的均值和方差的方法:


起初训练时
,之后随着训练迭代一直更新,训练结束
就作为全局均值和全局方差
反向传播:
过程为:






对其求导有:




其中,有关均值和方差在求导中的求和给省略了

4、总结

过小的权重初始化容易让后面层的激活值衰减到0,导致每一层的输出值都一样。过大的权重初始化容易导致饱和非线性激活函数的梯度为0。BN将每一层输入数据变为均值为0方差为1的正态分布,然后通过平移和缩放变成该有的分布,可以抑制初始化权重较差造成训练缓慢的问题。另外,通过BN可以适当增大学习率。

参考文献

  1. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

你可能感兴趣的:(Batch Normalization学习)