Apakah ada teknik standar untuk men-debug program MCMC?


11

Program debugging MCMC terkenal sulit. Kesulitan muncul karena beberapa masalah beberapa di antaranya adalah:

(A) Sifat siklik dari algoritma

Kami secara iteratif menggambar parameter yang tergantung pada semua parameter lainnya. Dengan demikian, jika suatu implementasi tidak berfungsi dengan benar maka sulit untuk mengisolasi bug karena masalahnya dapat berada di mana saja dalam sampler berulang.

(B) Jawaban yang benar belum tentu diketahui.

Kami tidak memiliki cara untuk mengetahui apakah kami telah mencapai konvergensi. Untuk beberapa hal ini dapat dikurangi dengan menguji kode pada data yang disimulasikan.

Mengingat masalah di atas, saya bertanya-tanya apakah ada teknik standar yang dapat digunakan untuk men-debug program MCMC.

Edit

Saya ingin berbagi pendekatan yang saya gunakan untuk men-debug program saya sendiri. Saya, tentu saja, melakukan semua hal yang disebutkan PeterR. Selain itu, saya melakukan tes berikut menggunakan data simulasi:

  1. Mulai semua parameter dari nilai sebenarnya dan lihat apakah sampler menyimpang terlalu jauh dari nilai sebenarnya.

  2. Saya memiliki tanda untuk setiap parameter dalam sampler berulang saya yang menentukan apakah saya menggambar parameter dalam sampler berulang. Misalnya, jika flag 'gen_param1' disetel ke true maka saya menarik 'param1' dari kondisional penuh dalam sampler berulang. Jika ini disetel ke false maka 'param1' disetel ke nilai sebenarnya.

Setelah saya selesai menulis sampler, saya menguji program menggunakan resep berikut:

  • Tetapkan flag generate untuk satu parameter menjadi true dan yang lainnya false dan nilai konvergensi sehubungan dengan nilai sebenarnya.
  • Atur flag generate untuk parameter lain bersamaan dengan yang pertama dan nilai lagi konvergensi.

Langkah-langkah di atas sangat membantu saya.

Jawaban:


10

Praktik pemrograman standar:

  • ketika debugging jalankan simulasi dengan sumber acak tetap (yaitu seed yang sama) sehingga setiap perubahan disebabkan oleh perubahan kode dan bukan angka acak yang berbeda.
  • coba kode Anda pada model (atau beberapa model) di mana jawabannya diketahui.
  • mengadopsi kebiasaan pemrograman yang baik sehingga Anda memperkenalkan lebih sedikit bug.
  • berpikir sangat keras & panjang tentang jawaban yang Anda dapatkan, apakah itu masuk akal, dll.

Semoga beruntung, dan banyak kopi!


3

Saya memiliki anekdot yang menyedihkan dan tidak terlalu spesifik untuk dibagikan di sini. Saya menghabiskan beberapa waktu sebagai rekan kerja dari seorang peneliti MT statistik. Jika Anda ingin melihat model yang benar-benar besar, kompleks, jangan melihat lebih jauh.

Dia menempatkan saya melalui bootcamp NLP untuk hiburannya sendiri. Saya, secara umum, jenis programmer yang hidup dan mati oleh unit test dan debugger. Sebagai orang muda di Symbolics, saya dikejutkan oleh pepatah, 'pemrograman sedang men-debug buffer editor kosong.' (Semacam seperti melatih model perceptron.)

Jadi, saya bertanya kepadanya, 'bagaimana Anda menguji dan men-debug hal-hal ini.' Dia menjawab, "Anda melakukannya dengan benar pertama kali. Anda memikirkannya dengan cermat (dalam kasusnya, sering di atas kertas) dengan sangat hati-hati, dan Anda mengkodekannya dengan sangat hati-hati. Karena ketika Anda melakukan kesalahan, kemungkinan untuk mengisolasi masalahnya adalah sangat ramping. "


Saya pernah mendengar anekdot ini sebelumnya (mungkin juga dari Anda?). Itu menghantam rumah bagi saya, dan sejak pertama kali mendengarnya, itu menjadi kenyataan pada beberapa kesempatan (yaitu kesulitan mengisolasi masalah).
redmoskito

3

Kiat bagus dalam jawaban PeterR; Saya tidak memiliki tips lebih lanjut untuk debugging yang sebenarnya, tetapi saya menemukan proses yang sangat berguna untuk menguji apakah kode Anda memiliki bug. Dijelaskan dalam tulisan ini:

http://pubs.amstat.org/doi/abs/10.1198/016214504000001132

Intinya idenya adalah untuk memiliki dua simulasi: Satu menjadi MCMC Anda untuk menyimpulkan (mungkin) parameter model Anda. Simulator kedua hanya sampel parameter dari sebelumnya. Mereka menghasilkan data dari parameter kedua simulator, dan menghitung statistik uji yang membandingkan distribusi gabungan dari parameter dan data. Jika kode MCMC dengan benar sampel parameter dari posterior, maka statistik uji akan memiliki distribusi N (0,1). Kode untuk menghitung statistik tes tersedia.


Pendekatan terkait dapat ditemukan di Cook et al. (2006; stat.columbia.edu/~gelman/research/published/… ). Saya telah menggunakan pendekatan Cook et al. Pada dua kesempatan, dan saya terkesan dengan hasilnya. Saya belum pernah menggunakan pendekatan Geweke, tetapi menurut Cook et al., "Pendekatan Geweke memiliki keuntungan bahwa hanya satu replikasi yang perlu dilakukan ... Kerugiannya adalah diperlukan perubahan perangkat lunak yang akan diuji." Mereka juga mengatakan pendekatan Geweke membutuhkan prior dengan varian terbatas, sedangkan mereka tidak.
jmtroos
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.