首先大家都知道自BN提出之后,Dropout突然失宠,究其原因就是BN原作者提到在他们的实践中对有BN的网络加了Dropout通常性能不升反降。他们猜测BN由于引入了不同样本之间的统计量,可能产生了一定的正则化效果从而替代掉了Dropout的增益。之后各大流行网络ResNet,PreResNet,ResNeXt,DenseNet相继提出,大家也心照不宣地都默认缺省了Dropout。比较有意思的是Wide ResNet(WRN)的作者多了一个“心眼”:他发现在很宽的WRN网络里面,在每一个bottleneck的两个conv层之间加上那么一个Dropout,竟然能得到稳定的提升。这就显得很奇怪,也是这篇文章想要通过一些推导想搞清楚的。
究其核心原因即是Dropout在网络测试的时候神经元会产生“variance shift”,我们将其称为方差偏移。而只要你在网络的bottleneck内部使用Dropout,在随后一定会跟上一个BN层(BN层处处都有而且一个bottleneck通常还不止一个)。BN层在test的时候,会对神经元首先施加一个归一化的操作,这个操作涉及到除以该神经元在training时候统计的方差(其实是方差的根号,我们简化了一下)。这个时候问题就来了,这个training时候统计的方差和test的时候的方差就对应了上面所说的偏移,换句话说,BN这个时候除错了!正所谓,一步错,步步错,一失足成千古恨,随着网络feature的不断forward,最终可能导致final的prediction产生了错误的偏差,从而引起性能的下降。
于是作者就按两种情况进行分析,第一种比较极端,Dropout直接跟BN;第二种实际上就是WRN里面的情况,Dropout跟一个参数层(卷积/全连接)再跟BN。经过一番公式轰炸,在第二种情况下,从最后variance shift的表达式来看,的确增加feature的dimension是可以缓解这个偏移的。这样就很好解释了第一段提到的各种情况。
然后就是通过实验统计看看实际情况是不是的确符合。首先,作者主要统计了CIFAR10/100上两种Dropout放置情况下,不同的drop ratio的一坨图表,而且给出了每个模型的性能对照。总体性能上讲,WRN的error柱状图的确就和其它的网络不同,通常会降个一会再升上去。这些性能有提升的带Dropout的WRN模型对应的variance
shift曲线就非常贴近不使用Dropout的WRN时候的曲线(Figure 4的行3列4最为明显)。其它模型有些variance shift都飞到天上去了。当然,当drop ratio 很小的时候比如0.1,大家的variance shift都不会太大,所以性能上也都说的过去。
为了进一步地说明,作者发现第一种情况下Dropout 0.5的时候,对于DenseNet和PreResNet,就连training data都中枪了。本来训练的时候分的好好的,一测试,尽管网络参数都没变,就挂了。为了直观地看一下是怎么挂的,作者从cifar10里面选了些训练正确,但测试错误的图,分别输出了一下softmax之前的neural values,的确是各有各的挂法,挂成什么类都可能。这么一来,既然我其它参数都没变,怪就只能怪“variance shift”了。
然后又进一步,其它参数还是不变,我们来调整一下BN的这些用来测试的统计均值和统计方差(方差错了之后随后的均值也都跟着不对了,所以要一起改)试试?于是就拿training data又过了一遍网络,不过我们这次不训练,就调整一下所有BN层的统计均值和方差。然后再拿来测。果不其然,所有模型的性能都上来了,一大波挂掉的样本又复活了。
现在我们很清楚了,“variance shift”是导致Dropout和BN合作不愉快的罪魁祸首。那么怎么搞才能让他俩一起愉快而稳定地玩耍呢?
第一个方案比较简单,不过在现代主流网络的实现里面似乎都没有了,记得BN没出来以前好像大家也都这么做过,就是拒绝“variance shift”,把Dropout放在所有BN层的后面就完事了。鉴于现在所有BN层之后其实没什么层了,基本就到输出了,所以统一放在softmax前的最后一层上。对于CIFAR10总体比较有效,在CIFAR100上较小的drop ratio起到了作用。另外作者发现去年ImageNet的冠军SENet里面也用到了这个技巧,他们在最后一层采用了0.2的Drop ratio,作者做了测试,的确是有接近0.2个点的稳定提升。 顺带把ResNeXt和ResNet-200这几个也做了,同样也很稳定。
第二个方案启发自Dropout原文里提到的一种高斯Dropout,是对Dropout形式的一种拓展。作者进一步拓展了高斯Dropout,提出了一个均匀分布Dropout,这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了,总得来说就是整体方差偏地没有那么厉害了。可以看得出来实验性能整体上比第一个方案好,这个方法显得更加稳定。