15年谷歌发表了一篇文章,名字是《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,文章介绍了一种新的深度学习算法,可以有效的提高模型的效率和精度。

在介绍原理之前,首先要提一下关于数据分布的问题。我们在使用机器学习训练数据的时候,一般都会对数据进行归一化(?)白化(?)或者减去均值等操作,这是因为 将数据分布中心移到原点附近,能使函数更快的拟合,加快训练速度。 数据分布 (关于归一化的问题将另写一篇文章讨论),那么我们就会发现一个问题,经过神经网络一层的计算后,得到的输出的分布又发生了变化,文中称这种情况为Internal Covariate Shift,所以这会对后面的处理产生效率和精度方面的影响,BN的作用其实就是在网络内部对数据再次进行标准化,对象是已经提取出来的特征。 总之BN的优点非常多,包括收敛速度快,泛化能力强等,给使用者带来的优势就是更节省时间,而且可以一定程度上摆脱dropout和L2 正则化等纠正过拟合的trick,当然具体的效果还是要根据自己实验的数据来判定。 ##BN基本原理

首先考虑的问题是我们如何处理神经网络内部的数据,理论上来说直接做一次标准化就可以,但是文章中提出这么做的话会影响模型的表达能力,如图中表示。假设是模型使用的激活函数是sigmoid函数,标准化以后就相当于把数据限定在了函数的线性部分,其他部分都被忽略掉了。 表达能力 所以作者重构了一下原来的公式,使其可以表达提取的特征, 这里写图片描述 BN层的前向传导过程 BNFF 具体的细节以后补充