人工智能和深度学习很火,对应的职位其薪水和前景都很不错。很多人想转行从事这方面的研究,大部分都是靠自学相关的知识来进行入门和提升。网络上有很多资源可以用来学习深度学习相关的内容。但不幸的是,大多数资源在建立模型时候很少解释为什么这样构造会取得较好的效果,其根本原因在于目前深度学习相关的理论类似于一个黑匣子,暂时无法解释得清楚,只能通过实验来证明。此外,随着相关的深入研究,会出现一些新的发现,进而解释之前无法解释的内容。 深度学习相关的知识更新的特别快,需要时常关注相关的进展。本文将讨论深度学习中的一种常用技术——Dropout,通过阅读此文,你将清楚为什么Dropout在卷积神经网络模型中不再受到欢迎。
Dropout
本文假设你在读这篇文章时已经了解Dropout的相关知识,以及它在神经网络正则化方面的作用。如果你对该项技术不是很熟悉的话,可以翻阅本人之前的文章《深度学习网络大杀器之Dropout》复习,或者阅读阿马尔·布达拉贾的这篇文章。
Srivastava, Nitish,et al. “Dropout: a simple way to prevent neural networks from overfitting” 2014
通常,当构建网络模型存在过拟合的风险时,我们需要对其进行正则化的相关操作。过拟合现象通常是在网络模型太大,训练时间过长,或者没有足够多的数据时发生。Dropout技术最早于2012年Hinton文章《ImageNet Classification with Deep Convolutional Neural Networks》中提出,在这篇文章中,Dropout技术确实提升了模型的性能,一般是添加到卷积神经网络模型的全连接层中,使用深度学习工具箱实现起来很容易。
Keras实现
在Keras中,使用下面的一句即可实现:
代码语言:javascript复制keras.layers.Dropout(rate, noise_shape=None, seed=None)
- 以0.5的丢弃率开始,并将其逐渐调低后进行实验测试,直到网络模型的性能最好。(来源)
例子:
代码语言:javascript复制model=keras.models.Sequential()model.add(keras.layers.Dense(150, activation="relu"))model.add(keras.layers.Dropout(0.5))
从上面代码中看到,这仅适用于卷积神经网络的全连接区域。对于其它区域,我们不应该使用Dropout这项技术。 相反,应该在卷积层之间插入Batch Normalization(批量标准化),这项技术将使得模型正则化化,进而使得模型在训练期间更加地稳定。
批量标准化|Batch Normalization
批量标准化(Batch Normalization )是规范化卷积神经网络的另外一种常用方法,除了具有正则化效果之外,批量标准化还可以使得卷积神经网络在训练期间能够抵抗梯度消失现象,这可以减少训练时间并能够获得更好的性能。
批量标准化可以抵抗梯度消失
Keras实现
要在Keras中实现批量标准化,只需要使用以下命令即可:
代码语言:javascript复制keras.layers.BatchNormalization()
当在构建卷积神经网络模型中应用批量标准化时:
- 在卷积层和激活层之间插入批量标准化层(来源);
- 可以在此批量标准化层中调整一些超参数; 你也可以在激活函数之后插入批量标准化操作,但根据我个人的经验, 这两种方法取得的效果都非常的相近。
例子:
代码语言:javascript复制model.add(Conv2D(60,3, padding = "same"))model.add(BatchNormalization())model.add(Activation("relu"))
Batch normalization取代Dropout。
即使你不担心网络模型会出现过拟合现象,但在网络模型中应用批量标准化也有很多好处。基于此及其正则化效果,批量标准化已经在很大程度上取代了现代卷积神经网络模型中的Dropout操作。
“我们提出了一种使用批量标准化构建网络、训练和执行推理的算法,由此搭建的网络可以通过饱和非线性进行训练,这样更能容忍增加的训练率,并且通常不需要Dropout进行正规化操作。”—— Ioffe和Svegedy于2015年提出。
至于为什么Dropout在最近的卷积神经网络模型构建中失宠,主要有以下两个原因:
- 首先,在对卷积层进行正则化时,Dropout通常不太有效;原因在于卷积层具有很少的参数,因此初始时他们需要较少的正则化操作。此外,由于特征映射的空间关系,激活值可以变得高度相关,这使得Dropout无效。(来源)
- 其次,擅长正则化的Dropout技术现在已经过时了。 像VGG16这样在网络末端包含全连接层的大型网络模型,对于这样的模型,过拟合通常是通过在全连接层之间添加Dropout操作来解决。
VGGNet和其全连接层
不幸的是, 最近一些新的卷积神经网络模型已经远离这种全连接结构,通过用全局平均池化(GAP)替换全连接层,这样可以大大减少网络模型的大小,同时提高网络模型的性能。 之后会再写一篇文章,详细说明如何在卷积神经网络中实现全局平均池化。在此之前,建议阅读 ResNet这篇论文 ,以了解全局平均池化操作的好处。
实验
本文通过一个实验来测试批量标准化是否减少了在卷积之间插入后的泛化错误。(链接) 此外,构建了5个相同的卷积神经网络,并在卷积之间插入了Dropout层,每个使用Dropout层的卷积神经网络模型的丢弃率不同。
通过在Cifar100数据集上训练每个模型,获得了以下结果:
从图中可以看到,使用批量标准化的模型其性能最高,这也支持了声称应在卷积之间使用批量标准化能提升模型性能的经验之说。此外,可以看到使用批量标准化的模型性能高于使用Dropout操作的模型。因此不应该在卷积层之间使用Dropout操作,因为使用Dropout的模型性能往往比不使用任何操作的模型性能更差。 想了解更多的有关信息,可以查看我的GitHub上完整文章。
小贴士
如果你想知道是否应该在卷积网络中应用Dropout,读完本文后你就清楚了,应该仅在全连接层上使用Dropout操作,并在卷积层之间使用批量标准化。 如果您想了解有关批量标准化的更多信息,请阅读:
- https://towardsdatascience.com/intuit-and-implement-batch-normalization-c05480333c5b