Предположим, я хочу написать собственный класс оптимизатора, соответствующий tf.keras
API (используя версию TensorFlow> = 2.0). Я запутался в документированном способе сделать это по сравнению с тем, что сделано в реализациях.
Документация для tf.keras.optimizers.Optimizer
штатов ,
### 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
подклассах (например, tfa.optimizers.MovingAverage
от TensorFlow Addons: _resource_apply_dense
, _resource_apply_sparse
, _create_slots
).
Еще один неприятный момент для меня заключается в том, что некоторые оптимизаторы аддонов TensorFlow также переопределяют apply_gradients
метод (например, tfa.optimizers.MovingAverage
), а tf.keras.optimizers
оптимизаторы - нет.
Более того, я заметил, что apply_gradients
метод вызываетtf.keras.optimizers.Optimizer
метод , но базовый класс не имеет метода. Таким образом, кажется, что метод должен быть определен в подклассе оптимизатора, если этот подкласс не переопределяет ._create_slots
tf.keras.optimizers.Optimizer
_create_slots
_create_slots
apply_gradients
Вопросов
Как правильно подкласс tf.keras.optimizers.Optimizer
? В частности,
- Означает ли
tf.keras.optimizers.Optimizer
документация, перечисленная вверху, просто переопределение версий методов, которые они упоминают (например,_resource_apply_dense
вместоresource_apply_dense
)? Если да, есть ли какие-либо гарантии API относительно того, что эти приватно выглядящие методы не изменят свое поведение в будущих версиях TensorFlow? Каковы подписи этих методов? - Когда можно переопределить
apply_gradients
в дополнение к_apply_resource_[dense|sparse]
методам?
Редактировать. Открытый вопрос на GitHub: # 36449
источник
get_config
), но тогда они еще не должны появляться в общедоступной документации ._resource_apply_dense
или_resource_apply_sparse
, и увидеть их использование в реализованных оптимизаторах. Я думаю, что публичного API с гарантиями стабильности может и не быть, я бы сказал, что использовать его довольно безопасно. Они просто должны дать лучшее руководство в этом аспекте.Ответы:
Я реализовал Keras AdamW во всех основных версиях TF & Keras - я приглашаю вас ознакомиться с optimizer_v2.py . Несколько моментов:
OptimizerV2
, что на самом деле то, что вы связали; это самый последний и актуальный базовый класс дляtf.keras
оптимизаторовapply_gradients
(или любой другой метод) переопределяется, только если значение по умолчанию не выполняет то, что необходимо для данного оптимизатора; в вашем связанном примере это просто однострочное дополнение к оригиналу_create_slots
метод должен быть определен в подклассе оптимизатора, если этот подкласс не переопределяетapply_gradients
» - эти два не связаны; это случайно._resource_apply_dense
и_resource_apply_sparse
?Последние имеют дело с разреженными слоями - например
Embedding
- и бывшими со всем остальным; пример ._create_slots()
?При определении обучаемых
tf.Variable
с; пример: весовые коэффициенты первого и второго порядка (например, Адам). Это используетadd_slot()
._set_hyper()
?В значительной степени, когда не используется
_create_slots()
; это похоже на настройку атрибутов класса, но с дополнительными шагами предварительной обработки, чтобы гарантировать правильность использования. Так Pythonint, float
,tf.Tensor
,tf.Variable
, и другие. (Я должен был использовать это больше в Keras AdamW).Примечание : хотя мои связанные оптимизаторы работают правильно и работают примерно так же быстро, как и оригиналы, код соответствует лучшим методам TensorFlow и все еще может быть быстрее; Я не рекомендую это как "идеальную ссылку". Например, некоторые объекты Python (например
int
) должны быть тензорами;eta_t
определяется как atf.Variable
, но сразу же переопределяется какtf.Tensor
in в_apply
методах. Не обязательно большое дело, просто не было времени на ремонт.источник
apply_dense
. Во-первых, если вы переопределите это, в коде упоминается, что для каждой реплики DistributionStrategy может быть «опасным».источник