0- 背景
介绍如何将batch归一化引入到神经网络中
1- 流程如下:
在计算z之后,才是之前介绍的batch归一化方法,对其进行归一化,再替代原来的z值,输入到下该层的激活函数中。其他隐藏层,操作类似。
在实际中,可以直接使用框架中函数,而不必自己实现这些具体的细节。
tf.batch_normalization()#进行batch 归一化操作
2-min-batch下的batch归一化:
对于采用min-batch的处理方式的话,则是对每个min-batch样本集处理之后,对输出的Z进行batch归一化操作(减去均值,除以标准差)。各个min-batch样本都是做类似的工作:
其中每个min-batch之后,都会更新
由于batch归一化处理的时候,减掉了一个均值操作,所以其实参数中的b参数会被均值减法所抵消掉。所以,在使用batch归一化时候,是可以不考虑b参数。
其实只是在之前的处理逻辑中对
3- batch归一化加速原理
其中一个原因与输入特征值的归一化一样,归一化后的值都在一个特定范围内变化,加速了学习速度。另一个更深层次的原因是batch-归一化可以使权重比神经网络更滞后或者更深层。可以这样理解,batch归一化之后,比如第10层的权重相比于前层的权重(例如第1层)更够经受住变化,即更加稳定,使得前层和后层之后的相互影响减缓,层级之间相互独立一些。
假设有一个用于猫识别的浅层神经网络或者逻辑回归模型。训练集上的数据都是黑色的猫,但是如果现在想要用有色猫来作为测试集的话,可能结果不好。这类问题其实可以简化为映射问题,训练集是x,模型是映射函数,y则是映射结果。如果已经学习了x到y的映射,此时当x的分布改变了,那么我们可能需要重新训练,这就是神经网络中的covariate shift问题。
我们从下面的一个神经网络模型来分析:
从第三隐藏层来看学习过程,此时的网络已经学习了参数
我们先不看第三层左边部分,只看第三隐藏层:
输入是
我们再来看第三隐藏层左边的部分,涉及到的参数是
所以,从第三隐藏层的角度来看,这些隐藏单元的值在不断变化着,所以,就有了covariate shift问题。batch归一化的作用,就是减少了这些隐藏单元值分布变化的数量范围。
当神经网络的参数更新时,
batch归一化操作,限制了前层的参数更新,从而影响单元值分布程度。它减少了输入值的改变,使得这些值变得更加稳定。这也使得之后的神经网络的基础更牢固,即使输入分布改变了一些,那么它会变得更小。它所做的就是减弱了前层参数的作用与后层参数的作用之间的联系,使得每层网络都可以自己学习,稍稍独立于其他层,从而有助于加速整个网络的学习。
从后层的角度来看,batch归一化使得前层不会左右移动太多。毕竟它们都被相同的均值和方差所限制。所以,均值和方差相同是指这个意思。这也使得后层的学习变得更加容易。
batch-归一化的轻微正则化效果:
batch归一化中非直观的就是每个min-batch(
因为噪声很小,所以,正则化效果不大,不如dropout的正则化效果。如果min-batch size较大,则会减少噪声,进而减少正则化效果。在使用过程可以将batch归一化和dropout一起使用。注意,batch-归一化的轻微正则是附带的,不是其主要的作用。
4- 测试时的batch归一化
训练时,batch归一化将数据以mini-batch的形式逐一处理,但在测试时,你可能需要对每一个样本逐个处理,怎样调整网络来做到这一点?
训练时:
其中的m表示该min-batch中的样本数量。
但是在测试的实时,我们是对于单个样本,无法同时取如一个min-batch size的样本数量进行处理,要怎么办?此时,我们需要用其他方式来计算
为了将训练好的神经网络应用于测试,需要单独计算
指数加权平均的方式来估算
min-batch分别为
在为第
在为第
采用指数加权平均的方式我们就可以获取对这一隐藏层的均值