Dropout VS BN: 别在你的网络中使用Dropout
作者&编辑:李中梁
前言
Dropout是神经网络中防止模型过拟合的重要正则化方式,而近来的网络结构中却少有见到Dropout的身影,我们真的不需要Dropout了吗?
在towardsdatascience上的这篇文章《Don’t Use Dropout in Convolutional Networks》分析了Dropout的缺陷以及在Cifar100数据集上对Dropout层和BN层的性能进行了对比。
翻译的原文如下。
Dropout.
如果你正在阅读这篇文章,我假设你已经了解Dropout是什么,以及它在正则化神经网络中的作用。如果你想复习一下,请阅读Amar Budhiraja的这篇文章(https://medium.com/@amarbudhiraja/https-medium-com-amarbudhiraja-learning-less-to-learn-better-dropout-in-deep-machine-learning-74334da4bfc5)。
一般情况下,我们只需要在网络存在过拟合风险时才需要实现正则化。如果网络太大,如果训练时间太长,或者没有足够的数据,就会发生这种情况。如果在卷积网络的末端有全连接层,那么实现Dropout是很容易的。
Keras Implementation
以下是在keras框架下加入Dropout层的原型:
keras.layers.Dropout(rate, noise_shape=None, seed=None)
一个丢弃率为0.5的Dropout层
model=keras.models.Sequential()
model.add(keras.layers.Dense(150, activation="relu"))
model.add(keras.layers.Dropout(0.5))
注意,这只适用于CNN的全连接层。对于所有其他层,不应该使用Dropout。相反,应该在卷积之间插入批处理标准化。这将使模型规范化,并使模型在训练期间更加稳定。
Batch Normalization.
Batch Normalization(BN)即批规范化,是正则化的一个重要手段。
在正则化效果的基础上,批处理规范化还可以减少卷积网络在训练过程中的梯度弥散。这样可以减少训练时间,提升结果。
Keras Implementation
以下是在keras框架下加入BN层的原型:
keras.layers.BatchNormalization()
在CNN使用BN时需要:
在卷积层和激活层之间插入BN层。
调节BN的超参数。
一个BN层的例子:
model.add(Conv2D(60,3, padding = "same"))
model.add(BatchNormalization())
model.add(Activation("relu"))
使用 BN 替代 Dropout
即使不需要担心过度拟合,实现BN也有很多好处。因此,批处理规范化在很大程度上取代了现代卷积体系结构中的Dropout。
“We presented an algorithm for constructing, training, and performing inference with batch-normalized networks. The resulting networks can be trained with saturating nonlinearities, are more tolerant to increased training rates, and often do not require Dropout for regularization.” -Ioffe and Svegedy 2015
在最近的网络结构设计中,Dropout层不受待见的原因有如下几点:
首先,Dropout对卷积层的正则化效果一般较差。
原因呢?因为卷积层的参数很少,所以一开始就不需要太多的正则化。此外,由于特征映射中编码的空间关系,激活变得高度相关,这使得Dropout无效。
其次,Dropout规范化的研究已经过时了。
像VGG16这样的大型模型在网络的末端包含了完全连接的层。对于这样的模型,通过在完全连接的层之间包含Dropout层来解决过拟合问题。
不幸的是,最近的网络架构设计逐渐抛弃了这种全连接结构。
通过全局平均池化(global average pooling)代替密集层,在提高性能的同时减小了模型大小。
实验
我创建了一个实验来测试当在卷积之间插入数据时,批处理规范化是否会降低泛化误差。
我构建了5个相同的卷积架构,并在卷积之间插入Dropout,BN或什么也不做(Control)。
我的模型在Cifar100数据集上的实验结果如下:
BN模型的高性能表明在卷积之间使用BN是有效的。
此外,Dropout不应该放在卷积之间,因为Dropout模型的性能往往比Control模型差。有关更多信息,请查看我的GitHub上的完整文章(https://github.com/harrisonjansma/Research-Computer-Vision/blob/master/08-12-18%20Batch%20Norm%20vs%20Dropout/08-12-18%20Batch%20Norm%20vs%20Dropout.ipynb)。
参考文献:
[Don’t Use Dropout in Convolutional Networks.](https://towardsdatascience.com/dont-use-dropout-in-convolutional-networks-81486c823c16)
与我交流
github: https://github.com/keloli
blog: https://www.jianshu.com/u/d055ee434e59
往期回顾之作者李中梁
【1】【TPAMI重磅综述】 SIFT与CNN的碰撞:万字长文回顾图像检索任务十年探索历程(上篇)
【2】【TPAMI重磅综述】 SIFT与CNN的碰撞:万字长文回顾图像检索任务十年探索历程(下篇)
机器学习算法工程师
一个用心的公众号
长按,识别,加关注
进群,学习,得帮助
你的关注,我们的热度,
我们一定给你学习最大的帮助