选择学习率

数据挖掘 机器学习 神经网络 深度学习 优化 超参数
2021-10-07 19:36:47

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

  • 学习率是否与误差梯度的形状有关,因为它决定了下降率?
  • 如果是这样,您如何使用这些信息来告知您有关价值的决定?
  • 如果不是我应该选择什么样的价值观,我应该如何选择?
  • 似乎您希望使用较小的值来避免超调,但是您如何选择一个值,以免陷入局部最小值或需要很长时间才能下降?
  • 有一个恒定的学习率是否有意义,或者我应该使用一些指标来改变它的值,因为我接近梯度的最小值?

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

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

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

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

      在此处输入图像描述

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

  • 如果不是我应该选择什么样的价值观,我应该如何选择?

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

    • 通常,最好的值接近最高的稳定学习率,并且在训练过程中使用学习率衰减/退火(线性或指数)。这背后的原因是,早期有一个明确的学习信号,因此积极的更新鼓励探索,而后来较小的学习率允许更精细地利用局部误差表面。

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

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

对于你的第四点,你是对的,通常一个人必须选择一个“平衡”的学习率,既不应该过冲也不应该收敛太慢。可以绘制成本函数下降的学习率来诊断/微调。在实践中,Andrew 通常使用 L-BFGS 算法(在第 12 页中提到)来获得“足够好”的学习率。

选择学习率是称为超参数优化的“元问题”的一个示例。最佳学习率取决于手头的问题,以及被优化模型的架构,甚至取决于模型在当前优化过程中的状态!甚至还有专门用于超参数优化的软件包,例如spearminthyperopt(仅举几个例子,还有很多其他的例子!)。

除了全面的超参数优化之外,我还想提一下目前尚未提及的一种非常常见的用于选择学习率的技术。模拟退火是一种优化模型的技术,从一个大的学习率开始,随着优化的进行逐渐降低学习率。通常,您使用较大的学习率(0.1 左右)来优化您的模型,然后逐渐降低这个率,通常是一个数量级(所以到 0.01,然后是 0.001,0.0001 等)。

只要取得进展,这可以与提前停止相结合,以一种学习率优化模型,然后在进展似乎缓慢时切换到较小的学习率。较大的学习率似乎有助于模型定位一般的大规模最优区域,而较小的学习率有助于模型专注于一个特定的局部最优。

从我的硕士论文中复制粘贴

  • 如果损失在几个时期内没有减少,则学习率可能太低。优化过程也可能陷入局部最小值。
  • 损失为 NAN 可能是由于学习率太高。另一个原因是除以零或取零的对数。
  • 权重更新跟踪:Andrej Karpathy 在 CS231n 第 5 讲中提出跟踪权重更新,以检查学习率是否选得好。他建议权重更新应该在 10-3 的数量级。如果权重更新太高,则必须降低学习率。如果权重更新过低,则必须提高学习率。
  • 典型的学习率在 [0.1, 0.00001]