神经网络权重以线性单位爆炸

Posted

技术标签:

【中文标题】神经网络权重以线性单位爆炸【英文标题】: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 上询问 【参考方案1】:

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

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

【讨论】:

过拟合不是问题,但我的网络输出太大。因此,我得到的值不是 [-1, 1] 中的值,而是大于 1e60。【参考方案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),但我担心添加衰减会掩盖网络中的错误,即权重应该收敛并保持自然收敛,尤其是在学习率极低的情况下。

以上是关于神经网络权重以线性单位爆炸的主要内容,如果未能解决你的问题,请参考以下文章

[ch04-03] 用神经网络解决线性回归问题

梯度爆炸是什么?有什么后果?如何判断梯度爆炸?如何避免梯度爆炸?

MATLAB深度学习单层神经网络

深度学习中的梯度消失与梯度爆炸及解决方案

[深度学习][pytorch]pytorch实现一个简单得线性回归模型并训练

梯度消失与梯度爆炸