CosineDecay 类tf_keras.optimizers.schedules.CosineDecay(
initial_learning_rate,
decay_steps,
alpha=0.0,
name=None,
warmup_target=None,
warmup_steps=0,
)
一个具有可选预热的余弦衰减的学习率衰减器。
参见 Loshchilov & Hutter, ICLR2016, SGDR: 带有热重启的随机梯度下降。
关于学习率线性预热的思路,请参见 Goyal 等人。
当我们开始训练模型时,我们通常希望在学习率开始衰减之前先有一个初始的增加。如果 warmup_target 是一个整数,那么该衰减器会在 warmup_steps 的持续时间内,将学习率从 initial_learning_rate 线性地增加到 warmup_target。之后,它会应用一个余弦衰减函数,将学习率从 warmup_target 衰减到 alpha,持续时间为 decay_steps。如果 warmup_target 为 None,则跳过预热,衰减会将学习率从 initial_learning_rate 衰减到 alpha x initial_learning_rate。它需要一个 step 值来计算学习率。你可以直接传递一个你在每个训练步骤中递增的 TensorFlow 变量。
该衰减器是一个接受一个参数的可调用对象,在传入当前优化器步数时,它会产生一个预热然后衰减的学习率。这对于在优化器函数不同调用之间更改学习率的值非常有用。
我们的预热计算方式如下:
def warmup_learning_rate(step):
completed_fraction = step / warmup_steps
total_delta = target_warmup - initial_learning_rate
return completed_fraction * total_delta + initial_learning_rate
我们的衰减计算方式如下:
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 = tf.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 = tf.keras.optimizers.schedules.CosineDecay(
initial_learning_rate, decay_steps, warmup_target=target_learning_rate,
warmup_steps=warmup_steps
)
您可以将此调度器直接作为学习率传递给tf.keras.optimizers.Optimizer。学习率调度器也可以使用tf.keras.optimizers.schedules.serialize和tf.keras.optimizers.schedules.deserialize进行序列化和反序列化。
返回
一个接受当前优化器步并输出衰减的学习速率(与 initial_learning_rate 类型相同的标量 Tensor)的 1 参数可调用学习速率计划。