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
值來計算學習率。您可以直接傳遞一個後端變數,在每個訓練步驟中遞增它。
此排程是一個單參數可呼叫物件,當傳遞目前優化器步驟時,它會產生預熱,然後產生衰減的學習率。這對於在不同優化器函數調用之間更改學習率值非常有用。
我們的預熱計算如下
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
。傳回
一個單參數可呼叫的學習率排程,它接受目前的優化器步驟,並輸出衰減的學習率,一個與 initial_learning_rate
類型相同的純量張量。