如何在深度神经网络中对抗欠拟合

数据挖掘 神经网络 深度学习
2021-09-23 20:19:52

当我开始使用人工神经网络 (NN) 时,我认为我必须将过度拟合作为主要问题。但在实践中,我什至无法让我的神经网络通过 20% 的错误率障碍。我什至无法在随机森林中击败我的分数!

我正在寻求一些非常笼统或不那么笼统的建议,说明应该如何使 NN 开始捕捉数据趋势。

为了实现 NN,我使用 Theano Stacked Auto Encoder 和教程中的代码,该代码在对 MNIST 数据集进行分类时效果很好(错误率低于 5%)。它是一个多层感知器,顶部有 softmax 层,每个隐藏层稍后都被预训练为自动编码器(在教程第 8 章中有详细描述)。有大约 50 个输入特征和大约 10 个输出类。NN 具有 sigmoid 神经元,所有数据都归一化为 [0,1]。我尝试了很多不同的配置:隐藏层的数量和其中的神经元(100->100->100、60->60->60、60->30->15 等),不同的学习和预训练费率等

我能得到的最好的结果是验证集的错误率是 20%,测试集的错误率是 40%。

另一方面,当我尝试使用随机森林(来自 scikit-learn)时,我很容易在验证集上得到 12% 的错误率,在测试集上得到 25%(!)。

我的预训练深度神经网络怎么会表现得如此糟糕?我应该尝试什么?

3个回答

深度网络的问题在于它们有很多超参数需要调整,而且解决方案空间非常小。因此,找到好的产品更像是一门艺术,而不是工程任务。我将从教程中的工作示例开始,并使用其参数来查看结果如何变化 - 这为参数和结果(最终和中间)之间的依赖关系提供了一个很好的直觉(尽管不是正式的解释)。

我还发现以下论文非常有用:

它们都描述了 RBM,但总体上包含了对深度网络的一些见解。例如,关键点之一是网络需要逐层调试——如果前一层不能很好地表示特征,那么后面的层几乎没有机会修复它。

虽然 ffriend 的回答为更多地了解神经网络如何(极其)难以正确调整提供了一些很好的指导,但我认为列出当前在神经网络中表现最佳的分类架构中使用的一些特定技术可能会有所帮助文学。

校正线性激活

对您的情况可能有所帮助的第一件事是将模型的激活函数从逻辑 sigmoid切换——f(z)=(1+ez)1--修正线性(又名 relu) --f(z)=max(0,z).

relu 激活有两大优势:

  • 它的输出是一个真正的零(不仅仅是一个接近零的小值)z0
  • 它的导数是常数,要么 0 要么z0或 1 为z>0.

relu 单元的网络基本上就像指数级线性网络的集合,因为接收输入的单元z0本质上是“关闭”(它们的输出为 0),而接收输入的单元z>0折叠成该输入的单个线性模型。常数导数也很重要,因为具有 relu 激活的深度网络倾向于避免梯度消失问题,并且可以在没有分层预训练的情况下进行训练。

请参阅 Glorot、Bordes 和 Bengio 的“Deep Sparse Rectifier Neural Networks” ( http://jmlr.csail.mit.edu/proceedings/papers/v15/glorot11a/glorot11a.pdf ),以获得关于这些主题的好论文。

辍学

过去几年许多研究小组一直提倡在分类器网络中使用“dropout”以避免过度训练。(例如,参见 Srivastava、Hinton、Krizhevsky、Sutskever 和 Salakhutdinov 的“Dropout:一种防止神经网络过度拟合的简单方法” http://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf) dropout,在训练期间,对于网络处理的每个输入,给定层中某些恒定比例的单元被随机设置为 0。这会强制未设置为 0 的单位“弥补”“缺失”单位。对于分类任务中的神经网络模型,Dropout 似乎是一种非常有效的正则化器。请参阅http://fastml上有关此的博客文章。

您可能有兴趣阅读 Microsoft Research 研究人员的以下论文:

Kaiming He、Xiangyu Zhang、Shaoqing Ren、Jian Sun: Deep Residual Learning for Image Recognition on arxiv,2015。

他们和你有类似的问题:

当更深的网络能够开始收敛时,一个退化问题就暴露出来了:随着网络深度的增加,准确度变得饱和(这可能不足为奇),然后迅速退化。出乎意料的是,这种退化不是由过度拟合引起的,并且向适当深度的模型添加更多层会导致更高的训练误差,如 [11, 42] 中所述,并已通过我们的实验得到彻底验证。

为了解决这个问题,他们使用了跳过架构。这样,他们训练了非常深的网络(1202 层),并在 ILSVRC 2015 挑战赛中取得了最好的成绩。