当神经网络不收敛时要尝试的事情

Posted

技术标签:

【中文标题】当神经网络不收敛时要尝试的事情【英文标题】:Things to try when Neural Network not Converging 【发布时间】:2014-02-02 10:05:11 【问题描述】:

关于神经网络的最受欢迎的问题之一似乎是:

帮助!!我的神经网络没有收敛!!

请参阅here、here、here、here 和 here。

那么在消除网络实现中的任何错误之后,应该尝试的最常见的事情是什么?

我知道要尝试的事情会因网络架构而异。 但是调整哪些参数(学习率、动量、初始权重等)并实现哪些新功能(窗口动量?),您能够在构建自己的神经网络时克服一些类似的问题吗?

如果可能,请给出与语言无关的答案。这个问题旨在为那些被困在不收敛的神经网络中的人提供一些指导。

【问题讨论】:

您的问题中的链接太多。您将通过措辞更好的问题获得更多意见。然而,这是一个很好的话题!祝你好运。不要忘记标准化您的数据。 【参考方案1】:

如果您使用 ReLU 激活,您可能会遇到"dying ReLU" 问题。简而言之,在某些条件下,任何具有 ReLU 激活的神经元都可能受到(偏差)调整,导致它永远不会再次被激活。它可以通过“Leaky ReLU”激活来修复,在那篇文章中有很好的解释。

例如,我制作了一个带有 ReLU 输出的简单 MLP(3 层)网络,但失败了。我提供了它不可能失败的数据,但它仍然失败了。我把学习率调低了,它失败得更慢了。它总是收敛于以相等的概率预测每个类别。通过使用 Leaky ReLU 而不是标准 ReLU,这一切都得到了解决。

【讨论】:

【参考方案2】:

如果我们谈论的是分类任务,那么您应该在训练您的网络之前打乱示例。我的意思是,不要用数千个类#1的例子,在数千个类#2的例子之后,等等......如果你这样做,你的网络很可能不会收敛,但会倾向于预测最后一次训练类。

【讨论】:

【参考方案3】:

在您尝试了不同的元参数(优化/架构)之后,最有可能查看的地方是 - THE DATA

至于我自己 - 为了尽量减少对元参数的摆弄,我让我的优化器保持自动化 - Adam 是可选的。

有一些关于应用程序与架构的经验法则......但最好自己处理这些规则。

重点: 以我的经验,在你调试了网络(简单的调试)之后,仍然没有收敛或达到不希望的局部最小值,通常的怀疑是数据。 天气你有矛盾的样本或只是不正确的样本(异常值),少量可以使从 0.6-acc 到(清洁后)0.9-acc..

一个较小但黄金(干净)的数据集比一个大的略脏的数据集要好得多...... 通过增强,您可以进一步调整结果。

【讨论】:

【参考方案4】:

我在实现自己的 back prop 神经网络时遇到了这个问题。我尝试了以下方法:

实施动量(并将值保持在 0.5) 将学习率保持在 0.1 绘制了每个神经元的误差、权重、输入和输出,以图表形式查看数据更有助于找出问题所在 尝试了不同的激活函数(都是 sigmoid)。但这对我帮助不大。 将所有权重初始化为介于 -0.5 和 0.5 之间的随机值(我的网络输出在 -1 和 1 范围内) 我没有尝试过,但Gradient Checking 也有帮助

【讨论】:

由于我是从零开始实现神经网络的,结果发现更新函数有错误。我通过梯度检查找到了它。但在每种情况下,确切的问题可能会有所不同。【参考方案5】:

如果问题只是收敛(而不是实际的“训练有素的网络”,这对于 SO 来说是一种广泛的问题),那么一旦代码正常,唯一可能成为问题的是训练方法参数。如果使用朴素的反向传播,那么这些参数是learning ratemomentum。对于任何初始化和任何架构,正确实现的神经网络都应该收敛,以便更好地选择这两个参数(事实上,对于momentum=0,它也应该收敛到 some 解决方案,足够小的learning rate)。

特别是 - 有一种很好的启发式方法称为“弹性反向传播”,它实际上是无参数方法,应该(几乎)总是收敛(假设正确实施)。

【讨论】:

以上是关于当神经网络不收敛时要尝试的事情的主要内容,如果未能解决你的问题,请参考以下文章

神经网络不学习,收敛于一个输出

神经网络 - 输出收敛到 0,python

markdown 当Gnome shell冻结或变得反应迟钝时要尝试的事情

反向传播算法收敛过快导致结果不佳

模型不收敛的原因

网络收敛比