计算机系统应用教程网站

网站首页 > 技术文章 正文

Dropout VS BN: 别在你的网络中使用Dropout

btikc 2024-10-17 08:41:21 技术文章 18 ℃ 0 评论

前言

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)

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表