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: Stochastic Gradient Descent with Warm Restarts(带有 Warm Restarts 的随机梯度下降)。
关于学习率线性预热的想法,请参见 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.serialize
和 keras.optimizers.schedules.deserialize
进行序列化和反序列化。
参数
initial_learning_rate
的一部分。"CosineDecay"
。initial_learning_rate
数据类型。设置为 None
将跳过预热,并从 initial_learning_rate
开始衰减阶段。否则,调度器将从 initial_learning_rate
预热到 warmup_target
。返回
一个 1 参数可调用学习率调度器,它接受当前优化器步骤并输出衰减的学习率,一个与 initial_learning_rate
类型相同的标量张量。