首页 > 解决方案 > 深度神经网络模型在一个 epoch 后停止学习

问题描述

我正在训练一个无监督的 NN 模型,由于某种原因,恰好在一个 epoch(80 步)之后,模型停止学习。 在此处输入图像描述] 你知道它为什么会发生吗?我应该怎么做才能防止它发生?

这是关于我的 NN 的更多信息:我有一个试图解决优化问题的深度 NN。我的损失函数是定制的,它是我在优化问题中的目标函数。所以如果我的优化问题是min f(x) ==> loss,现在在我的 DNNloss = f(x)中。我有 64 个输入,64 个输出,中间有 3 层:

self.l1 = nn.Linear(input_size, hidden_size)
self.relu1 = nn.LeakyReLU()
self.BN1 = nn.BatchNorm1d(hidden_size)

最后一层是:

self.l5 = nn.Linear(hidden_size, output_size)
self.tan5 = nn.Tanh()
self.BN5 = nn.BatchNorm1d(output_size)

扩展我的网络。有了更多的层和节点(双打:每 200 个节点 8 层),我可以在降低误差方面取得更多进展,但在 100 步之后训练误差再次变平!

在此处输入图像描述

标签: machine-learningdeep-learningneural-networkpytorchunsupervised-learning

解决方案


症状是训练损失相对较早地停止改善。假设您的问题完全可以学习,那么这种行为的原因有很多。以下是最相关的:

  • 输入预处理不当:神经网络更喜欢零均值的输入。例如,如果输入都是正数,它将限制权重在同一方向上更新,这可能是不可取的(https://youtu.be/gYpoJMlgyXA)。

因此,您可能希望从所有图像中减去平均值(例如,从 3 个通道中的每个通道中减去 127.5)。缩放以使每个通道中的单位标准偏差也可能会有所帮助。

  • 网络的泛化能力:网络对于任务来说不够复杂或深度不够。

    这很容易检查。你可以只用几张图片(比如 3 到 10 张)训练网络。网络应该能够过拟合数据并将损失驱动到几乎为 0。如果不是这种情况,您可能必须添加更多层,例如使用超过 1 个 Dense 层。

另一个好主意是使用预训练的权重(在 Keras 文档的应用程序中)。您可以调整顶部的密集层以适应您的问题。

  • 权重初始化不当。不正确的权重初始化会阻止网络收敛(https://youtu.be/gYpoJMlgyXA,与之前相同的视频)。

    对于 ReLU 激活,您可能希望使用 He 初始化而不是默认的 Glorot 初始化。我发现有时这可能是必要的,但并非总是如此。

最后,您可以使用 Keras 的调试工具,例如 keras-vis、keplr-io、deep-viz-keras。它们对于打开卷积网络的黑盒非常有用。

我遇到了同样的问题,然后我遵循了以下方法:在浏览了一篇博客文章后,我设法确定我的问题是由我的标签编码引起的。最初我将它们作为单热编码,看起来像 [[0, 1], [1, 0], [1, 0]],在博客文章中它们的格式为 [0 1 0 0 1]。将我的标签更改为此并使用二元交叉熵使我的模型正常工作。感谢 Ngoc Anh Huynh 和 rafaelvalle!


推荐阅读