为什么学习率会导致我的神经网络的权重飙升?

数据挖掘 机器学习 Python 张量流 优化 梯度下降
2021-10-11 05:23:02

我正在使用 tensorflow 编写简单的神经网络进行一些研究,并且在训练时遇到了很多关于“nan”权重的问题。我尝试了许多不同的解决方案,例如更改优化器、更改损失、数据大小等,但无济于事。最后,我注意到学习率的变化使我的权重产生了令人难以置信的差异。

使用 0.001 的学习率(我认为这是相当保守的),最小化函数实际上会成倍地增加损失。在一个时期之后,损失可能会从数千跳到一万亿,然后到无穷大(“nan”)。当我将学习率降低到 0.0001 时,一切正常。

1)为什么一个数量级会有这样的效果?

2) 为什么最小化函数从字面上执行与其功能相反的功能并使损失最大化?在我看来,这不应该发生,无论学习率如何。

2个回答

你可能会发现深度学习的第 8 章很有帮助。在其中,作者讨论了神经网络模型的训练。这是非常复杂的,所以我对你遇到困难并不感到惊讶。

一种可能性(除了用户错误)是您的问题是高度病态的。梯度下降法在计算更新时仅使用一阶导数(梯度)信息。当二阶导数(Hessian)是病态的时,这可能会导致问题。

引用作者的话:

即使在优化凸函数时也会出现一些挑战。其中,最突出的是 Hessian 矩阵的病态H. 这是大多数数值优化中的一个非常普遍的问题,无论是凸的还是其他的,在第 4.3.1 节中有更详细的描述。

病态问题通常被认为存在于神经网络训练问题中。病态可以通过导致 SGD 被“卡住”来表现出来,即使是非常小的步骤也会增加成本函数。[我的重点补充]

作者提供了一个简单的推导来表明情况确实如此。使用梯度下降,成本函数应该改变(到二阶)

ε22GHG-εGG

在哪里 G 是梯度, H 是 Hessian 矩阵,并且 ε是学习率。显然,如果二阶导数很大,则第一项会淹没第二项,成本函数将增加,而不是减少。由于第一项和第二项的比例不同ε, 缓解这个问题的一种方法是减少 ε(当然,这会导致学习太慢)。

1)为什么一个数量级会有这样的效果?

2) 为什么最小化函数从字面上执行与其功能相反的功能并使损失最大化?在我看来,这不应该发生,无论学习率如何。

有两个主要原因。第一个,您在第一步中使用的数据与在第二步中使用的数据不同。如果在第一步中模型学习了这些值并落入局部最小值,那么它很可能会给新值带来更大的损失。

第二个原因是成本函数的形状。您尝试通过小步骤最小化该值,这些步骤的长度由两个因素给出:梯度和学习率。想象你的功能就像 x^2。如果您的值接近 0,则梯度会比它进一步小,但是如果您的学习率很大,那么您实际上会增加误差,而不是接近 0,因为您的新点基于评分和学习率比上一步更接近 0。这可能会发生好几次。

看看这个链接: http: //www.statisticsviews.com/details/feature/5722691/Getting-to-the-Bottom-of-Regression-with-Gradient-Descent.html

如果你看到 alpha 0.01 和 alpha 0.12 的数字,你会看到在第一个图中学习率很小,因此梯度越来越接近最小值,但在第二种情况下,学习率太大,梯度会移动每一步都更进一步。