Gibt es eine Standardtechnik zum Debuggen von MCMC-Programmen?

11

Das Debuggen von MCMC-Programmen ist bekanntermaßen schwierig. Die Schwierigkeit ergibt sich aus mehreren Problemen, von denen einige sind:

(a) Zyklische Natur des Algorithmus

Wir zeichnen iterativ Parameter, die von allen anderen Parametern abhängig sind. Wenn eine Implementierung nicht ordnungsgemäß funktioniert, ist es daher schwierig, den Fehler zu isolieren, da das Problem an einer beliebigen Stelle im iterativen Sampler auftreten kann.

(b) Die richtige Antwort ist nicht unbedingt bekannt.

Wir können nicht sagen, ob wir Konvergenz erreicht haben. Bis zu einem gewissen Grad kann dies durch Testen des Codes an simulierten Daten gemildert werden.

Angesichts der oben genannten Probleme habe ich mich gefragt, ob es eine Standardtechnik gibt, mit der MCMC-Programme debuggt werden können.

Bearbeiten

Ich wollte den Ansatz teilen, mit dem ich meine eigenen Programme debugge. Ich mache natürlich all die Dinge, die PeterR erwähnt hat. Abgesehen davon führe ich die folgenden Tests mit simulierten Daten durch:

  1. Starten Sie alle Parameter mit wahren Werten und prüfen Sie, ob der Sampler zu weit von den wahren Werten abweicht.

  2. Ich habe Flags für jeden Parameter in meinem iterativen Sampler, die bestimmen, ob ich diesen Parameter im iterativen Sampler zeichne. Wenn zum Beispiel ein Flag 'gen_param1' auf true gesetzt ist, ziehe ich 'param1' aus seiner vollständigen Bedingung im iterativen Sampler. Wenn dies auf false gesetzt ist, wird 'param1' auf seinen wahren Wert gesetzt.

Sobald ich den Sampler fertig geschrieben habe, teste ich das Programm nach folgendem Rezept:

  • Setzen Sie das Generierungsflag für einen Parameter auf true und alles andere auf false und bewerten Sie die Konvergenz in Bezug auf den wahren Wert.
  • Setzen Sie das Generierungsflag für einen anderen Parameter in Verbindung mit dem ersten und bewerten Sie erneut die Konvergenz.

Die obigen Schritte waren für mich unglaublich hilfreich.

kjetil b halvorsen
quelle

Antworten:

10

Standardprogrammierpraxis:

  • Führen Sie beim Debuggen die Simulation mit festen Zufallsquellen (dh demselben Startwert) aus, sodass alle Änderungen auf Codeänderungen und nicht auf unterschiedliche Zufallszahlen zurückzuführen sind.
  • Versuchen Sie Ihren Code an einem Modell (oder mehreren Modellen), bei dem die Antwort bekannt ist.
  • Nehmen Sie gute Programmiergewohnheiten an, damit Sie weniger Fehler einführen.
  • Denken Sie sehr lange über die Antworten nach, die Sie erhalten, ob sie sinnvoll sind usw.

Ich wünsche Ihnen viel Glück und viel Kaffee!

PeterR
quelle
3

Ich habe hier eine deprimierende und nicht sehr spezifische Anekdote zu erzählen. Ich habe einige Zeit als Mitarbeiter eines statistischen MT-Forschers verbracht. Wenn Sie ein wirklich großes, komplexes Modell sehen möchten, suchen Sie nicht weiter.

Er hat mich zu seiner eigenen Unterhaltung durch das NLP-Bootcamp geführt. Ich bin im Allgemeinen ein Programmierer, der nach dem Unit-Test und dem Debugger lebt und stirbt. Als junger Mensch bei Symbolics war ich vom Aphorismus beeindruckt: "Programmieren debuggt einen leeren Editorpuffer." (So ​​ähnlich wie das Trainieren eines Perzeptronmodells.)

Also fragte ich ihn: "Wie testest und debuggst du dieses Zeug?" Er antwortete: "Sie machen es gleich beim ersten Mal richtig. Sie überlegen es sich (in seinem Fall oft auf Papier) sehr sorgfältig und codieren es sehr sorgfältig. Denn wenn Sie es falsch verstehen, besteht die Möglichkeit, das Problem zu isolieren." sehr dünn."

bmargulies
quelle
Ich habe diese Anekdote schon einmal gehört (vielleicht auch von dir?). Es hat mich beeindruckt, und seit ich es zum ersten Mal gehört habe, ist es mehrfach wahr geworden (dh die Schwierigkeit, das Problem zu isolieren).
Redmoskito
3

Gute Tipps in der Antwort von PeterR; Ich habe keine weiteren Tipps für das eigentliche Debuggen, aber ich habe ein sehr nützliches Verfahren zum Testen gefunden, ob Ihr Code einen Fehler haben könnte. Es wird in diesem Artikel beschrieben:

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

Im Wesentlichen besteht die Idee darin, zwei Simulationen durchzuführen: Eine ist Ihre MCMC, um (vermutlich) auf die Parameter Ihres Modells zu schließen. Der zweite Simulator tastet einfach Parameter aus dem vorherigen ab. Sie generieren Daten aus den Parametern beider Simulatoren und berechnen eine Teststatistik, in der die gemeinsamen Verteilungen von Parametern und Daten verglichen werden. Wenn der MCMC-Code Parameter vom posterioren korrekt abtastet, hat die Teststatistik eine Verteilung von N (0,1). Code zur Berechnung der Teststatistik ist verfügbar.

FrankD
quelle
Ein verwandter Ansatz findet sich bei Cook et al. (2006; stat.columbia.edu/~gelman/research/published/… ). Ich habe den Ansatz von Cook et al. Zweimal verwendet und war von den Ergebnissen beeindruckt. Ich habe Gewekes Ansatz nicht verwendet, aber laut Cook et al. "Hat Gewekes Ansatz den Vorteil, dass nur eine Replikation durchgeführt werden muss ... Ein Nachteil ist, dass die zu testende Software geändert werden muss." Sie sagen auch, dass Gewekes Ansatz Prioritäten mit endlicher Varianz erfordert, während dies bei ihnen nicht der Fall ist.
Jmtroos