Keras中Adam优化器的衰减参数

Decay parameter of Adam optimizer in Keras

我认为 Adam 优化器的设计使其能够自动调整学习率。 但是在 Keras 的 Adam 参数选项中有一个选项可以明确提及衰减。 我想阐明衰减对 Keras 中 Adam 优化器的影响。 如果我们使用衰减编译模型,例如在 lr = 0.001 上使用 0.01,然后将模型拟合 运行 50 个时期,那么学习率是否会在每个时期后降低 0.01 倍?

有什么方法可以指定学习率仅在 运行 之后衰减一定数量的 epoch 吗?

在 pytorch 中有一个名为 AdamW 的不同实现,它不存在于标准 keras 库中。 这是否与上面提到的在每个纪元之后改变衰减相同?

预先感谢您的回复。

在内部,每个批量大小之后的每个学习率都会衰减,但并非像人们普遍认为的那样在每个时期之后。

您可以在此处阅读更多相关信息: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。

source code开始,decay根据

iterations调整lr
lr = lr * (1. / (1. + decay * iterations))  # simplified

见下文 image。这是与时代无关的。 iterations 在每次批次拟合时递增 1(例如,每次调用 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 - 因此在下一个纪元,该函数被提供 updated lr.

此外,我还有 AdamW、NadamW 和 SGDW 的 Keras 实现 - Keras AdamW



澄清:第一次调用 .fit() 调用 on_epoch_beginepoch = 0 - 如果我们不希望 lr 要立即衰减,我们应该在 decay_schedule 中添加一个 epoch != 0 检查。然后,epoch 表示 已经过去了多少个 epoch - 所以当 epoch = 5 时,应用衰减。