batch normalization会使你的参数更容易,使神经网络对超参数的选择更加稳定,超参数的范围会更庞大,工作效果也很好。
batch normalization(吴恩达视频笔记)
其中在第三步的分母上加入ε是为了防止σ为0的情况,通过归一化,将z(i) 化为含平均值0和标准差为1,但我们不想让隐藏单元总是含有平均值0和标准差1,因为也许隐藏单元有了不同的分布会更有意义,所有有了第四步,其中γ和β是学习的参数,需要和权重一样更新参数,γ和β的作用是你可以随意设置。batch normalization(吴恩达视频笔记)
的平均值,如果γ等于三式的分母,而β=μ,那么它就完全等于z(i)
batch normalization(吴恩达视频笔记)
每个隐藏层可以看成由两部分组成,z做求和,a用**函数处理,BN是在z和a之间做的操作,其中z会产生w和b的参数,BN有γ和β的参数,经过对隐藏层z的归一化之后再用**函数作用的结果a,接着传输到下一层。完成整个步骤之后,再后向传播调整参数。

注意:
1、其中这里的β代表BN过程中的参数,和后续梯度下降时用到的参数不一样;

2、在代码实现过程中,BN过程基本用一句代码搞定,比如在tensorflow中,用的是tf.nn.batch-normalization;

3、如果现在对第l层进行BN操作,那么相应的参数包含
w[l]、b[l] 、γ[l]、 β[l],则z[l]=w[l] a[l-1] +b[l],但是因为会对z[l]进行归一化操作,那么不管它后面加任何一个常数,都会在归一化操作后消除掉,因此可以直接将b[l]设置为0,后续的BN还是正常操作;

4、在实际运用中,BN是在一个个mini-batch中使用的,每个mini-batch都会产生相应每一层的参数,即输入为X{1} 再得到隐藏层中的BN参数γ和β等,对于输入X{2}也是一样,上图中的m是一个mini-batch的输入样本数量;

5、BN都是针对于训练阶段来说的。

为什么BN会奏效呢?
因为它可以使权重比你设计的网络更之后或更深,比如,第10层的权重相比于之前的层更能经受得住变化。
batch normalization(吴恩达视频笔记)
对于第3个隐藏层来说,它的值由前两层决定,如果前两层的参数w[2]、b[2]变化,它的值也会变化,所以有了covariate shift的问题,batch normalization所作的是它减少了这些隐藏值分布变化的数量,即前面的层的参数的确会随着梯度下降而更新,但是不管他们怎么变化,他们的均值和方差应该保持一致,这样就影响了参数数值分布的程度,使得这些数值更稳定,从而网络更robust。
batch normalization(吴恩达视频笔记)
此外,BN还有一定的正则化效果。

因为BN是在每一个mini-batch上进行尺度变换的,而不是在整个数据集上进行,因此每一个mini-batch拥有不同的均值和方差,会有一定的噪声,因此类似于dropout,它往每个隐藏层的**值上增加了噪音,这迫使后续的值不过分依赖于任何一个隐藏单元,因此有轻微的正则化效果,可以和dropout一起使用。但是,如果你的mini-batch过大,那么就相当于减少了噪声,从而减弱了正则化效果。

在测试阶段,这里的μ和σ是针对于整个数据集来说的,一般把在训练集上得到的μ和σ,再用指数加权平均得到测试集的μ和σ。
在实际应用中,深度学习框架中会有默认的估算μ和σ的方式

相关文章: