选择学习率


85

我目前正在SGD使用反向传播为神经网络实现随机梯度下降,尽管我了解其目的,但我对如何选择学习率的值存在一些疑问。

  • 学习率是否与误差梯度的形状有关,因为它决定了下降率?
  • 如果是这样,您如何使用此信息来告知您有关价值的决定?
  • 如果不是那样,我应该选择哪种值,以及如何选择它们?
  • 似乎您希望使用较小的值来避免过冲,但是如何选择一个值以免陷入局部最小值或花很长时间下降呢?
  • 保持恒定的学习速度有意义吗?还是应该在接近梯度最小值时使用一些指标来更改其值?

简而言之:如何选择SGD的学习率?

Answers:


69
  • 学习率是否与误差梯度的形状有关,因为它决定了下降率?

    • 以普通新币计算,答案是否定的。使用整体学习率,该学习率与误差梯度无关。但是,您所获得的直觉启发了SGD更新规则的各种修改。
  • 如果是这样,您如何使用此信息来告知您有关价值的决定?

    • Adagrad是其中最广为人知的工具,它根据每个维度上的误差梯度gt的历史记录的l2范数来缩放每个维度上的全局学习率η

      在此处输入图片说明

    • Adadelta是另一种这样的训练算法,它既使用了像adagrad这样的误差梯度历史,又使用了权重更新历史,并且具有根本不必设置学习率的优势。

  • 如果不是那样,我应该选择哪种值,以及如何选择它们?

    • 设置神经网络中普通SGD的学习率通常是从一个合理的值(例如0.01)开始,然后进行交叉验证以找到最佳值的过程。典型值的范围从0.0001到1。
  • 似乎您希望使用较小的值来避免过冲,但是如何选择一个值以免陷入局部最小值或花太长时间下降呢?保持恒定的学习速度有意义吗?还是应该在接近梯度最小值时使用一些指标来更改其值?

    • 通常,最佳值接近最高稳定学习率,并且在训练过程中会使用学习率衰减/退火(线性或指数式)。其背后的原因是,在早期就有清晰的学习信号,因此积极的更新鼓励探索,而在后来的学习率较低时,则可以更精细地利用局部错误表面。

1
在实践中,您将使用adadelta的学习率。在某些问题上,它不能没有。
拜耳2014年

应该注意的是,如今,Adam优化器比Adagrad或Adadelta更常见。
E_net4仍在罢工

22

以下是Andrew Ng在神经网络(反向传播)中关于学习率的一个很好的注释(第12页)。您将找到有关学习率的详细信息。

http://web.stanford.edu/class/cs294a/sparseAutoencoder_2011new.pdf

对于您的第4点,您说对了,通常必须选择一种“平衡的”学习速率,该速率既不应过高,也不能收敛得太慢。可以绘制成本函数下降的学习率以进行诊断/微调。实际上,安德鲁通常使用L-BFGS算法(在第12页中提到)来获得“足够好”的学习率。


9

选择学习速率是被称为超参数优化的“元问题”的示例。最佳学习率取决于手头的问题,要优化的模型的体系结构,甚至取决于当前优化过程中模型的状态!甚至有专门超参数优化软件包,如留兰香hyperopt(只是一对夫妇的例子,还有很多其他的!)。

除了全面的超参数优化外,我想提到一种到目前为止尚未提到的选择学习速率的非常普遍的技术。模拟退火是一种用于优化模型的技术,其中模型的学习速率较高,随着优化的进行逐渐降低学习速率。通常,您可以使用较高的学习率(0.1左右)来优化模型,然后逐渐降低该速度(通常降低一个数量级(依次降低到0.01、0.001、0.0001等))。

只要取得进展,就可以将其与早期停止相结合,以一种学习率优化模型,然后在进度似乎变慢时切换到较小的学习率。较高的学习率似乎可以帮助模型确定一般的大规模最优区域,而较低的学习率可以帮助模型将注意力集中在一个特定的局部最优值上。


6

我的硕士论文复制粘贴:

  • 如果损失在几个时期内没有减少,则学习率可能太低。优化过程也可能停留在局部最小值中。
  • 失去NAN可能是由于学习率太高。另一个原因是被零除或取零的对数。
  • 权重更新跟踪:Andrej Karpathy在CS231n的第五次演讲中提出了跟踪权重更新的方法,以检查学习率是否被正确选择。他建议权重更新应在10−3左右。如果权重更新过高,则必须降低学习率。如果权重更新太低,则必须提高学习率。
  • 典型的学习率在[0.1,0.00001]中

4

在我们的迭代过程中,学习率被转换为“步长”,多年来一直是一个热门话题,并且还将持续下去。

我关注的步长有三个选项:

  • 一个与“ 时间 ”有关,并且每个维度应共享相同的步长。您可能已经注意到类似

αt

t表示当前迭代次数,alpha是超参数

  • 下一个与梯度有关,每个维都有自己的步长。您可能已经注意到类似

1αβ+s=1t1gs2αβ+s=1tgs2

虽然alpha和beta是超参数,但g表示梯度

  • 最后一个是时间和梯度组合,它应该像

1αβ+s=1t1gs2αβ+s=1tgs2+γt

要么

1αβ+s=1t1gs2αβ+s=1tgs2γt

希望这对您有帮助,祝您好运-)


您对此有参考吗?
乔恩

您可以参考FTRL的学习率部分,我们可以用TIME和GRADIENT来表述。

3

神经网络通常通过权重的梯度下降来训练。这意味着在每次迭代中,我们使用反向传播来计算损失函数相对于每个权重的导数,然后从该权重中减去它。但是,如果您尝试这样做,则权重在每次迭代中变化太大,这将使它们“过度校正”,并且损失实际上会增加/发散。因此,在实践中,人们通常先将每个导数乘以一个小的值,称为“学习率”,然后再从相应的权重中减去它。

您还可以将神经网络的损失函数视为一个表面,其中您可以向其移动的每个方向都代表一个权重值。梯度下降就像在斜坡的当前方向上跳跃一样,学习速率就像您所经历的跳跃长度一样。



2

让我简要介绍一下基于杰里米·霍华德(Jeremy Howard)的深度学习课程1 选择学习率的另一种方法。如果您想更深入地学习,请参阅此博客文章

杰里米·霍华德(Jeremy Howard)课程中提出的学习率是基于一种系统的方法来尝试不同的学习率,并选择使损失函数下降得最多的一种。这是通过向小批量梯度下降方法中喂入许多批次,并在您向该方法中喂入的每个新批次中提高学习率来完成的。当学习率非常小时,损失函数将非常缓慢地降低。当学习率很高时,损失函数将增加。在这两种情况之间,存在一个最佳学习率,损失函数为此而降低最快。如下图所示:

在此处输入图片说明

103

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.