神经网络权重以线性单位爆炸
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),但我担心添加衰减会掩盖网络中的错误,即权重应该收敛并保持自然收敛,尤其是在学习率极低的情况下。以上是关于神经网络权重以线性单位爆炸的主要内容,如果未能解决你的问题,请参考以下文章
梯度爆炸是什么?有什么后果?如何判断梯度爆炸?如何避免梯度爆炸?