我正在使用 Adam 优化器训练图像定位网络,有人建议我使用指数衰减。我不想尝试这个,因为 Adam 优化器本身会降低学习率。但那家伙坚持说他以前就这么做过。那么我应该这样做吗?你的建议背后有什么理论吗?
这要看情况。 ADAM 使用单独的学习率更新任何参数。这意味着网络中的每个参数都有一个特定的相关学习率。
但是每个参数的单个学习率是使用 lambda(初始学习率)作为上限计算的。这意味着每个学习率可以从 0(无更新)到 lambda(最大更新)变化。
确实,学习率会在训练步骤中自行调整,但如果您想确保每个更新步骤不超过 lambda,您可以使用指数衰减或其他方式降低 lambda。 当使用先前关联的 lambda 参数计算出的损失停止减少时,它可以帮助减少训练的最新步骤中的损失。
根据我的经验,通常不需要使用 Adam 优化器进行学习率衰减。
理论是 Adam 已经处理了学习率优化(检查参考):
“我们提出了 Adam,一种有效的随机优化方法, 仅需要一阶梯度,内存需求很少。 该方法计算不同的个体自适应学习率 来自第一和第二矩估计的参数 梯度; Adam 这个名字源自自适应矩估计。”
与任何深度学习问题 YMMV 一样,一种方法并不适合所有情况,您应该尝试不同的方法,看看哪种方法适合您,等等。
是的,绝对如此。根据我自己的经验,这对于 Adam 的学习率衰减非常有用。如果没有衰减,你必须设置一个非常小的学习率,这样损失在减少到一定程度后就不会开始发散。在这里,我发布了使用 Adam 并使用 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)
Adam 有一个单一的学习率,但它是一个自适应的最大速率,所以我认为没有多少人使用它的学习率调度。
由于自适应性质,默认率相当稳健,但有时您可能想要优化它。您可以做的是预先找到最佳违约率,从一个非常小的比率开始并增加它直到损失停止减少,然后查看损失曲线的斜率并选择与损失最快减少相关的学习率(不是损失实际上最低的点)。 Jeremy Howard 在 fast.ai 深度学习课程及其循环学习率论文中提到了这一点。
编辑: 人们最近开始与 Adam 结合使用单周期学习率策略,并取得了很好的效果。
在使用普通 Adam 优化器的权重衰减时要小心,因为使用权重衰减时,普通 Adam 公式似乎是错误的,如文章 解耦权重衰减正则化 https://arxiv.org/abs 中所指出的/1711.05101.
当您想使用 Adam 进行权重衰减时,您可能应该使用 AdamW 变体。
一个简单的替代方法是增加批量大小。每次更新的样本数量较多将迫使优化器对更新更加谨慎。如果 GPU 内存限制了每次更新可跟踪的样本数量,您可能不得不求助于 CPU 和传统 RAM 进行训练,这显然会进一步减慢训练速度。
从另一个角度看
所有随机梯度下降 (SGD) 优化器,包括 Adam,都已构建随机化,并且不能保证达到全局最小值
经过几次 减少次数,即可得到满意的局部极值。 因此,使用学习衰减不会帮助达到全局最小值,因为它应该有帮助。
此外,如果你使用它,学习率最终会变得非常 太小,算法就会变得无效。