深度学习三:批量正则化

Batch Normalization

信号处理的理解:relu是二极管,BN就是电容器过滤掉直流成分,并控制增益不要超载,很简单的道理。

相比于其它的优化操作比如:dropout、l1、l2、momentum等,BN是无可替代。

BN作用位置

BN往往用在卷积层之后,激活函数之前,(比如对于darknet-53来说,conv+BN+relu成为一个标配,构成最小的组件)。当然,BN不一定用在conv之后,但用在激活函数之前几乎是必须的。

我们把神经网络各层之间的传递称为特征图,特征图在传递过程中,就需要使用BN进行调整。我们在训练的时候,都是输入一批一批的训练数据(mini-batch),比如batch size=32,那一次输入32个数据,这个数据可能满足一个分布A,如果A分布比较任性,那么A在通过激活函数(非线性层)时,修建率可能会很高或者很低。如下图所示。

上图展示了3中分布情况,当batch特征图分布比较任性,就会出现前面两种情况。上述用的激活函数时relu,在输入大于0时保持不变,小于0时变成0。对于一二两种情况,要么修剪的过少,等于没用激活函数,要么修剪的过多,一大批0放在后面。当然,在不断训练过程中,情况一二会慢慢减少,因为特征提取层越来越牛逼。但是这需要更多的时间取填补,而且最终的性能不会很好,虽然是batch训练,但是它的视野过窄,容易产生过拟合线性。如果用sigmoid/tanh等激活函数,还有梯度加速弥散的问题。(两端抑制)

我们想要激活函数修剪适中,就需要用到BN操作了。

BN怎么操作

先来看看论文的截图

  • 第一步,我们获取一个minibatch的输入B=x1,x2xm,可以看到batchsize就是m
  • 第二步,我们求batch的均值μ和方差σ
  • 第三步,对所有的xiB,进行一个标准化,得到xi^
  • 第四步,对xi^做一个线性变换,得到yi^

现在对上面的四个步骤进行一个全面分析:我们获取一个任意分布,对这个分布包含的数据进行一个标准化,这个操作是否熟悉呢?没有我们回到那个纯洁的年代,来看看高中的正态分布:

Share