Keras中Adam优化器的衰减参数

Arj*_*jun 6 python keras tf.keras

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

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

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

预先感谢您的回复。

Ove*_*gon 7

源代码decay调整lriterations根据

lr = lr * (1. / (1. + decay * iterations))  # simplified
Run Code Online (Sandbox Code Playgroud)

见下。这是独立于时代的。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])
Run Code Online (Sandbox Code Playgroud)

LearningRateScheduler接受一个函数作为参数,并且函数被馈送历元索引和lr开始时由每个历元的.fit。然后它lr根据该函数进行更新- 因此在下一个时期,该函数被提供更新的 lr.

此外,我还提供了 AdamW、NadamW 和 SGDW 的 Keras 实现 - Keras AdamW



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