深度学习中的Batch Normalization

动机

我们知道在神经网络训练开始前,都要对输入数据做一个归一化处理,那么具体为什么需要归一化呢?归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。

对于深度网络的训练是一个复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。

《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》就是为了解决这个问题的。

原理

说到神经网络输入数据预处理,最好的算法莫过于白化预处理。白化处理后的数据基本满足0均值、单位方差、弱相关性。因为白化需要计算协方差矩阵、求逆等操作,计算量很大,此外,反向传播时,白化操作不一定可导。于是,作者采用下面的Normalization方法。这个方法放弃了弱相关性的处理方法,重点关注0均值、单位方差。

整个BN的算法如下:

深度学习中的Batch Normalization_第1张图片

式中m指的是mini-batch size

注意第三行normalize的分母的开方符号的下加了一个很小的值,防止分母为0.

对于第四行有些迷惑,主要是使用sigmod的时候,x值被归一化到0附近,近似只使用sigmod的线性部分,失去了非线性的作用,降低了模型表达能力。如果是使用relu,则会有一半的参数激活后为0,这显然不是咱们想看到的。

深度学习中的Batch Normalization_第2张图片

所以加了两个参数用来保持模型的表达能力。γ 和β是在训练时网络自己学习得到的。

在这里插入图片描述

需要注意的是,上述的计算方法用于在训练过程中。在测试时,所使用的均值和方差是整个训练集的均值和方差. 整个训练集的均值和方差的值通常是在训练的同时用移动平均法来计算得到的。

Batch Normalization在CNN中的使用

因此卷积层上的BN使用,其实也是使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理。

卷积神经网络经过卷积后得到的是一系列的特征图,如果min-batch sizes为m,那么网络某一层输入数据可以表示为四维矩阵(m,f,p,q),m为min-batch sizes,f为特征图个数,p、q分别为特征图的宽高。在cnn中我们可以把每个特征图看成是一个特征处理(一个神经元),因此在使用Batch Normalization,mini-batch size 的大小就是:m*p*q,于是对于每个特征图都只有一对可学习参数:γ、β。

好处

论文中将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数降低,所以要对输入数据少做一些扭曲,让神经网络多看看真实的数据。

参考资料

本文属于对以下几篇文章的整理综述。

解读Batch Normalization

深度学习中的Batch Normalization

《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》阅读笔记与实现
深度学习(二十九)Batch Normalization 学习笔记

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

你可能感兴趣的:(DL/ML/AI,深度学习,深度学习论文笔记和实践)