我认为Adam优化器的设计可以自动调整学习速度。 但是有一个选项可以明确提及Keras中Adam参数选项的衰减。 我想澄清一下衰减对Keras中Adam优化器的影响。 如果我们使用衰减对模型进行编译,比如说在lr = 0.001上为0.01,然后对运行50个纪元的模型进行拟合,那么学习率是否在每个纪元后降低了0.01倍?
有什么方法可以指定学习率仅在运行一定时期后才衰减?
在pytorch中,有一个名为AdamW的不同实现,标准keras库中没有该实现。 这是否与如上所述在每个时期之后改变衰减相同?
预先感谢您的答复。
答案 0 :(得分:3)
在source code中,decay
根据{p> 1调整lr
iterations
请参阅下面的image。这是与时代无关的。 lr = lr * (1. / (1. + decay * iterations)) # simplified
在每次批量匹配时增加1(例如,每次调用iterations
或train_on_batch
在x
中有多少批次-通常为model.fit(x)
批次)。
要实现您所描述的内容,可以使用如下所示的回调:
len(x) // batch_size
from keras.callbacks import LearningRateScheduler
def decay_schedule(epoch, lr):
# decay by 0.1 every 5 epochs; use `% 1` to decay after each epoch
if (epoch % 5 == 0) and (epoch != 0):
lr = lr * 0.1
return lr
lr_scheduler = LearningRateScheduler(decay_schedule)
model.fit(x, y, epochs=50, callbacks=[lr_scheduler])
以一个函数作为参数,并且该函数在每个纪元的开始处被纪元索引和LearningRateScheduler
馈送lr
。然后,它根据该函数更新.fit
-因此在下一个时期,该函数将被馈给更新 lr
。
此外,我-Keras AdamW也提供了AdamW,NadamW和SGDW的Keras实现。
澄清:对lr
的首次调用会调用.fit()
的{{3}}-如果我们不希望epoch = 0
立即衰减,我们应该在lr
中添加epoch != 0
支票。然后,decay_schedule
表示已经通过了多少个时期-因此,当epoch
时,将应用衰减。
答案 1 :(得分:1)
在内部,每个批处理大小之后的学习率都会下降,而在每个时期之后并不会像通常认为的那样。
您可以在此处了解更多信息:https://www.pyimagesearch.com/2019/07/22/keras-learning-rate-schedules-and-decay/
不过,您还可以通过自定义回调函数实现自己的learning_rate调度程序:
def learning_rate_scheduler(epoch, lr):
#Say you want to decay linearly by 5 after every 10 epochs the lr
#(epoch + 1) since it starts from epoch 0
if (epoch + 1) % 10 == 0:
lr = lr / 5
callbacks = [
tensorflow.keras.callbacks.LearningRateScheduler(learning_rate_scheduler, verbose=1)
]
model.fit(...,callbacks=callbacks,...)
以上方法适用于所有类型的优化器,不仅适用于Adam。