神经网络训练细节之batch normalization

来源:互联网 发布:酷听说软件问题 编辑:程序博客网 时间:2024/05/16 05:23

在对神经网络进行训练的时候,经常涉及到的一个概念就是batch normalization,那么究竟什么是batch normalization,以及为什么在训练的时候要加入batch normalization呢?以下就是我的一些学习心得。

1、提出batch normalization的原因

      (1) 我们在对某个神经网络训练完成之后,需要测试该网络,那么如果我们的训练集数据与测试集数据具有不同的分布,最终的测试结果会有比较大的影响。也就是说我们的模型是基于训练集数据进行训练的,整个训练的过程肯定会受到训练集数据分布的影响,这种分布的影响也会体现到模型的训练中,但如果测试集数据具有与训练集数据不一样的样本,那么我们的模型对于最后的测试集数据的输出结果可能就是错误的。所以我们希望不论是训练还是测试的时候,输入数据的分布最好都是一致并且稳定的,当然一般来说,数据训练集与测试集的数据分布都是一致的,因为如果分布差距很大,那么这就不能看作是同一个问题。

       (2)当网络比较深的时候,即使我们将batch规范化成均值为0,单位方差的数据输入,但是后面层的输出就不能保证了,随着网络的深入,后面网络的输出将不再满足均值为0,方差为1。这也就是说网络在训练的时候,每次迭代输入该层网络的数据的分布都不一样,这就使得网络在训练的过程中有点无所适从,相应收敛的速度也会降低,针对这个问题,就考虑是否可以在每一层的输出后面都加一个BN(batch normalization)层,从而使得每层输入数据都是零均值,单位方差的数据,从而可以使得整个网络的收敛更快。

      (3)还有一个原因是促使batch normalization提出的又一原因,在卷积神经网络的训练中,往往要对图像进行“白化”处理,这样可以加快网络训练时候的收敛速度。“白化”操作之所以会加快收敛速度,原因是“白化”处理的本质是去除数据之间的相关性,这样就简化了后续数据独立分量的提取过程。

2、什么是batch normalization?

     batch normalization其实就是对数据进行规范化,将其分布变成均值为0,单位方差的正太分布。实现这一功能的方法非常简单,公式如下:


但是如果仅仅进行这样的操作,就会降低整个网络的表达能力。距离来说,加入激活函数采用的是sigmoid函数,那么当输入数据满足均值为0,单位方差的分布时,由于sigmoid函数的曲线特性(可见博客《关于激励函数的一些思考》),在0附近的范围内,整个sigmoid曲线接近线性,激励函数的非线性特性就得不到体现,这样整个网络的表达能力会降低,为了改善这个情况,在对数据采用规范化的过程中引入两个参数,对数据进行缩放和平移,具体公式如下:


这两个公式中涉及的均值跟方差都是针对所有数据的,但在实际训练的时候,我们是对训练数据进行洗牌,并随机抽取一个mini-batch进行训练,所以在实际的训练中,我们只是在mini-batch上实现对数据的规范,公式如下:


3、测试时候的batch normalization

     那么对每层的输入数据进行batch normalization之后,我们可以更加快速地实现收敛,那么当整个模型训练成功之后,我们需要对网络进行测试,这时候输入的单个的样本,只有一个数据,如何对这个输入样本进行规范呢?

     答案就是我们在训练的时候要记住每个mini-batch的均值与方差,然后根据这些数据计算训练集整体的均值与方差,公式如下:


利用整体的均值与方差,实现对单个样本的规范化,然后再输入到训练好的网络中进行测试。


原创粉丝点击