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)。学习率调度将查看“实际”迭代值(优化器步骤)。