### Write a customized optimizer.
If you intend to create your own optimization algorithm, simply inherit from
this class and override the following methods:
- resource_apply_dense (update variable given gradient tensor is dense)
- resource_apply_sparse (update variable given gradient tensor is sparse)
- create_slots (if your optimizer algorithm requires additional variables)
然而,当前的tf.keras.optimizers.Optimizer
实现并没有定义resource_apply_dense
方法,但它确实定义了一个看起来像私有的_resource_apply_dense
方法存根。同样,也没有resource_apply_sparse
或create_slots
方法,但有一个_resource_apply_sparse
方法存根和一个_create_slots
方法调用。
在官方的tf.keras.optimizers.Optimizer
子类中(以tf.keras.optimizers.Adam
为例),有_resource_apply_dense
、_resource_apply_sparse
和_create_slots
方法,而没有不带前导下划线的这些方法。
在稍微不太正式的tf.keras.optimizers.Optimizer
子类中有类似的以下划线开头的方法 (例如,从TensorFlow Addons中的tfa.optimizers.MovingAverage
:_resource_apply_dense
, _resource_apply_sparse
, _create_slots
)。
对我来说另一个混淆的点是部分TensorFlow Addons优化器也重载了apply_gradients
方法(例如tfa.optimizers.MovingAverage
),而tf.keras.optimizers
优化器则没有。
tf.keras.optimizers.Optimizer
的apply_gradients
方法调用_create_slots
,但基类tf.keras.optimizers.Optimizer
没有_create_slots
方法。
因此,如果子类没有覆盖apply_gradients
,则似乎必须在优化器子类中定义_create_slots
方法。
问题
如何正确地对tf.keras.optimizers.Optimizer
进行子类化?具体而言,
tf.keras.optimizers.Optimizer
文档中所列举的是否只是指覆盖提到的方法(例如,使用_resource_apply_dense
代替resource_apply_dense
)?如果是这样,那么这些看起来像私有方法的API保证不会在未来版本的TensorFlow中更改其行为吗?这些方法的签名是什么?- 除了使用
_apply_resource_[dense|sparse]
方法之外,何时需要覆盖apply_gradients
?
编辑。 在 GitHub 上打开了问题:#36449
get_config
),但是它们不应该出现在公共文档中。 - jdehesa_resource_apply_dense
或_resource_apply_sparse
的声明,并查看它们在实现的优化器中的用法。虽然可能不是公共API且稳定性有保证,但我认为它们是相当安全使用的。它们只应该在这方面提供更好的指导。 - jdehesa