มีเทคนิคมาตรฐานในการดีบักโปรแกรม MCMC หรือไม่


11

การดีบักโปรแกรม MCMC นั้นเป็นเรื่องยาก ความยากลำบากเกิดขึ้นเนื่องจากหลายประเด็นซึ่งบางประเด็นคือ:

(a) ธรรมชาติของอัลกอริธึม

เรามักจะวาดพารามิเตอร์ตามเงื่อนไขในพารามิเตอร์อื่น ๆ ทั้งหมด ดังนั้นหากการนำไปใช้งานไม่ทำงานอย่างถูกต้องจะเป็นการยากที่จะแยกบั๊กเนื่องจากปัญหาสามารถอยู่ที่ใดก็ได้ในตัวอย่างซ้ำ

(b) ไม่จำเป็นต้องรู้คำตอบที่ถูกต้อง

เราไม่มีทางที่จะบอกได้ว่าเราประสบความสำเร็จในการบรรจบกันหรือไม่ ในระดับหนึ่งสิ่งนี้สามารถลดลงได้โดยการทดสอบรหัสเกี่ยวกับข้อมูลจำลอง

จากประเด็นข้างต้นฉันสงสัยว่ามีเทคนิคมาตรฐานที่สามารถใช้ในการดีบักโปรแกรม MCMC หรือไม่

แก้ไข

ฉันต้องการแบ่งปันวิธีการที่ฉันใช้เพื่อดีบักโปรแกรมของฉันเอง แน่นอนฉันทำทุกสิ่งที่ PeterR พูดถึง นอกเหนือจากนั้นฉันทำการทดสอบต่อไปนี้โดยใช้ข้อมูลจำลอง:

  1. เริ่มต้นพารามิเตอร์ทั้งหมดจากค่าจริงและดูว่าตัวอย่างเก็บค่าเบี่ยงเบนจากค่าจริงมากเกินไปหรือไม่

  2. ฉันมีค่าสถานะสำหรับแต่ละพารามิเตอร์ในตัวอย่างซ้ำของฉันที่กำหนดว่าฉันกำลังวาดพารามิเตอร์นั้นในตัวอย่างซ้ำ ตัวอย่างเช่นหากตั้งค่าสถานะ 'gen_param1' เป็นจริงจากนั้นฉันวาด 'param1' จากเงื่อนไขแบบเต็มในตัวอย่างซ้ำ หากสิ่งนี้ถูกตั้งค่าเป็นเท็จ 'param1' จะถูกตั้งค่าเป็นค่าจริง

เมื่อฉันเขียนตัวอย่างเสร็จฉันทดสอบโปรแกรมโดยใช้สูตรต่อไปนี้:

  • ตั้งค่าสถานะการสร้างสำหรับหนึ่งพารามิเตอร์เป็นจริงและทุกอย่างอื่นเป็นเท็จและประเมินการบรรจบกันตามมูลค่าที่แท้จริง
  • ตั้งธงสร้างสำหรับพารามิเตอร์อื่นร่วมกับคนแรกและประเมินการบรรจบกันอีกครั้ง

ขั้นตอนข้างต้นเป็นประโยชน์กับฉันอย่างไม่น่าเชื่อ

คำตอบ:


10

ฝึกเขียนโปรแกรมมาตรฐาน:

  • เมื่อทำการดีบั๊กทำการจำลองด้วยแหล่งที่มาคงที่ของการสุ่ม (เช่นเมล็ดเดียวกัน) เพื่อให้การเปลี่ยนแปลงใด ๆ เกิดจากการเปลี่ยนแปลงรหัสและไม่สุ่มตัวเลขที่แตกต่างกัน
  • ลองใช้รหัสของคุณกับรุ่น (หรือหลายรุ่น) ซึ่งเป็นที่รู้จักคำตอบ
  • นำนิสัยการเขียนโปรแกรมที่ดีมาใช้
  • คิดหนักและยาวเกี่ยวกับคำตอบที่คุณได้รับไม่ว่าจะเป็นเหตุผลหรือไม่ก็ตาม

ฉันขอให้คุณโชคดีและกาแฟมากมาย!


3

ฉันมีเรื่องเล็ก ๆ น้อย ๆ ที่น่าหดหู่และไม่เฉพาะเจาะจงที่จะแบ่งปันที่นี่ ฉันใช้เวลาในฐานะเพื่อนร่วมงานของนักวิจัยทางสถิติ ถ้าคุณต้องการเห็นแบบจำลองขนาดใหญ่ที่ซับซ้อนไม่ต้องมองหาที่อื่น

เขาให้ฉันผ่าน NLP bootcamp เพื่อความสนุกของเขาเอง โดยทั่วไปฉันเป็นประเภทของโปรแกรมเมอร์ที่มีชีวิตอยู่และตายโดยการทดสอบหน่วยและดีบัก ในฐานะที่เป็นคนหนุ่มสาวที่ Symbolics ฉันรู้สึกติดกับคำพังเพย 'การเขียนโปรแกรมกำลังดีบั๊กบัฟเฟอร์ตัวแก้ไขที่ว่างเปล่า' (เรียงลำดับของการฝึกอบรมแบบ perceptron เหมือน)

ดังนั้นฉันจึงถามเขาว่า 'คุณจะทดสอบและแก้ไขข้อบกพร่องนี้ได้อย่างไร' เขาตอบว่า "คุณทำให้ถูกต้องในครั้งแรกคุณคิดว่าผ่าน (ในกรณีของเขามักจะเป็นกระดาษ) อย่างระมัดระวังและคุณรหัสมันอย่างระมัดระวังเพราะเมื่อคุณได้รับมันผิดโอกาสในการแยกปัญหาคือ ผอมเพรียวมาก "


ฉันเคยได้ยินเรื่องเล็ก ๆ น้อยนี้มาก่อน (อาจจะจากคุณด้วย) มันกระทบบ้านของฉันและตั้งแต่ครั้งแรกที่ได้ยินมันเป็นจริงขึ้นมาหลายครั้ง (เช่นความยากลำบากในการแยกปัญหา)
redmoskito

3

เคล็ดลับดี ๆ ในคำตอบของ PeterR; ฉันไม่มีคำแนะนำเพิ่มเติมสำหรับการดีบักจริง แต่ฉันพบว่ามีประโยชน์มากสำหรับการทดสอบว่ารหัสของคุณอาจมีข้อบกพร่องหรือไม่ มันอธิบายไว้ในบทความนี้:

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

แนวคิดหลักคือต้องมีการจำลองสองแบบ: หนึ่งในนั้นคือ MCMC ของคุณสำหรับการอนุมาน (สมมุติ) พารามิเตอร์ของโมเดลของคุณ ตัวจำลองที่สองเพียงแค่สุ่มตัวอย่างพารามิเตอร์จากก่อนหน้า พวกเขาสร้างข้อมูลจากพารามิเตอร์ของเครื่องจำลองทั้งสองและคำนวณสถิติการทดสอบเปรียบเทียบการแจกแจงร่วมของพารามิเตอร์และข้อมูล หากรหัส MCMC ถูกต้องตัวอย่างพารามิเตอร์จากด้านหลังสถิติการทดสอบจะมีการแจกแจง N (0,1) มีรหัสสำหรับการคำนวณสถิติการทดสอบ


วิธีการที่เกี่ยวข้องสามารถพบได้ใน Cook และคณะ (2006; stat.columbia.edu/~gelman/research/published/… ) ฉันใช้วิธีของ Cook และคณะในสองครั้งและฉันก็ประทับใจกับผลลัพธ์ ฉันไม่ได้ใช้วิธีการของ Geweke แต่อ้างอิงจาก Cook et al. "วิธีการของ Geweke มีข้อได้เปรียบที่ต้องทำซ้ำเพียงครั้งเดียวเท่านั้น ... ข้อเสียคือต้องเปลี่ยนซอฟต์แวร์เพื่อทดสอบ" พวกเขายังบอกว่าวิธีการของ Geweke นั้นต้องใช้นักบวชที่มีความแปรปรวน จำกัด แต่ทว่าไม่
jmtroos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.