Batch Normalization解读
1.为什么要用BN
在神经网络训练过程中,经常会出现梯度爆炸或者梯度消失的问题,导致网络训练困难,特别是在网络层数较多的情况下,网络层数多,网络更新一次,较后的层的输入数据的分布会发生较大变化,所以后面的层又要适应这种变化,相当于要求这些层能适应不同分布的输入,并总结出规律,这就导致网络训练很慢,而且不一定会收敛。如果保证每一层的输入的分布是稳定的,那么网络训练起来会收敛的更快,而且更不依赖于初始化的值。先前的研究中表明,对数据做白化之后可以加快网络的收敛,受此启发,作者想到在训练的时候,可以对每一层的输入数据做白化,白化就是通过空间变换把数据变成均值为0,方差为1的高斯分布,然而白化操作是很复杂费时。退而求其次,将白化改成将输入做移动和线性变换,使得输入的均值为0,方差为1。
单纯的归一化之后,数据的分布为均值为0,方差为1,BN层的输出就很有可能在在**函数的线性段,多个线性层可以用一个线性来代替,这样网络的非线性表达能力就不好,所以加上一个系数r,和偏置b,让输入能够到达**函数的非线性区域,这两个参数可以让网络自学习。尤其是当两个参数如下时,输入为原始输入。这样输入既可以是原始输入也可以是归一化后的输入,也可以是归一化后的输入的线性变换,让网络自己学习要什么样的输入。
2.训练中如何batchnormalization
BN层执行的操作如下图,eps的作用是保证分母不会除零,计算每个featuremap的minibatch集内的均值方差,归一化每个神经元xi,也就是CNN中featuremap的每个像素点,然后乘一个系数r,加上偏置b(初始化时一般r=1,b=0),得到输出yi,然后yi输入到**函数,**函数的输出再输入下一个卷积层,下一个卷积层的输出又重复以上操作。一般BN层都加在非线性层前面。参数r,b也是通过反向传播算法学习得到。所以在训练中,forward和backward都经过BN层。