Batch Normalization(2015,google) 论文阅读笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38437505/article/details/78237678

1.BN的提出

  作者认为:网络训练过程中参数的不断改变导致后续每一层输入的分布也发生变化,而学习的过程又要使每一层适应输入的分布,因此我们不得不降低学习率、小心的初始化参数。作者将分布发生变化称之为 internal covariate shift(内部协变量转移)。

  在进行数据预处理过程中,我们常将输入减去均值,甚至会对输入做白化,降维等操作,目的是为了加快训练。为什么减均值、白化可以加快训练呢,这里做一个简单地说明:

  首先,图像数据是高度相关的,假设其分布如下图a所示(简化为2维)。由于初始化的时候,我们的参数一般都是0均值的,因此开始的拟合y=Wx+b,基本过原点附近,如图b红色虚线。因此,网络需要经过多次学习才能逐步达到如紫色实线的拟合,即收敛的比较慢。如果我们对输入数据先作减均值操作,如图c,显然可以加快学习。更进一步的,我们对数据再进行去相关操作,使得数据更加容易区分,这样又会加快训练,如图d。

       这里写图片描述
       
  白化的方式有好几种,常用的有PCA白化:即对数据进行PCA操作之后,在进行方差归一化。这样数据基本满足0均值、单位方差、弱相关性。作者首先考虑,对每一层数据都使用白化操作,但分析认为这是不可取的。因为白化需要计算协方差矩阵、求逆等操作,计算量很大,此外,反向传播时,白化操作不一定可导,于是,作者采用下面的Normalization(BN)方法。
  

2.在小批量训练中来使用 BN

  数据归一化方法很简单,就是要让数据具有0均值和单位方差,如下式: 这里写图片描述
  但是作者又说如果简单的这么干,会降低层的表达能力。比如下图,在使用sigmoid激活函数的时候,如果把数据限制到0均值单位方差,那么相当于只使用了激活函数中近似线性的部分(因为做了归一化都是在0均值附近波动,基本不会离均值很多,所以很难到的饱和区域,主要是在近似线性这部分),这显然会降低模型表达能力。
            这里写图片描述
为此,作者又为BN增加了2个参数,用来保持模型的表达能力,这两个参数其实就是对变换后的数据进行平移和伸缩,就可以让数据在整个空间移动,却依旧满足同样的分布。
于是最后的输出为: 这里写图片描述(其实我并不是很理解这种反变换)
  上述公式中用到了均值E和方差Var,需要注意的是理想情况下E和Var应该是针对整个数据集的,但显然这是不现实的。因此,作者做了简化,用一个Batch的均值和方差作为对整个数据集均值和方差的估计。
整个BN的算法总结如下:
这里写图片描述

在实际应用中,方程里面加了一个微小项,对结果不会有很多大影响,主要是为了防止方程为零的情况,这样就可以解决这个问题了。
求导的过程如下:

这里写图片描述

3.测试

实际测试网络的时候,我们依然会应用下面的式子: 这里写图片描述
   特别注意: 这里的均值和方差已经不是针对某一个Batch了,而是针对整个数据集而言。因此,在训练过程中除了正常的前向传播和反向求导之外,我们还要记录每一个Batch的均值和方差,以便训练完成之后按照下式计算整体的均值和方差(利用m/(m-1)主要是无偏估计,在实际操作时,样本点方程都是要这样子,才是无偏估计量):这里写图片描述

4.Experiments

  作者在文章中也做了很多实验对比,我这里就简单说明2个。
下图a说明,BN可以加速训练。图b和c则分别展示了训练过程中输入数据分布的变化情况。

     这里写图片描述

下表是一个实验结果的对比,需要注意的是在使用BN的过程中,作者发现Sigmoid激活函数比Relu效果要好。
     这里写图片描述

5.算法优势总结

  论文中将Batch Normalization的作用说得突破天际,好似一下解决了所有问题,下面就来一一列举一下:
  (1) 可以使用更高的学习率。如果每层的scale不一致,实际上每层需要的学习率是不一样的,同一层不同维度的scale往往也需要不同大小的学习率,通常需要使用最小的那个学习率才能保证损失函数有效下降,Batch Normalization将每层、每维的scale保持一致,那么我们就可以直接使用较高的学习率进行优化。
  (2) 移除或使用较低的dropout。 dropout是常用的防止overfitting的方法,而导致overfit的位置往往在数据边界处,如果初始化权重就已经落在数据内部,overfit现象就可以得到一定的缓解。论文中最后的模型分别使用10%、5%和0%的dropout训练模型,与之前的40%-50%相比,可以大大提高训练速度。
  (3) 降低L2权重衰减系数。 还是一样的问题,边界处的局部最优往往有几维的权重(斜率)较大,使用L2衰减可以缓解这一问题,现在用了Batch Normalization,就可以把这个值降低了,论文中降低为原来的5倍。
  (4) 取消Local Response Normalization层。 由于使用了一种Normalization,再使用LRN就显得没那么必要了,而且LRN实际上也没那么work。
  (5) 减少图像扭曲的使用, 由于现在训练epoch数降低,所以要对输入数据少做一些扭曲,让神经网络多看看真实的数据。

猜你喜欢

转载自blog.csdn.net/qq_38437505/article/details/78237678