我们是否应该对 Adam 优化器进行学习速率衰减

我正在用亚当优化器训练一个图像定位网络有人建议我用指数衰减。我不想这么做,因为 Adam 优化器本身会降低学习速度。但那家伙坚持说他以前也这么做过。那么,我应该这样做吗? 你的建议背后有什么理论吗?

90485 次浏览

根据我的经验,通常没有必要做学习速率衰减与亚当优化。

理论上亚当已经处理了学习速率优化(检查参考文献) :

”我们提出亚当,一种有效的随机优化方法 只需要一阶梯度,内存需求很少。 方法 computes individual adaptive learning rates为不同的 参数估计的第一和第二阶段的 亚当这个名字来源于自适应矩估计

正如任何深度学习问题 YMMV,一个尺寸不适合所有,你应该尝试不同的方法,看看什么适合你,等等。

看情况。ADAM 使用单独的学习速率更新任何参数。这意味着网络中的每个参数都有一个特定的相关学习速率。

但是每个参数的单一学习率是使用 lambda (初始学习率)作为上限计算的。这意味着每个单独的学习速率可以从0(无更新)到 lambda (最大更新)不等。

的确,在训练过程中,学习速度会自动调整,但是如果你想确保每个更新步骤不会超过 lambda,你可以使用指数衰减或其他方法来降低 lambda。 它可以帮助减少损失在最近的一步训练,当计算损失与先前相关的 lambda 参数已停止减少。

亚当有一个单一的学习速率,但它是一个最大速率,是适应性的,所以我不认为很多人使用它的学习速率调度。

由于自适应的特性,默认速率是相当稳健的,但有时可能需要对其进行优化。你所能做的就是事先找到一个最佳的违约率,从一个非常小的比率开始,然后增加它直到损失停止下降,然后看损失曲线的斜率,选择与损失下降最快相关的学习率(而不是损失实际上最低的点)。Jeremy Howard 在 fast. ai 深度学习课程中提到了这一点,这一点来自于周期性学习率的论文。

Edit: People have fairly recently started using one-cycle learning rate policies in conjunction with Adam with great results.

是的,当然。根据我自己的经验,这对亚当学习速率衰减很有帮助。没有衰减,你必须设置一个非常小的学习速率,这样损失就不会开始发散后,减少到一个点。在这里,我发布了使用学习速率衰减的亚当和使用 TensorFlow 的代码。希望对某些人有帮助。

decayed_lr = tf.train.exponential_decay(learning_rate,
global_step, 10000,
0.95, staircase=True)
opt = tf.train.AdamOptimizer(decayed_lr, epsilon=adam_epsilon)

一个简单的替代方法是增加批量大小。每次更新更大量的示例将迫使优化器对更新更加谨慎。如果 GPU 内存限制了每次更新可以跟踪的样本数量,那么您可能不得不求助于 CPU 和常规 RAM 进行培训,这显然会进一步降低培训的速度。

从另一个角度来看

所有的随机梯度下降(SGD)优化器,包括 Adam,都是随机构建的,并且不能保证达到全局最小值

After several 通过约简次数,得到一个满意的局部极值。 因此,使用学习衰减不会有助于达到全局最小,因为它应该有所帮助。

而且,如果你使用它的学习率将最终变得非常 很小,算法就会失效。

Be careful when using weight decay with the vanilla Adam optimizer, as it appears that the vanilla Adam formula is wrong when using weight decay, as pointed out in the article Decoupled Weight Decay Regularization https://arxiv.org/abs/1711.05101 .

当你想用亚当来处理重量衰减时,你可能应该使用亚当 W 变体。