有关神经网络的最受欢迎的问题之一似乎是:
帮助!!我的神经网络没有收敛!!
因此,在消除网络实施中的任何错误后,应该尝试哪些最常见的事情?
我知道要尝试的事情会因网络架构而有很大差异。 但是,在构建自己的神经网络时,你能够调整哪些参数(学习率,动量,初始权重等)和实现新功能(窗口动量?)?
如果可能,请提供与语言无关的答案。这个问题旨在给那些坚持神经网络的人提供一些指导,这些神经网络没有收敛......
答案 0 :(得分:3)
如果我们正在谈论分类任务,那么在训练你的网之前你应该洗牌。我的意思是,在成千上万的第2课等例子之后,不要用数千个第1课的例子来喂你的网......如果你这样做,你的网很可能不会收敛,但会倾向于预测最后训练的课程。
答案 1 :(得分:1)
如果问题只是收敛(不是实际的“训练有素的网络”,这是解决SO的广泛问题的方法)那么一旦代码合适,唯一可能是问题的是训练方法参数。如果使用朴素反向传播,则这些参数为learning rate
和momentum
。对于任何初始化,任何架构,正确实现的神经网络都应该收敛以便对这两个参数进行良好选择(事实上,对于momentum=0
它应该收敛到某些解决方案对于足够小的learning rate
)。
特别是 - 有一种称为“resillient backprop”的良好启发式方法,它实际上是无参数的appraoch,应该(几乎)总是收敛(假设正确实现)。
答案 2 :(得分:1)
我在实现自己的反向支持神经网络时遇到了这个问题。我尝试了以下方法:
答案 3 :(得分:1)
如果您使用的是ReLU激活,则可能会遇到"dying ReLU"问题。简而言之,在某些条件下,任何具有ReLU激活的神经元都可能会受到(偏差)调整,从而导致它再也不会被激活。可以通过“泄漏ReLU”激活来解决此问题,该文章对此进行了详细说明。
例如,我用ReLU输出产生了一个失败的简单MLP(3层)网络。我提供了可能无法失败的数据,但仍然失败。我降低了学习率,但失败却更加缓慢。它总是收敛于以相等的概率预测每个类别。都是通过使用泄漏的ReLU而不是标准ReLU来解决的。
答案 4 :(得分:0)
在尝试了不同的元参数(优化/架构)之后,最可能的地方是 - THE DATA
至于我自己 - 为了最大限度地减少摆弄元参数,我保持优化器自动化 - Adam 可以选择。
关于应用程序与架构有一些经验法则......但最好自己处理那些问题。
指出: 根据我的经验,在您调试网络(简单的调试)之后,仍然没有收敛或达到不希望的局部最小值,通常的怀疑是数据。 天气你有相反的样品或只是不正确的(异常值),少量可以说0.6-acc到(清洗后)0.9-acc ..
一个较小但金色(干净)的数据集比一个稍微脏的数据集要好得多...... 通过扩充,您可以进一步调整结果。