Batch Normalization
批量归一化技术出现在2015年。
机器学习领域有个很重要的假设,独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型,能够在测试集获得的效果的一个基本保障。而BN就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
Mini-Batch SGD**优点**:梯度更新方向比较准确,并行计算速度比较快。
Mini-Batch SGD**缺点**:麻烦。超参数调起来很麻烦,比如学习率,参数初始化,Dropout比例等等。BN应用于Mini-Batch SGD之后就可以解决很多SGD的缺点,不用在担心调参的问题。
我们的训练数据是有一定的固定分布,不过深度学习中有很多的隐层,在训练过程中,各层参数会不断变化,很长时间之后才会稳定。BN的基本思想就是让每个隐层节点的激活输入分布股东下来,来提升训练速度。
收BN的起来发源于图像处理的白花操作。所谓白化,就是对输入数据分布变换到均值为0,方差为1的正态分布,那么神经网络较快收敛。
为什么要利用?
如果不利用BN,数据就会落在激活函数的饱和区,这样梯度越来越小,甚至出现梯度消失现象。
如何实现BN
把输入数据重新拉回到均值为0,方差为1的区域,这样让每层的输入落在(-1,1)区间,这段刚好是激活函数性能最好的区域。
落在0附近的线性区域也不好,进行下面的操作y= scale*x+shift。每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是scale和shift把这个值重标准正态分布左移和右移一点并且长胖或变瘦一点。使得整个分布从中心周围的线性区往非线性区移动了一些。核心思想就是找到一个合适的位置,既能享有非线性的表达能力,又避免太靠近非线性去的两头使得网络收敛速度太慢。
对比了利用BN和不利用BN的结果,可以发现利用BN的结果性能更好。
网络中实现
对于一个m个样本的输入,对于每一层的输入进行归一化操作
其中X(k)=W*U+b
E[X(k)]代表m个样本在某个神经元之前x(k)的均值。
分母代表m个样本的x(k)的标准差。
算法原理如下所示:
测试阶段的均值和方差
测试阶段的均值和方差要用整体的均值和方差,这要求在计算每个mini-batch的时候要记录每个mini-batch的均值和方差
参考链接:http://blog.csdn.net/elaine_bao/article/details/50890491