我们应该为亚当优化器做学习率衰减吗

Posted

技术标签:

【中文标题】我们应该为亚当优化器做学习率衰减吗【英文标题】:Should we do learning rate decay for adam optimizer 【发布时间】:2017-01-23 20:28:26 【问题描述】:

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

【问题讨论】:

学习率衰减是指:pytorch.org/docs/stable/… 对吗? 【参考方案1】:

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

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

确实,学习率会在训练步骤中自行调整,但如果您想确保每个更新步骤不超过 lambda,您可以使用指数衰减或其他方式降低 lambda。 当与先前关联的 lambda 参数计算的损失停止减少时,它可以帮助减少训练的最后一步中的损失。

【讨论】:

【参考方案2】:

根据我的经验,通常不需要使用 Adam 优化器进行学习率衰减。

理论上,Adam 已经处理了学习率优化 (check reference):

“我们提出了 Adam,一种有效的随机优化方法, 只需要很少的内存需求的一阶梯度。 该方法计算不同的个体自适应学习率 来自估计的第一和第二时刻的参数 渐变; Adam 这个名字来源于自适应矩估计。”

与任何深度学习问题 YMMV 一样,一种尺寸并不适合所有人,您应该尝试不同的方法,看看哪种方法适合您,等等。

【讨论】:

【参考方案3】:

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

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

【讨论】:

本文另有建议:spell.ml/blog/…【参考方案4】:

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

由于自适应特性,默认率相当稳健,但有时您可能希望对其进行优化。你可以做的是事先找到一个最佳的默认率,从一个非常小的比率开始并增加它直到损失停止减少,然后查看损失曲线的斜率并选择与损失最快减少相关的学习率(不是损失实际上最低的点)。 Jeremy Howard 在 fast.ai 深度学习课程及其循环学习率论文中提到了这一点。

编辑:人们最近开始将单周期学习率策略与 Adam 结合使用,并取得了很好的效果。

【讨论】:

你提到的单周期学习率策略有参考吗? 论文:arxiv.org/abs/1803.09820,社区参考:twitter.com/jeremyphoward/status/981928159879749632?lang=en 关于周期性 lr 的不错的相关博客文章,另一位 Jeremy 对损失情况进行了可视化。 jeremyjordan.me/nn-learning-rate【参考方案5】:

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

【讨论】:

以上是关于我们应该为亚当优化器做学习率衰减吗的主要内容,如果未能解决你的问题,请参考以下文章

torch.optim.adam里面的参数可以自动设置吗

神经网络优化中的学习率调整(下)

神经网络优化 - 滑动平均

常用深度学习模型调优方法

常用深度学习模型调优方法

tensorflow机器学习指数衰减学习率的使用tf.train.exponential_decay