余弦衰减

[源代码]

CosineDecay

keras.optimizers.schedules.CosineDecay(
    initial_learning_rate,
    decay_steps,
    alpha=0.0,
    name="CosineDecay",
    warmup_target=None,
    warmup_steps=0,
)

一个使用带可选预热的余弦衰减的 LearningRateSchedule

参见 Loshchilov & Hutter, ICLR2016, SGDR: 带有热重启的随机梯度下降。

关于学习率线性预热的思路,请参阅 Goyal et al.

当我们开始训练模型时,我们通常希望在学习率开始时增加,然后进行衰减。如果 warmup_target 是一个整数,此调度将针对 warmup_steps 的持续时间,将我们的学习率从 initial_learning_rate 线性增加到 warmup_target。之后,它将应用一个余弦衰减函数,在 decay_steps 的持续时间内将我们的学习率从 warmup_target 衰减到 alpha。如果 warmup_target 为 None,我们将跳过预热,衰减将从 initial_learning_rate 衰减到 alpha。它需要一个 step 值来计算学习率。你可以直接传递一个在每次训练步骤中递增的后端变量。

该调度是一个 1 参数的可调用对象,在传入当前优化器步骤时,它会产生一个预热然后衰减的学习率。这对于在不同优化器函数调用之间更改学习率值可能很有用。

我们的预热计算如下:

def warmup_learning_rate(step):
    completed_fraction = step / warmup_steps
    total_delta = target_warmup - initial_learning_rate
    return completed_fraction * total_delta

我们的衰减计算如下:

if warmup_target is None:
    initial_decay_lr = initial_learning_rate
else:
    initial_decay_lr = warmup_target

def decayed_learning_rate(step):
    step = min(step, decay_steps)
    cosine_decay = 0.5 * (1 + cos(pi * step / decay_steps))
    decayed = (1 - alpha) * cosine_decay + alpha
    return initial_decay_lr * decayed

不带预热的示例用法

decay_steps = 1000
initial_learning_rate = 0.1
lr_decayed_fn = keras.optimizers.schedules.CosineDecay(
    initial_learning_rate, decay_steps)

带预热的示例用法

decay_steps = 1000
initial_learning_rate = 0
warmup_steps = 1000
target_learning_rate = 0.1
lr_warmup_decayed_fn = keras.optimizers.schedules.CosineDecay(
    initial_learning_rate, decay_steps, warmup_target=target_learning_rate,
    warmup_steps=warmup_steps
)

你可以直接将此调度器作为学习率传递给 keras.optimizers.Optimizer。学习率调度器也可以使用 keras.optimizers.schedules.serializekeras.optimizers.schedules.deserialize 进行序列化和反序列化。

参数

  • initial_learning_rate: Python 浮点数。初始学习率。
  • decay_steps:一个 Python int。衰减的步数。
  • alpha:一个 Python float。衰减的最小学习率值,相对于 initial_learning_rate 的比例。
  • name:字符串。操作的可选名称。默认为 "CosineDecay"
  • warmup_target:一个 Python float。预热阶段的目标学习率。将强制转换为 initial_learning_rate 的数据类型。设置为 None 将跳过预热,并从 initial_learning_rate 开始衰减阶段。否则,调度器将从 initial_learning_rate 预热到 warmup_target
  • warmup_steps:一个 Python int。预热的步数。

返回

一个接受一个参数的可调用学习率调度,该参数为当前的优化器步数,并输出衰减后的学习率,一个与 initial_learning_rate 类型相同的标量张量。