Keras中Adam优化器的衰减参数

时间:2020-02-02 18:04:34

标签: python keras tf.keras

我认为Adam优化器的设计可以自动调整学习速度。 但是有一个选项可以明确提及Keras中Adam参数选项的衰减。 我想澄清一下衰减对Keras中Adam优化器的影响。 如果我们使用衰减对模型进行编译,比如说在lr = 0.001上为0.01,然后对运行50个纪元的模型进行拟合,那么学习率是否在每个纪元后降低了0.01倍?

有什么方法可以指定学习率仅在运行一定时期后才衰减?

在pytorch中,有一个名为AdamW的不同实现,标准keras库中没有该实现。 这是否与如上所述在每个时期之后改变衰减相同?

预先感谢您的答复。

2 个答案:

答案 0 :(得分:3)

source code中,decay根据{p> 1调整lr

iterations

请参阅下面的image。这是与时代无关的。 lr = lr * (1. / (1. + decay * iterations)) # simplified 在每次批量匹配时增加1(例如,每次调用iterationstrain_on_batchx中有多少批次-通常为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。