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_begin
和 epoch = 0
- 如果我们不希望 lr
要立即衰减,我们应该在 decay_schedule
中添加一个 epoch != 0
检查。然后,epoch
表示 已经过去了多少个 epoch - 所以当 epoch = 5
时,应用衰减。
我认为 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_begin
和 epoch = 0
- 如果我们不希望 lr
要立即衰减,我们应该在 decay_schedule
中添加一个 epoch != 0
检查。然后,epoch
表示 已经过去了多少个 epoch - 所以当 epoch = 5
时,应用衰减。