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