机器学习: 神经网络中的Batch Normalization(BN)算法

一、什么是Batch Normalization

1. 从白化(Whiten)说起

    之前的研究表明如果在图像处理中对输入图像进行白化(Whiten)操作的话——所谓白化就是对输入数据分布变换到0均值,单位方差的正态分布——那么神经网络会较快收敛。所以受白化启发,batch normalization被提出。

2. Batch Normalization

    接下来就看看什么是Batch Normalization。基于白化的思想,BN作者收到了启发,白化是在输入层对数据进行变换使其服从标准正态分布。对深度神经网络来说,其中某个隐层的输出就是下一层的输入,那么能不能对每个隐层都做白化呢?BN确实就是这么做的,并且在模型训练中取得了良好的效果。下面看一下BN算法的具体流程是怎样的。

    batch normaliztion算法伪代码

 

 (1).前三步

    我们知道前面三步把数据x的所有维度1..m的数据分布都变成了均值为0,方差为1的标准正态分布。下面以m=2为例,显示前三步的效果:

    

     

     这里第二幅图是L函数的等高线图。L(w) = \frac{1}{2}(xw+b-\hat y)^2   ,  由于x被标准化了,所以关于w的L函数的几何表示是一个比较均衡的几何体。所以我们看到L函数在BN后会更加快地到达最优点,模型也更快收敛。

 (2).第四步

    这里值得注意的是最后一步缩放和移位。为什么需要进行缩放和移位呢?如果我们单单只进行前三步,假设我们使用sigmoid函数,那么x的分布情况是右边这样的:

   批归一化Batch Normalization的原理及算法

    所以如果只进行前三步,大部分的数据将会分布在Sigmoid函数的中间部分(线性区)。但是这样就没有达到用sigmoid函数对数据进行非线性变换的目的,换言之,减均值除方差操作后可能会削弱网络的性能。不光是Sigmoid激活函数,Tanh函数在零附近也变成线性,而Relu activation函数,则将一半的输入清零。

          

     所以我们需要对它进行缩放和移位。但是这里的缩放和移位是对各个维度进行同样的缩放和移位,所以不会使各个维度变得像原来一样地参差不齐。所以进行了四步的BN之后。同样假设我们使用sigmoid函数的话,x的分布情况是下面这样的: 批归一化Batch Normalization的原理及算法

 3. 在测试过程中的Batch Normalization

    当一个神经网络训练好后,我们就要拿来测试以及解决实际问题了。但是一个网络一旦训练完了,就没有了min-batch这个概念了,测试阶段我们一般只输入一个测试样本,再观察其结果。这个时候只有一个样本,我们就没有办法获取均值和方差,就没有办法进行测试。为了解决这个问题,该算法是利用训练集均值和方差来代替。假设训练过程中每个mini-batch的均值和方差为\mu _B\sigma _B^2。根据参数估计,我们求解出整个训练集的均值和方差为:

     E[x] \leftarrow E_B[\mu _B] \\ Var[x] \leftarrow \frac{m}{m-1} E_B[\sigma _B^2]

    所以最终它使用的公式是:

     y = \gamma*\frac{x-E[x]}{\sqrt{Var(x)+\epsilon}} + \beta = \frac{\gamma x}{\sqrt{Var(x)+\epsilon}} +( \beta- \frac{\gamma E[x]}{\sqrt{Var(x)+\epsilon}})

 二、Batch Normalization的作用

 1.加快收敛速度

    这点在前面都已经已经提到了,就是由于x被标准化了,所以关于w的L函数的几何表示是一个比较均衡的几何体, 在随机梯度下降过程中能更快地走到最优点。

    

2. 能够提高模型的精度

    这个也很好理解,同样利用上面1中的图,没有进行BN的话,我们得到扁平状的等高线,这样的话在训练后期,L极可能在最优点附近不断地进行小幅度的震荡而始终不能到达最优点。相比之下,右边的图梯度更明显,L能很快地直接到达最优点,从而使模型地精度提高。

3.能解决梯度消失问题

    其实这个是能够加快收敛速度的原因之一。也就是解决了梯度消失本身能加快收敛速度。

    下面看看它是怎么解决梯度消失问题的。假设没有经过BN调整前x的原先正态分布均值是-6,方差是1,那么意味着95%的值落在了[-8,-4]之间,那么对应的Sigmoid(x)函数的值明显接近于0,这是典型的梯度饱和区,在这个区域里梯度变化很慢,为什么是梯度饱和区?请看下sigmoid(x)如果取值接近0或者接近于1的时候对应导数函数取值,接近于0,意味着梯度变化很小甚至消失。关于梯度消失更多的内容可以参考:机器学习:神经网络中的梯度消失和梯度爆炸

    

4. 能提高模型的泛化能力 

    提高模型的泛化能力,换句话说,就是能够避免对训练集产生过拟合。这是因为在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果。换句话说,就是同样一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本。而泛化能力正是需要考虑大部分的样本,因而在考虑了大部分样本的影响之下,泛化能力自然提高。

    此外正因BN算法能够提高泛化能力,避免过拟合,我们就可以减少使用其他避免过拟合的方法(如L1, L2正则化项,Dropout)。详见:机器学习:正则化项为什么能够防止过拟合?防止过拟合的方法

三、Batch Normalization 和 Layer Normalization的区别

layer normalization是对单个样本的所有维度特征做归一化,而非一个batch所有样本的某一维度特征做归一化。

图片引自NLP中 batch normalization与 layer normalization - 知乎

BN 和 LN 都可以比较好的抑制梯度消失和梯度爆炸的情况。BN不适合RNN、transformer等序列网络,不适合文本长度不定和batchsize较小的情况,适合于CV中的CNN等网络。 

四、BN和dropout在预测和训练时的区别

BN在训练时是在每个batch上计算均值和方差来进行归一化,每个batch的样本量都不大,所以每次计算出来的均值和方差就存在差异。预测时为了解决这个问题,该算法是利用训练集均值和方差来代替。

Dropout在训练时会随机丢弃一些神经元,这样会导致输出的结果变小。而预测时往往关闭dropout,保证预测结果的一致性(不关闭dropout可能同一个输入会得到不同的输出,不过输出会服从某一分布。另外有些情况下可以不关闭dropout,比如文本生成下,不关闭会增大输出的多样性)。

四、参考资料

    【1】https://www.cnblogs.com/guoyaohua/p/8724433.html

    【2】为什么要做 batch normalization - 简书

    【3】百度安全验证

    【4】L1、L2、Batch Normalization、Dropout为什么能够防止过拟合呢?_batchnormalization能防止过拟合吗_Tom Hardy的博客-CSDN博客

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值