Keras 3 API 文件 / 最佳化器 / 損失縮放最佳化器

損失縮放最佳化器

[來源]

LossScaleOptimizer 類別

keras.optimizers.LossScaleOptimizer(
    inner_optimizer, initial_scale=32768.0, dynamic_growth_steps=2000, **kwargs
)

一個動態縮放損失以防止溢位的最佳化器。

損失縮放是一種在 float16 被使用時,防止中間梯度數值溢位的技術。為了防止溢位,損失會乘以一個稱為「損失縮放」的特定因子,這也會導致中間梯度被損失縮放所縮放。最終梯度會除以(或「取消縮放」)損失縮放,使其恢復到原始值。

LossScaleOptimizer 包裹另一個最佳化器,並對其應用動態損失縮放。這個損失縮放會隨著時間動態更新,如下所示:- 在任何訓練步驟中,如果遇到非有限梯度,則損失縮放會減半,並且訓練步驟會被跳過。- 如果自上次更新損失縮放以來,已經發生 dynamic_growth_steps 次,且沒有發生非有限梯度,則損失縮放會加倍。

參數

  • inner_optimizer:要包裹的 keras.optimizers.Optimizer 實例。
  • initial_scale:浮點數。初始損失縮放。此縮放將在訓練期間更新。建議將其設定為非常大的數字,因為太高的損失縮放下降速度遠快於太低的損失縮放上升速度。
  • dynamic_growth_steps:整數。向上更新縮放的頻率。在每次發生 dynamic_growth_steps 次有限梯度的步驟後,損失縮放會加倍。
  • name:字串。用於最佳化器建立的動量累加器權重的名稱。
  • weight_decay:浮點數。如果設定,則會套用權重衰減。
  • clipnorm:浮點數。如果設定,則會個別裁剪每個權重的梯度,使其範數不高於此值。
  • clipvalue:浮點數。如果設定,則會裁剪每個權重的梯度,使其不高於此值。
  • global_clipnorm:浮點數。如果設定,則會裁剪所有權重的梯度,使其全域範數不高於此值。
  • use_ema:布林值,預設為 False。如果為 True,則會套用指數移動平均 (EMA)。EMA 包括計算模型權重的指數移動平均(因為權重值在每個訓練批次後都會發生變化),並定期將權重覆寫為其移動平均值。
  • ema_momentum:浮點數,預設為 0.99。僅在 use_ema=True 時使用。這是計算模型權重 EMA 時使用的動量:new_average = ema_momentum * old_average + (1 - ema_momentum) * current_variable_value
  • ema_overwrite_frequency:整數或 None,預設為 None。僅在 use_ema=True 時使用。每當 ema_overwrite_frequency 次迭代步驟後,我們就會將模型變數覆寫為其移動平均值。如果為 None,則最佳化器不會在訓練過程中覆寫模型變數,您需要在訓練結束時透過呼叫 optimizer.finalize_variable_values() 來明確覆寫變數(這會就地更新模型變數)。當使用內建的 fit() 訓練迴圈時,這會在最後一個 epoch 後自動發生,您不需要執行任何操作。
  • loss_scale_factor:浮點數或 None。如果為浮點數,則在計算梯度之前,損失會乘以縮放因子,並且在更新變數之前,梯度會乘以縮放因子的倒數。對於在混合精度訓練期間防止溢位很有用。或者,keras.optimizers.LossScaleOptimizer 將會自動設定損失縮放因子。
  • gradient_accumulation_steps:整數或 None。如果為整數,則不會在每個步驟更新模型和最佳化器變數;而是每隔 gradient_accumulation_steps 步驟更新一次,並使用自上次更新以來梯度的平均值。這被稱為「梯度累積」。當您的批次大小非常小時,這很有用,以便減少每個更新步驟的梯度雜訊。EMA 頻率將查看「累積」的迭代值(最佳化器步驟 // gradient_accumulation_steps)。學習率排程將查看「實際」的迭代值(最佳化器步驟)。