餘弦衰減

[原始碼]

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.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 整數。預熱的步數。

傳回

一個單參數可呼叫的學習率排程,它接受目前的優化器步驟,並輸出衰減的學習率,一個與 initial_learning_rate 類型相同的純量張量。