Batch Normalization是在inception V2中提到的,是一种非常好的正则化方法,它使训练速度增加了许多,并且去除了dropout。
Abstract:
在训练过程中,每层的输入分布会随着前一层参数的变化而变化,这种分布的改变被称为Internal Covariate Shift。所以这会需要更低的学习率和谨慎的参数初始化,从而导致训练速度的变慢。解决的方法就是对每层的输入都做标准化(传统神经网络只对输入层的输入做标准化处理,而此方法还会对隐藏层做处理)。在一定情况下可以忽略dropout的需求,在训练步骤少很多的情况下达到相同精度。
Introduction:
已sigmoid函数为例,这是函数表达式,大家都知道的。当|x|越大,g‘(x)就越趋向于0,假设一层z = g(Wu + b) ,u为输入层的输入,对于x=Wu + b的所有维度,除了绝对值较小的维度,流向u的梯度将消失,训练速度缓慢,但由于x受W、b及以下各层参数的影响,这些参数的改变可能会对x的多个维度进入非线性饱和状态,从而使收敛速度减慢。也就是说随着网络深度的加深或者训练,激励函数的输入值的分布会变动,可能会向非线性函数取值区间的上下限两端靠近,以前面的sigmoid为例,即|x|大的区域,这就使训练速度变慢了。
所以这种内部的节点分布变化称为Internal Covariate Shift,所以Batch Normalization就是为了消除它来增快训练速度。
那么Batch Normalization到底是如何操作的呢:
为了防止梯度的下降甚至消失,为了加快训练速度,可以固定输入的分布。研究人员认为图像白化可以增快收敛速度(图像白化(whitening)可用于对过度曝光或低曝光的图片进行处理,处理的方式就是改变图像的平均像素值为 0 ,改变图像的方差为单位方差 1),所以可以同样对每一层的输入也做相同的处理,固定输入的分布,从而消除Internal Covariate Shift的影响。BN就是利用这种正则化手段将每层的输入都固定在了均值为0,方差为1的正态分布上,让输入集中在激励函数陡峭的区间(导数大),使梯度增大,避免梯度消失,加快收敛速度。
这是核心公式.某个神经元对应的原始的**x通过减去mini-Batch内m个实例获得的m个**x求得的均值E(x)并除以求得的方差Var(x)来进行转换.
具体操作公式。
但是单纯的强行将输入固定在上文说的正态分布中,会导致网络表达能力下降,以为相当于只是用了激励函数线性的部分,所以为了防止这一点,每个神经元增加了两个调节参数(训练学习而来),防止模型表达能力的降低,这就是上面这个式子存在的原因。
这些是最后测试的比较结果,从without BN和with BN可以看出with BN可以在更快的情况下得到同样的准确精度。
inception和BN-Baseline的学习率初始都为0.0015,BN-x5 为5倍即0.0075,BN-x30 则为30倍,即0.045。BN-x5-Sigmoid 则在BN-x5的基础上用sigmoid来训练初始阶段。
优点:
1.明显加快了收敛和训练速度。
2.可以使用大的学习率,降低了初始要求,用较大的学习率提高速率并且没有副作用。
3.删除了dropout,达到了与dropout一样的目的。
参考:https://www.cnblogs.com/guoyaohua/p/8724433.html?tdsourcetag=s_pctim_aiomsg