Batch Normalization和Dropout如何搭配使用?

Batch Normalization和Dropout如何搭配使用?

背景

众所周知,在Batch Normalization(BN)出来之前,dropout是训练神经网络时的标配,如果你的数据不够多,那么模型很容易过拟合,导致模型的性能下降。Dropout在很多任务上证明了自己的有效性,比如图片分类,语音识别,目标检索等等。但是在BN提出之后,dropout突然失宠了,原因是作者将BN和dropout搭配使用时,模型的性能不升反降。之后各大流行网络ResNet,PreResNet,ResNeXt,DenseNet相继提出,大家也心照不宣地都默认缺省了Dropout。比较有意思的是Wide ResNet(WRN)的作者多了一个“心眼”:他发现在很宽的WRN网络里面,在每一个bottleneck的两个conv层之间加上那么一个Dropout,竟然能得到稳定的提升。这就显得很奇怪,也是这篇文章想要通过一些推导想搞清楚的。在这里参考大神李翔的论文博客,我用自己的理解整理了一下,如有不对之处请大家指正。

分析

究竟是什么原因导致BN和dropout一起使用时导致1+1<1呢?下面将一一介绍。

  1. dropout
    dropout在训练时,以一定的概率p来drop掉相应的神经网络节点,以(1-p)的概率来retain相应的神经网络节点,这相当于每一次训练时模型的网络结构都不一样,也可以理解为训练时添加了噪声,所以能够有效减少过拟合。
    问题呢,是出在测试时,因为训练的时候以概率p drop了一些节点,比如dropout设置为0.5,隐藏层共有6个节点,那训练的时候有3个节点的值被丢弃,而测试的时候这6个节点都被保留下来,这就导致了训练和测试的时候以该层节点为输入的下一层的神经网络节点获取的期望会有量级上的差异。为了解决这个问题,在训练时对当前dropout层的输出数据除以(1-p),之后再输入到下一层的神经元节点,以作为失活神经元的补偿,以使得在训练时和测试时每一层的输入有大致相同的期望。
  2. Batch Normalization
    首先来看下BN的公式:

在这里插入图片描述

BN就是在深度神经网络训练时通过对每一个batch的数据采用均值和方差进行归一化,使得每一层神经网络的输入保持相同的分布,这样能够加快训练的速度。此外,因为在训练时,为每一次迭代求全局的均值和方差是不现实的,因此借鉴moment的方式对均值和方差进行更新,使得每一层归一化的均值和方差都不一样,也相当于引入了噪声,能够增加模型的鲁棒性,有效减少过拟合。

  • 方差偏移
  • 在这里插入图片描述

    首先,先明确dropout和BN结合使用使模型性能下降的连接方式,用通俗的话讲,就是你先在网络的内部使用dropout,随后再跟上一个BN层,而且这个BN层还不止一个。那么问题出在哪呢?原因有二。首先,如上图所示,因为训练时采用了dropout,虽然通过除以(1-p)的方式来使得训练和测试时,每个神经元输入的期望大致相同,但是他们的方差却不一样。第二,BN是采用训练时得到的均值和方差对数据进行归一化的,现在dropout层的方差都不一样了,那还搞毛,一步错步步错,最终导致输出不准确,影响最后的性能。

    解决方案

    针对方差偏移,论文给出了两种解决方案:

    1. 拒绝方差偏移,只在所有BN层的后面采用dropout层,现在大部分开源的模型,都在网络的中间加了BN,你也就只能在softmax的前一层加加dropout了,我亲自试过,效果还行,至少不会比不加dropout差。还有另外一种方法是模型训练完后,固定参数,以测试模式对训练数据求BN的均值和方差,再对测试数据进行归一化,论文证明这种方法优于baseline。
    2. dropout原文提出了一种高斯dropout,论文再进一步对高斯dropout进行扩展,提出了一个均匀分布Dropout,这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了,总得来说就是整体方差偏地没有那么厉害了。可以看得出来实验性能整体上比第一个方案好,这个方法显得更加稳定。

    参考资料

    [1] https://zhuanlan.zhihu.com/p/33101420
    [2] https://arxiv.org/pdf/1801.05134.pdf
    [3] https://zhuanlan.zhihu.com/p/61725100

    Batch Normalization和Dropout如何搭配使用?

    背景

    众所周知,在Batch Normalization(BN)出来之前,dropout是训练神经网络时的标配,如果你的数据不够多,那么模型很容易过拟合,导致模型的性能下降。Dropout在很多任务上证明了自己的有效性,比如图片分类,语音识别,目标检索等等。但是在BN提出之后,dropout突然失宠了,原因是作者将BN和dropout搭配使用时,模型的性能不升反降。之后各大流行网络ResNet,PreResNet,ResNeXt,DenseNet相继提出,大家也心照不宣地都默认缺省了Dropout。比较有意思的是Wide ResNet(WRN)的作者多了一个“心眼”:他发现在很宽的WRN网络里面,在每一个bottleneck的两个conv层之间加上那么一个Dropout,竟然能得到稳定的提升。这就显得很奇怪,也是这篇文章想要通过一些推导想搞清楚的。在这里参考大神李翔的论文博客,我用自己的理解整理了一下,如有不对之处请大家指正。

    分析

    究竟是什么原因导致BN和dropout一起使用时导致1+1<1呢?下面将一一介绍。

    1. dropout
      dropout在训练时,以一定的概率p来drop掉相应的神经网络节点,以(1-p)的概率来retain相应的神经网络节点,这相当于每一次训练时模型的网络结构都不一样,也可以理解为训练时添加了噪声,所以能够有效减少过拟合。
      问题呢,是出在测试时,因为训练的时候以概率p drop了一些节点,比如dropout设置为0.5,隐藏层共有6个节点,那训练的时候有3个节点的值被丢弃,而测试的时候这6个节点都被保留下来,这就导致了训练和测试的时候以该层节点为输入的下一层的神经网络节点获取的期望会有量级上的差异。为了解决这个问题,在训练时对当前dropout层的输出数据除以(1-p),之后再输入到下一层的神经元节点,以作为失活神经元的补偿,以使得在训练时和测试时每一层的输入有大致相同的期望。
    2. Batch Normalization
      首先来看下BN的公式:

    猜你喜欢

    转载自blog.csdn.net/ljyljyok/article/details/107770048