对于一个神经网络我们知道,归一化输入特征是加速网络训练的技巧之一,因为归一化后,损失函数的图像就会由狭长变得更圆,那么这是否启发我们,在深度更深模型中,对各层的输出进行归一化,有益于下一层的学习?毕竟上一层的输出是下一层的输入。这就是Batch Norm的核心作用。
由于每一层的参数更新后,对于同一输入,输出的分布就会发生改变(这称之为Covariate shift: 内部协变量偏移),这带来的影响是下一层需要不断适应上一层输出的分布,从而导致下一层与上一层之间的联系紧密(有点过拟合的意思),通过归一化就可以加强层与层之间的独立性,从而加速网络的学习。
1.Batch Norm的计算方式
在此先讲讲Batch Norm和Mini-batch之间的关系。Mini-batch是Mini-batch梯度下降法的训练集的最小划分子集,而Batch Norm需要在Mini-batch上运行,即需要计算每一个Mini-batch的均值、方差,然后进行归一化。
深度学习基础---梯度问题与Mini-batch 梯度下降http://t.csdnimg.cn/EBmIH
(1)计算 Mini-batch 的均值
其中,m为Mini-batch 上样本的数量。
(2)计算 Mini-batch 的方差
其中,m为Mini-batch 上样本的数量,注意是先平方再求和。
(3)归一化
其中,z[l]是本层的输入经过w和b的计算结果,分母的ℇ是很小的一个数,防止分母为0。通过这样可以将z[l]归一化,从而化为均值为0,方差为1的分布。
(4)线性组合
其中,γ和β是网络的参数,即和w、b一样需要经过训练更新值,从而适应网络。当γ=步骤(3)的分母,β=μ时,本步的结果是一个恒等式。
为了加强网络的学习能力,使用这两个参数来改变分布的平均值。如果没有这两个参数,那么相当于所有的都暴力归一化,而我们知道类似sigmoid激活函数的图像如下,在靠近0的位置图像近似等于线性函数,那么网络的表达能力就会大大减弱,因此通过这两个网络参数加强网络的学习能力。
2.Batch Norm在网络中的具体应用
如上图所示的网络,在没有进行归一化前,每层隐含层的计算是在下图中去除红框的剩余部分,g(z)是激活函数。在权重的线性组合后,激活函数前添加归一化的计算(为什么不在激活函数后添加,这点一直饱受争议,这里选择这种方式,无论是哪种方式,只要能对网络训练有帮助,就是不错的方法)。
对于每一层隐含层,向前传播就是按照上图的流程进行计算,直到计算出损失,向后传播的过程中,可以使用优化算法:mini-batch梯度下降、动量梯度下降、Adam等等,对参数γ和β进行和w、b一样的更新方式。这里简化流程,使用mini-batch梯度下降,算法流程如下:
for i = 1......t{
对X{i}向前传播
在每个隐含层计算z[l],并用BN归一化
计算带有正则项的损失函数
向后传播,计算dw、db、dγ、dβ
更新参数:w:=w-a*dw;
b:=b-a*db;
γ:=γ-a*dγ;
β:=β-a*dβ;
}
实际上,在网络的训练过程中,参数b和参数β发生了冲突,两者的作用相似。因为z=w*x+b,计算的平均值μ中就包含常数b,那在归一化步骤(3)中分子又减去了平均值,即减去了b。同时在步骤(4)中添加了参数β,此时b不发挥作用,发挥作用的是β。因此,实际训练中,为了减少参数个数,可以选择去除参数b,那么在优化算法是也可以不再优化这个参数。
3.Batch Norm在测试集的具体应用
在测试集中,为了预测某个样本的输出结果,需要单独处理样本。这样就引入一个问题,单个样本的均值和方差没有意义,因此使用Batch Norm起不了作用,这就需要我们估计平均值和方差,于是可以使用指数加权移动平均值算法来进行估计。
在训练网络的时候,我们可以运用指数加权移动平均值获得整个训练集的各层平均值μ[t][l]、方差σ[t][l]和z[t][l](t为Mini-batch的序号,l为层的序号),在测试的时候,用这些估值计算z[t][l]norm,从而计算测试样本的输出。这样做的本质其实是实现测试集和训练集来自同一分布的要求,因为在训练集都实现了Batch Norm,所以也要在测试集实现Batch Norm。
4.如何理解Batch Norm
(1)Batch Norm可以对每一层的输出进行归一化,这样每一层的输入就更加稳定,从而可以选择较大的学习率加速网络的训练。
(2)减少过拟合风险,提高模型泛化能力,同时让各层保持相对独立,提高学习能力。这就像抄作业,学霸每次给的作业如果详细程度不一样,比如这次给详细版,下次只给有关键词的,那么学渣就会特别依赖学霸,因为学渣无法从抄作业中获取如何解题的思路。但是如果学霸每次都给学渣详细版或简略版作业,由于作业风格一致,学渣就能从多次作业中找到作业的风格(至少可以学会些如何解题的规律或模版),从而提高学渣独立思考的能力。
(3)类似dropout,dropout随机消除神经元,从而为网络添加噪音,让神经元不再相互依赖。而Batch Norm由于对均值的缩放和在mini-batch上计算,也会为网络添加噪音,同时让各层相对独立,不再相互依赖。因此有一定的正则化效果,减轻过拟合。但是不要把这种方法当做正则化的手段,而是加速学习的技巧。