Batch Normalization解读

1.为什么要用BN

 在神经网络训练过程中,经常会出现梯度爆炸或者梯度消失的问题,导致网络训练困难,特别是在网络层数较多的情况下,网络层数多,网络更新一次,较后的层的输入数据的分布会发生较大变化,所以后面的层又要适应这种变化,相当于要求这些层能适应不同分布的输入,并总结出规律,这就导致网络训练很慢,而且不一定会收敛。如果保证每一层的输入的分布是稳定的,那么网络训练起来会收敛的更快,而且更不依赖于初始化的值。先前的研究中表明,对数据做白化之后可以加快网络的收敛,受此启发,作者想到在训练的时候,可以对每一层的输入数据做白化,白化就是通过空间变换把数据变成均值为0,方差为1的高斯分布,然而白化操作是很复杂费时。退而求其次,将白化改成将输入做移动和线性变换,使得输入的均值为0,方差为1。

 单纯的归一化之后,数据的分布为均值为0,方差为1,BN层的输出就很有可能在在**函数的线性段,多个线性层可以用一个线性来代替,这样网络的非线性表达能力就不好,所以加上一个系数r,和偏置b,让输入能够到达**函数的非线性区域,这两个参数可以让网络自学习。尤其是当两个参数如下时,输入为原始输入。这样输入既可以是原始输入也可以是归一化后的输入,也可以是归一化后的输入的线性变换,让网络自己学习要什么样的输入。

Batch Normalization解读

2.训练中如何batchnormalization

BN层执行的操作如下图,eps的作用是保证分母不会除零,计算每个featuremap的minibatch集内的均值方差,归一化每个神经元xi,也就是CNN中featuremap的每个像素点,然后乘一个系数r,加上偏置b(初始化时一般r=1,b=0),得到输出yi,然后yi输入到**函数,**函数的输出再输入下一个卷积层,下一个卷积层的输出又重复以上操作。一般BN层都加在非线性层前面。参数r,b也是通过反向传播算法学习得到。所以在训练中,forward和backward都经过BN层。

Batch Normalization解读Batch Normalization解读
   梯度反向传播计算公式(epsilon用来防止除0)


3.BN层反向传播公式推导
http://blog.csdn.net/pan5431333/article/details/78052867



4.测试(inference)时如何batchnormalization
 在训练时,归一化输入用的是minibatch的均值方差,而实际上,整个训练集的均值方差是最能反映数据分布的,但是由于训练的计算量考虑,用随机抽取的minibatch也能大致反映数据的分布。但是到了测试的时候,输入只有一个,BN无法对一个输入归一化,所以在网络每次训练时,会保存每个minibatch的均值方差,在网络训练好之后,BN层的均值方差用之前训练用的所有minibatch对整个数据集的均值方差的无偏估计量来代替。r,b任然用仍然用训练得到的参数。

Batch Normalization解读