Misalkan saya ingin menulis kelas pengoptimal khusus yang sesuai dengan tf.keras
API (menggunakan versi TensorFlow> = 2.0). Saya bingung tentang cara yang terdokumentasi untuk melakukan ini versus apa yang dilakukan dalam implementasi.
Dokumentasi untuk tf.keras.optimizers.Optimizer
negara ,
### 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)
Namun, tf.keras.optimizers.Optimizer
implementasi saat ini tidak mendefinisikan resource_apply_dense
metode, tetapi tidak menentukan _resource_apply_dense
metode rintisan yang tampak pribadi . Demikian pula, tidak ada resource_apply_sparse
atau create_slots
metode, tetapi ada _resource_apply_sparse
metode rintisan dan _create_slots
pemanggilan metode .
Dalam resmi tf.keras.optimizers.Optimizer
subclass (menggunakan tf.keras.optimizers.Adam
sebagai contoh), ada _resource_apply_dense
, _resource_apply_sparse
dan _create_slots
metode, dan tidak ada metode tersebut tanpa awalan garis bawah.
Ada metode yang serupa terkemuka-bawah di sedikit-kurang-resmi tf.keras.optimizers.Optimizer
subclass (misalnya, tfa.optimizers.MovingAverage
dari TensorFlow Addons: _resource_apply_dense
, _resource_apply_sparse
, _create_slots
).
Poin perancu lain bagi saya adalah bahwa beberapa pengoptimal TensorFlow Addons juga menimpa apply_gradients
metode (misalnya, tfa.optimizers.MovingAverage
), sedangkan tf.keras.optimizers
pengoptimal tidak.
Selain itu, saya melihat bahwa apply_gradients
metode tf.keras.optimizers.Optimizer
metode panggilan_create_slots
, tapi dasar tf.keras.optimizers.Optimizer
kelas tidak memiliki _create_slots
metode. Jadi, tampaknya _create_slots
metode harus didefinisikan dalam subkelas pengoptimal jika subkelas itu tidak menimpanya apply_gradients
.
Pertanyaan
Apa cara yang benar untuk subkelas a tf.keras.optimizers.Optimizer
? Secara khusus,
- Apakah
tf.keras.optimizers.Optimizer
dokumentasi yang tercantum di atas hanya bermaksud untuk menimpa versi terdepan-garis bawah dari metode yang mereka sebutkan (misalnya,_resource_apply_dense
bukanresource_apply_dense
)? Jika demikian, apakah ada jaminan API tentang metode yang tampak pribadi ini tidak mengubah perilaku mereka di versi TensorFlow yang akan datang? Apa saja tanda tangan dari metode ini? - Kapan satu menimpa
apply_gradients
selain_apply_resource_[dense|sparse]
metode?
Edit. Masalah yang terbuka pada GitHub: # 36449
sumber
get_config
), tetapi kemudian mereka belum muncul di dokumentasi publik ._resource_apply_dense
atau_resource_apply_sparse
, dan melihat penggunaannya dalam pengoptimal yang diterapkan. Meskipun mungkin tidak, saya pikir, API publik dengan jaminan stabilitas, saya akan mengatakan itu cukup aman untuk menggunakannya. Mereka hanya harus memberikan panduan yang lebih baik dalam aspek ini.Jawaban:
Saya telah menerapkan Keras AdamW di semua versi TF & Keras utama - Saya mengundang Anda untuk memeriksa optimizers_v2.py . Beberapa poin:
OptimizerV2
, yang sebenarnya adalah yang Anda tautkan; ini adalah kelas dasar terbaru dan terkini untuktf.keras
pengoptimalapply_gradients
(atau metode lain apa pun) hanya berlebihan jika default tidak memenuhi apa yang diperlukan untuk pengoptimal yang diberikan; dalam contoh yang ditautkan, itu hanya tambahan satu-liner ke aslinya_create_slots
metode harus didefinisikan dalam subkelas pengoptimal jika subkelas itu tidak menimpaapply_gradients
" - keduanya tidak terkait; ini kebetulan._resource_apply_dense
dan_resource_apply_sparse
?Penawaran akhir dengan lapisan jarang - misalnya
Embedding
- dan sebelumnya dengan yang lainnya; contoh ._create_slots()
?Saat mendefinisikan latih
tf.Variable
; contoh: momen urutan pertama dan kedua bobot (misalnya Adam). Itu menggunakanadd_slot()
._set_hyper()
?Cukup banyak, setiap kali tidak menggunakan
_create_slots()
; itu seperti mengatur atribut kelas, tetapi dengan langkah-langkah preprocessing tambahan untuk memastikan kebenaran dalam penggunaan. Jadi Pythonint, float
,tf.Tensor
,tf.Variable
, & lain-lain. (Seharusnya saya lebih sering menggunakannya di Keras AdamW).Catatan : sementara pengoptimalisasi tertaut saya berfungsi dengan benar dan hampir secepat aslinya, kode mengikuti praktik TensorFlow terbaik dan masih bisa lebih cepat; Saya tidak merekomendasikan ini sebagai "referensi ideal." Misalnya beberapa objek Python (misalnya
int
) harus tensor;eta_t
didefinisikan sebagaitf.Variable
, tetapi segera diganti sebagai metodetf.Tensor
in_apply
. Belum tentu masalah besar, hanya belum punya waktu untuk renovasi.sumber
apply_dense
. Untuk satu hal, jika Anda menimpanya, kode menyebutkan bahwa DistributionStrategy per-replika bisa "berbahaya"sumber