Mengenai diferensiasi otomatis, apakah source-code-transformation (STC) lebih efisien daripada operator-overloading (OO)?

12

Kami sedang mengerjakan model Bayesian untuk proses ruang-waktu, dan menggunakan No-U-Turn sampler (NUTS) yang membutuhkan model untuk probabilitas log dan gradiennya sehubungan dengan parameter model. Lebih ringkasnya, kami memiliki fungsi probabilitas log yang cukup rumit , yang melibatkan distribusi statistik, produk kronecker, eksponensial, rasio, pernyataan if-else, dll, dan perlu menyediakannya dan bergantung pada NUTS. Beberapa paket ( Stan dan Julia's MCMC ) menggunakan operator-overloading (sepengetahuan saya) untuk mendapatkan gradien secara otomatis.f:RnR

Jika kita dapat membuat fungsi gradien kita sendiri, mungkin menggunakan alat auto-diff sumber-kode-transformasi, akankah kita mendapatkan kinerja yang lebih baik, atau apakah OO sama baiknya atau lebih baik?

Matthew Emmett
sumber

Jawaban:

9

Transformasi sumber-ke-sumber dianggap sebagai standar emas dalam hal kinerja. Pendekatan OO tampaknya hampir sama baiknya, karena ada lebih banyak paket OO di luar sana, dan kinerja tidak disebutkan sebagai kelemahan yang signifikan. Jika Anda menemukan pustaka OO yang Anda sukai untuk bahasa tempat Anda bekerja, saya akan menggunakannya terlebih dahulu, dan kemudian mencari tahu nanti jika Anda benar-benar membutuhkan transformasi sumber-ke-sumber, dan jika alat seperti itu memenuhi kebutuhan Anda ada. Biaya tipikal dari turunan yang dihasilkan oleh diferensiasi otomatis kira-kira tiga sampai lima kali lipat dari evaluasi fungsi, untuk meletakkan segala sesuatu dalam konteks.

Ada lebih banyak paket OO di luar sana karena lebih mudah untuk mengimplementasikan alat diferensiasi otomatis menggunakan overloading operator daripada menggunakan terjemahan sumber ke sumber. Menerapkan penerjemah sumber-ke-sumber sama dengan menulis kompiler: kode sumber harus diuraikan dan diberi token, kemudian aturan transformasi harus diterapkan ke pohon ekspresi yang dihasilkan. Buku Andreas Griewank, Mengevaluasi Derivatif: Prinsip dan Teknik Diferensiasi Algoritmik, Edisi Kedua, menjelaskan secara lebih terperinci tentang pengorbanan.

Geoff Oxberry
sumber
Terima kasih Geoff, ini sangat membantu, terutama perkiraan Anda tentang biaya tipikal.
Matthew Emmett
1

Untuk perhitungan gradien, Anda menggunakan mode sebaliknya dari AD. Dalam kedua kasus ini diperlukan untuk membangun stack operan, versi OO juga perlu membangun stack operasi, yang harus ditafsirkan dalam traversal terbalik kode. Source transformed code menuliskan operasi urutan terbalik sebagai kode sumber tambahan yang dikompilasi. Overhead untuk memiliki juru operasi dalam kode dapat menjadi signifikan. Ada perbandingan kode Tapenade yang dihasilkan dan Adol-C yang mendukung Tapenade.

Lutz Lehmann
sumber