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

  • 学习率是否与误差梯度的形状有关,因为它决定了下降速率?
  • 如果是这样,您如何使用此信息来告知您关于价值的决定?
  • 如果不是我应该选择哪种价值,我应该如何选择它们?
  • 似乎您希望小价值避免过度付出,但是如何选择一个使您不会被卡在本地的最小值或长期下降的情况下呢?
  • 拥有恒定的学习率是有意义的,还是我应该使用一些度量来改变其价值,因为我的梯度最低限度?

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

有帮助吗?

解决方案

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

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

    • Adagrad是其中最广为人知的,并扩展了全球学习率 η 基于误差梯度历史的L2规范在每个维度上 GT 在每个维度上:

      enter image description here

    • 阿达德尔塔 是另一种这样的培训算法,它既使用Adagrad等错误梯度历史记录和重量更新历史记录,并且具有优势 根本不必设定学习率.

  • 如果不是我应该选择哪种价值,我应该如何选择它们?

    • 在神经网中设定普通SGD的学习率通常是从一个理智值(例如0.01)开始的过程,然后进行交叉验证以找到最佳值。典型值在几个数量级上的范围从0.0001到1。
  • 似乎您希望小价值避免过度付出,但是如何选择一个使您不会被卡在本地的最小值或花费太长时间下降呢?拥有恒定的学习率是有意义的,还是我应该使用一些度量来改变其价值,因为我的梯度最低限度?

    • 通常,在培训过程中,使用最佳的价值接近最高稳定的学习率和学习率衰减/退火(线性或指数)。背后的原因是,早期就有一个明确的学习信号,因此积极的更新鼓励探索,而后来的学习率较小,可以更微妙地利用局部误差表面。

其他提示

以下是Andrew Ng的神经网(返回传播)学习率的非常好的注释(第12页)。您会找到与学习率有关的详细信息。

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

对于您的第四点,您通常必须选择一个“平衡”的学习率,这既不应该超出速度,也不应过快地收敛。一个人可以绘制学习率WRT的成本函数下降以诊断/微调。实际上,安德鲁通常使用L-BFGS算法(第12页中提到)获得“足够好”的学习率。

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

除了全尺度的超参数优化外,我还想提及一种技术,这对于选择到目前为止尚未提及的学习率很常见。 模拟退火 是一种优化模型的技术,该技术从大型学习率开始,并随着优化的进行逐渐降低学习率。通常,您以较大的学习率(0.1左右)优化模型,然后逐步降低该速率,通常是通过数量级(因此为0.01,然后是0.001、0.0001等)。

这可以与 提早停止 要以一个学习率优化模型,只要取得进步,一旦进步似乎放慢了速度,就可以切换到较小的学习率。较大的学习率似乎有助于模型定位一般的大型Optima区域,而较小的速率有助于该模型集中在一个特定的本地最佳上。

复制从 我的主人论文:

  • 如果几个时期的损失没有减少,则学习率可能太低。优化过程也可能被卡在局部最低限度中。
  • NAN的损失可能是由于学习率太高。另一个原因是零或对数为零。
  • 重量更新跟踪:在CS231N的第五次讲座中提出的Andrej Karpathy跟踪重量更新,以检查学习率是否精心挑选。他建议重量更新应为10-3。如果重量更新太高,则必须降低学习率。如果重量更新太低,则必须提高学习率。
  • 典型的学习率在[0.1,0.00001]中

在我们的迭代过程中,学习率变为“步进大小”,多年来一直是一个热门问题,并且会继续下去。

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

  • 一个与时间”,每个维度都将共享相同的步长。您可能已经注意到了类似的东西

美元

t演示当前迭代编号,而alpha是超级参数

  • 下一个与 坡度 ,每个维度都有自己的步骤大小。您可能已经注意到了类似的东西

美元{ alpha} { beta + sqrt { sum_ {s = 1}^{t} {t} {g_ {s}^2}}}}}} $

虽然alpha和beta是超级参数,但G证明了梯度

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

美元{ alpha} { beta + sqrt { sum_ {s = 1}^{t} {t} {g_ {s}^2}}}}}}}}}}}}} + frac { gamma}

或者

美元{ alpha} { beta + sqrt { sum_ {s = 1}^{t} {t} {g_ {s}^2}}}}}}}}}} * frac { gamma}

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

神经网络通常在重量上通过梯度下降训练。这意味着在每次迭代中,我们都会使用反向传播来计算每个权重相对于每个重量的损失函数的导数,并从该重量中减去。但是,如果您实际尝试过,权重将太大改变了每次迭代,这将使它们“过度正确”,并且损失实际上会增加/差异。因此,实际上,人们通常将每个衍生物乘以称为“学习率”的小价值,然后才从相应的重量中减去它。

您还可以将神经网络损失功能视为表面,每个方向都可以移动代表重量的值。梯度下降就像在斜坡的当前方向上飞跃,学习率就像您采取的飞跃的长度一样。

除了大卫的答案外,在Fastai中,我发现了使用特定体系结构找到该数据最佳学习率的概念。

但是那东西只存在于fastai/pytorch上。最近有人做了一个凯拉斯 执行.

反过来基于这些论文:

希望这可以帮助。

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

杰里米·霍华德(Jeremy Howard)的课程中提出的学习率是基于一种系统的方法来尝试不同的学习率,并选择使损失功能最降低的学习率。这是通过将许多批量喂入迷你批次梯度下降方法,并提高您为该方法喂养的每批新批次而提高学习率来完成的。当学习率很小时,损失函数将非常慢。当学习率很大时,损失函数将会增加。在这两个方案之间,有一个最佳的学习率,损失函数降低了最快。这可以从下图中看到:

enter image description here

我们看到,当学习率约为$ 10^{ - 3} $时,损失会非常快。使用这种方法,我们有一种一般的方法来为我们的NetOwork选择最佳恒定学习率的近似值。

许可以下: CC-BY-SA归因
scroll top