MCMC programlarında hata ayıklamak için standart bir teknik var mı?


11

MCMC programlarında hata ayıklamak çok zordur. Zorluk, bazıları şunlardır:

(a) Algoritmanın döngüsel yapısı

Parametreleri diğer tüm parametrelere bağlı olarak tekrarlı olarak çiziyoruz. Bu nedenle, bir uygulama düzgün çalışmıyorsa, sorunu yinelemeli örnekleyicinin herhangi bir yerinde olabileceğinden hatayı izole etmek zordur.

(b) Doğru cevap mutlaka bilinmemektedir.

Yakınsama sağlayıp sağlamadığımızı anlamanın hiçbir yolu yok. Bir dereceye kadar bu, simüle edilmiş veriler üzerinde kod test edilerek hafifletilebilir.

Yukarıdaki sorunlar ışığında, MCMC programlarında hata ayıklamak için kullanılabilecek standart bir teknik olup olmadığını merak ediyordum.

Düzenle

Kendi programımda hata ayıklamak için kullandığım yaklaşımı paylaşmak istedim. Elbette PeterR'ın bahsettiği her şeyi yapıyorum. Bunların dışında, simüle edilmiş verileri kullanarak aşağıdaki testleri yapıyorum:

  1. Tüm parametreleri gerçek değerlerden başlatın ve örnekleyicinin gerçek değerlerden çok farklı olup olmadığını görün.

  2. Yinelemeli örnekleyicimde bu parametreyi yinelemeli örnekleyicide çizip çizmediğimi belirleyen her parametre için bayraklar var. Örneğin, 'gen_param1' bayrağı true olarak ayarlanmışsa, yinelemeli örnekleyicideki tam koşulundan 'param1' çizerim. Bu false olarak ayarlanırsa, 'param1' gerçek değerine ayarlanır.

Örnekleyiciyi yazmayı bitirdikten sonra, aşağıdaki tarifi kullanarak programı test ederim:

  • Bir parametre için oluşturma bayrağını true değerine ve diğer her şeyi false değerine ayarlayın ve yakınsamayı gerçek değere göre değerlendirin.
  • Birincisi ile birlikte başka bir parametre için oluşturma bayrağını ayarlayın ve tekrar yakınsamayı değerlendirin.

Yukarıdaki adımlar bana çok yardımcı oldu.

Yanıtlar:


10

Standart programlama uygulaması:

  • Hata ayıklama sırasında simülasyonu sabit rasgele kaynaklarla (yani aynı tohum) çalıştırın, böylece herhangi bir değişiklik kod değişikliklerinden kaynaklanır ve farklı rasgele sayılardan kaynaklanmaz.
  • kodunuzu, cevabın bilindiği bir modelde (veya birkaç modelde) deneyin.
  • daha az hata getirebilmeniz için iyi programlama alışkanlıkları benimseyin.
  • aldığınız cevaplar, anlamlı olup olmadıkları vb. hakkında çok sıkı düşünün.

Size iyi şanslar ve bol kahve diliyorum!


3

Burada paylaşmak için iç karartıcı ve çok spesifik olmayan bir fıkra var. İstatistiksel bir MT araştırmacısının iş arkadaşı olarak biraz zaman geçirdim. Gerçekten büyük, karmaşık bir model görmek istiyorsanız, daha fazla kendinizi yormayın.

Beni kendi eğlencesi için NLP eğitim kampından geçiriyordu. Genel olarak, birim test ve hata ayıklayıcı tarafından yaşayan ve ölen programcıyım. Symbolics'te genç bir insan olarak, aforizma çarptım, 'programlama boş bir editör tamponunda hata ayıklıyor.' (Bir algılayıcı modeli eğitmeye benzer.)

Ben de ona 'bu şeyleri nasıl test edip hatalarını ayıkladınız' diye sordum. O, "İlk seferinde doğru anlıyorsunuz. Bunu (onun durumunda, genellikle kağıt üzerinde) çok dikkatli bir şekilde düşünüyorsunuz ve çok dikkatli bir şekilde kodluyorsunuz. Çünkü yanlış anladığınızda, sorunu tecrit etme şansı çok ince."


Bu fıkrayı daha önce duymuştum (belki sizden de?). Benim için eve geldi ve ilk duyduğundan beri, birçok kez gerçekleşti (yani sorunu izole etmenin zorluğu).
redmoskito

3

PeterR'ın cevabında iyi ipuçları; Gerçek hata ayıklama için başka ipucu yok, ancak kodunuzda bir hata olup olmadığını test etmek için çok yararlı bir işlem buldum. Bu makalede açıklanmıştır:

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

Temel olarak fikir iki simülasyona sahip olmaktır: Biri modelinizin parametrelerini (muhtemelen) çıkarmak için MCMC'nizdir. İkinci simülatör basitçe öncekinden parametreleri örnekler. Her iki simülatörün parametrelerinden veri üretir ve parametrelerin ve verilerin ortak dağılımlarını karşılaştıran bir test istatistiği hesaplar. MCMC kodu posteriordaki parametreleri doğru bir şekilde örnekliyorsa, test istatistiği N (0,1) dağılımına sahip olacaktır. Test istatistiğini hesaplamak için kod mevcuttur.


İlgili bir yaklaşım Cook ve ark. (2006; stat.columbia.edu/~gelman/research/published/… ). Cook vd.'nin yaklaşımını iki kez kullandım ve sonuçlardan çok etkilendim. Geweke'nin yaklaşımını kullanmadım, ancak Cook ve arkadaşlarına göre, "Geweke'nin yaklaşımı sadece tek bir çoğaltmanın gerçekleştirilmesi avantajına sahiptir ... Bir dezavantaj, test edilecek yazılımın değiştirilmesini gerektirmesidir." Ayrıca, Geweke'nin yaklaşımının sonlu varyansla öncelikler gerektirdiğini, oysa buna gerek olmadığını söylüyorlar.
jmtroos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.