【问题标题】:Neural network weights explode in linear unit神经网络权重以线性单位爆炸
【发布时间】:2013-11-24 12:52:35
【问题描述】:

我目前正在使用 numpy 在 Python 中实现一个简单的神经网络和反向传播算法。我已经使用中心差异测试了我的反向传播方法,结果梯度是相等的。

但是,网络无法逼近简单的正弦曲线。该网络有一个具有 tanh 激活函数的隐藏层(100 个神经元)和一个具有线性激活函数的输出层。每个单元也有一个偏置输入。训练是通过简单的梯度下降来完成的,学习率为 0.2。

问题出在梯度上,随着每个时期变大,梯度会变大,但我不知道为什么?此外,如果我降低学习率,问题不会改变。

编辑:我已将代码上传到 pastebin:http://pastebin.com/R7tviZUJ

【问题讨论】:

  • 这是一个很好的、清晰的问题。不幸的是,这个网站感觉离题了。如果它关闭了,请考虑在stats.stackexchange.com 上询问

标签: numpy neural-network backpropagation


【解决方案1】:

看起来你不使用正则化。如果你训练你的网络足够长的时间,它将开始学习精确的数据而不是抽象的模式。

有几种方法可以规范您的网络,例如:停止训练、对大梯度投入高成本或更复杂的方法,例如退出。如果您搜索网络/书籍,您可能会发现很多选项。

【讨论】:

  • 过拟合不是问题,但我的网络输出太大。因此,我得到的值不是 [-1, 1] 中的值,而是大于 1e60。
【解决方案2】:

您可以尝试两种方法,也许可以结合使用:

  1. 使用较小的学习率。如果它太高,您可能会在当前方向上超出最小值很多,因此您的权重会越来越大。

  2. 使用较小的初始权重。这与第一项有关。较小的学习率也可以解决此问题。

【讨论】:

  • 我已经试过了。不幸的是,梯度“爆炸”了,只是变慢了。如果步骤太大,梯度应该振荡吗?但它会变得越来越大。
【解决方案3】:

太大的学习率可能无法收敛,甚至是 DIVERGE,这就是重点。

由于这个原因,梯度可能会发散:当超过最小值的位置时,生成的点不仅可能更远一点,甚至可能比最初的距离更远,而是在另一边。重复这个过程,它会继续发散。换句话说,与学习率相比,最佳位置周围的变化率可能会很大。

来源:我对以下视频的理解(在 7:30 附近观看)。 https://www.youtube.com/watch?v=Fn8qXpIcdnI&list=PLLH73N9cB21V_O2JqILVX557BST2cqJw4&index=10

【讨论】:

    【解决方案4】:

    我遇到了类似的问题(使用不同的库,DL4J),即使在极其简单的目标函数的情况下也是如此。 In my case, the issue turned out to be the cost function. 当我从负对数可能性更改为泊松或 L2 时,我开始得到不错的结果。 (加上指数学习率衰减后,我的结果会好很多。)

    【讨论】:

    • 我看到类似的东西试图训练网络进行线性回归。我确实添加了学习率衰减,这使我能够达到目标(我的测试数据的已知斜率为 0.5),但我担心添加衰减会掩盖网络中的错误,即权重应该收敛并保持自然收敛,尤其是在学习率极低的情况下。
    猜你喜欢
    • 2021-11-24
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2018-11-27
    相关资源
    最近更新 更多