Batch Normalization学习

2019-04-02  本文已影响0人  Latet

前言

本文旨在学习和记录,如需转载,请附出处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

3、BN具体做法

BN的具体做法是对每一层的输入数据进行批规范化,固定为高斯分布。均值为0,方差为1。另外,采用了缩放因子\lambda和平移因子\beta
\hat{x}^{(k)}=(x^{(k)}-E[x^{(k)}])/\sqrt{var[x^{(k)}]} 其中k代表网络的层数
{y}^{(k)}=\lambda^{(k)} \hat{x}^{(k)}+\beta^{(k)}
作用:
如果采用tanh或者sigmoid饱和非线性激活函数时,用BN会控制饱和程度,有效减小梯度消失问题。
其中缩放因子\lambda和平移因子\beta是需要优化的。
当:
\lambda^{(k)}=\sqrt{var[x^{(k)}]}, \beta^{(k)}=E[x^{(k)}]
则经过先归一化到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。因为\lambda\beta是待学习的参数,在训练中我们实际上需要找到一个x到out的映射关系(其实就是归一化操作),但是我们在测试的时候需要根据训练得到的全局均值和方差来进行归一化,在tensorflow中,如果不设置全局的均值和方差,则测试效果就会特别差。训练时需要对所有batch的均值和方差记录下来,然后测试时对其做无偏估计,作为整体均值和方差然后进行测试。


一般在现有的深度学习框架下面关于BN的调用都含有momentum这个变量,以下是怎么计算整体的均值和方差的方法:
running^{mean} = momentum*running^{mean}+(1-momentum)*x^{mean}
running^{var} = momentum*running^{var}+(1-momentum)*x^{var}
起初训练时 running^{mean} =0,running^{var}=0 ,之后随着训练迭代一直更新,训练结束 running^{mean},running^{var} 就作为全局均值和全局方差
反向传播:
过程为:
y = \lambda \hat{x}+\beta
d\lambda = dy\cdot \hat{x}
d\beta= dy
d\hat{x}= dy*\lambda
\hat{x} = \frac{x-x^{mean}}{\sqrt{x^{var}+eps}} =\frac{x-\frac{1}{N}\sum_{i=1}^{N}x^{_{i}}}{\sqrt{\frac{1}{N}\left ( x-\frac{1}{N}\sum_{i=1}^{N}x^{_{i}} \right )^{2}+eps}}
\hat{x} = \frac{x-x^{mean}}{\sqrt{x^{var}+eps}}=\frac{x-u_{b}}{\sqrt{\sigma ^{2}+\varepsilon }}
对其求导有:
d\hat{x}= dy*\lambda
d\sigma ^{2}=d\hat{x}\cdot (x-u_{b})\cdot (-0.5)(\sigma ^{2}+\varepsilon )^{-1.5}
du_{b}=-d\hat{x}/\sqrt{\sigma ^{2}+\varepsilon }+d\sigma ^{2}\frac{2u_{b}-2x}{N}
dx =d\hat{x}/\sqrt{\sigma ^{2}+\varepsilon }+d\sigma ^{2}\frac{2u_{b}-2x}{N}+du/N
其中,有关均值和方差在求导中的求和给省略了

4、总结

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

参考文献

  1. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
上一篇 下一篇

猜你喜欢

热点阅读