余弦衰减

[source]

CosineDecay class

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

A LearningRateSchedule 使用带有可选预热期的余弦衰减.

参见 Loshchilov & Hutter, ICLR2016, SGDR: Stochastic Gradient Descent with Warm Restarts.

关于我们学习率的线性预热的想法, 参见 Goyal et al..

当我们开始训练模型时,我们通常希望学习率有一个初始的增加,然后是衰减.如果 warmup_target 是一个整数,这个计划会在每个优化器步骤中将我们的学习率从 initial_learning_rate 线性增加到 warmup_target,持续时间为 warmup_steps.之后,它会应用一个余弦衰减函数,将我们的学习率从 warmup_target 衰减到 alpha,持续时间为 decay_steps.如果 warmup_target 是 None,我们将跳过预热,衰减将从 initial_learning_rate 开始到 alpha.它需要一个 step 值来计算学习率.你只需传递一个在后端变量,在每个训练步骤中递增.

该计划是一个接受当前优化器步骤并输出预热后衰减学习率的 1-arg 可调用对象.这在不同调用优化器函数时改变学习率值时非常有用.

我们的预热计算如下:

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 整数.衰减的步数. alpha: 一个 Python 浮点数.衰减的最小学习率值,作为 initial_learning_rate 的一部分. name: 字符串.操作的可选名称.默认为 "CosineDecay". warmup_target: 一个 Python 浮点数.预热阶段的目标学习率.将转换为 initial_learning_rate 的数据类型.设置为 None 将跳过预热,从 initial_learning_rate 开始衰减阶段.否则调度器将从 initial_learning_rate 预热到 warmup_target. warmup_steps: 一个 Python 整数.预热的步数.

返回: 一个 1-arg 可调用学习率计划,接受当前优化器步骤并输出衰减的学习率,一个与 initial_learning_rate 类型相同的标量张量.