tf.Keras 学习率计划——传递给优化器或回调?

tf.Keras learning rate schedules—pass to optimizer or callbacks?

我只是想为我的第一个 CNN 设置一个学习率时间表,我发现有多种方法可以这样做:

  1. One can include the schedule in callbacks 使用 tf.keras.callbacks.LearningRateScheduler()
  2. One can pass it to an optimizer 使用 tf.keras.optimizers.schedules.LearningRateSchedule()

现在我想知道是否有任何差异,如果有,它们是什么?如果没有区别,那么为什么存在这些替代方案呢?是否有历史原因(应该首选哪种方法)?

有人可以详细说明吗?

tf.keras.callbacks.LearningRateScheduler()tf.keras.optimizers.schedules.LearningRateSchedule() 都提供相同的功能,即在训练模型时实现学习率衰减。

一个明显的区别可能是 tf.keras.callbacks.LearningRateScheduler 在其构造函数中接受一个函数,如文档中所述,

tf.keras.callbacks.LearningRateScheduler(schedule, verbose=0)

schedule: a function that takes an epoch index (integer, indexed from 0) and current learning rate (float) as inputs and returns a new learning rate as output (float).

schedule 函数将 return 给定当前纪元索引的学习率。要实现各种类型的 LR 衰减,如指数衰减、多项式衰减等,您需要自己在这个 schedule 方法中编写它们。

另一方面,tf.keras.optimizers.schedules.LearningRateSchedule()是一个高级class。 tf.keras.optimizers.schedules.* 中包含的其他类型的衰变,如 PolynomialDecayInverseTimeDecay 继承此 class。因此,该模块提供了 ML 中常用的内置 LR 衰减方法。此外,要实现自定义 LR 衰减,您的 class 需要继承 tf.keras.optimizers.schedules.LearningRateSchedule() 并覆盖 __call____init__ 等方法,如文档中所述,

To implement your own schedule object, you should implement the call method, which takes a step argument (scalar integer tensor, the current training step count).

结论:

  • 如果您想使用一些内置的 LR 衰减,请使用 tf.keras.optimizers.schedules.* 模块,即该模块中提供的 LR 衰减。

  • 如果您需要一个简单的自定义 LR 衰减,它只需要纪元索引作为参数,请使用 tf.keras.callbacks.LearningRateScheduler.

  • 如果您的自定义 LR Decay 需要比纪元索引更多的参数,请创建一个新的 class 并继承 tf.keras.optimizers.schedules.LearningRateSchedule.