Keras 3 API文档 / 优化器 / 损失缩放优化器

损失缩放优化器

[源代码]

LossScaleOptimizer

keras.optimizers.LossScaleOptimizer(
    inner_optimizer, initial_scale=32768.0, dynamic_growth_steps=2000, name=None, **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 频率将查看“累积”的迭代次数(optimizer steps // gradient_accumulation_steps)。学习率调度器将查看“实际”的迭代次数(optimizer steps)。