- แนะนำแนวคิดของชนิดข้อมูล
Uncertain<T> ซึ่งเป็น abstraction แบบใหม่สำหรับจัดการ ความไม่แน่นอน ในระดับโค้ด
- ชนิดข้อมูลนี้นำแนวทาง probabilistic programming มาใช้ เพื่อจำลองความเชื่อมั่นหรือความเป็นไปได้ของค่า แทนตรรกะบูลีนแบบดั้งเดิม
- รองรับการจัดการ ข้อมูลจริงที่มีสัญญาณรบกวนสูง เช่น GPS และข้อมูลจากเซ็นเซอร์ ด้วยการแทนเป็นการแจกแจงความน่าจะเป็นทางคณิตศาสตร์
- รองรับการสร้างสมดุลระหว่าง ประสิทธิภาพการคำนวณกับความน่าเชื่อถือของผลลัพธ์ ด้วยเทคนิคการสุ่มตัวอย่าง เช่น SPRT และ Monte Carlo
- สามารถ ผสานเข้ากับโค้ดเดิมได้แบบค่อยเป็นค่อยไป จึงเหมาะกับการนำไปใช้จริง
การทำให้ความไม่แน่นอนกลายเป็นโค้ด: ช่องว่างระหว่างความมั่นใจกับข้อมูลจริง
- กล่าวถึงปรากฏการณ์ที่หลายคน พึ่งพาความมั่นใจยืนยันมากเกินไป
- ชี้ให้เห็นว่าเมื่อมีประสบการณ์พัฒนาซอฟต์แวร์มากขึ้น ก็มักจะพูดว่า “ขึ้นอยู่กับสถานการณ์” บ่อยขึ้น
- แต่ในโค้ดก็ยังคงทำซ้ำรูปแบบที่พึ่งพาเพียงการตัดสินแบบจริง/เท็จ
- วิจารณ์แนวทางที่แม้จะต้องรับมือกับ ข้อมูลที่ไม่แน่นอน เช่น GPS แต่ก็ยังใช้เพียงค่าบูลีน
- โมเดลการเขียนโปรแกรมมักลดทอน ‘ความไม่แน่นอน’ ของโลกจริงให้กลายเป็นสองค่ารวดเร็วเกินไป จนซ่อนความซับซ้อนไว้
การเลือก abstraction ที่ถูกต้อง
- ในปี 2014 University of Washington และ Microsoft Research ได้เสนอแนวคิดที่ สะท้อนความไม่แน่นอนเข้าไปใน type system โดยตรง
- งานวิจัย "Uncertain<T>: A First-Order Type for Uncertain Data" แสดงให้เห็นว่าแนวทาง probabilistic programming ใช้งานได้จริง
- มีการพอร์ตแนวคิดนี้เป็น Swift และเผยแพร่โค้ดไว้ใน GitHub repository
- เมื่อใช้
Uncertain<T> ผลของการเปรียบเทียบก็จะแสดงเป็นความน่าจะเป็นสัมพัทธ์ และคืนค่าเป็น Uncertain<Bool> แทนที่จะเป็นจริง/เท็จ
- ความคลาดเคลื่อนของตำแหน่ง GPS ถูกจำลองให้สอดคล้องกับคุณลักษณะของข้อมูลจริง เช่น การแจกแจงแบบ Rayleigh
การทำงานจริงของการดำเนินการกับความไม่แน่นอนที่หลากหลาย
- รองรับโอเปอเรเตอร์และโมเดลการแจกแจงความน่าจะเป็นหลายแบบ พร้อม สร้างกราฟการคำนวณและสุ่มตัวอย่างเมื่อจำเป็นเท่านั้น
- ใช้ SPRT(Sequential Probability Ratio Testing) เพื่อปรับจำนวนตัวอย่างอย่างมีประสิทธิภาพ
- ในโค้ดตัวอย่างมีการอธิบายความแตกต่างของจำนวนตัวอย่างที่ต้องใช้ ระหว่างการเปรียบเทียบแบบง่ายกับแบบซับซ้อน
- abstraction นี้ช่วยให้ ไม่มองข้ามความไม่แน่นอน แต่ใช้มันอย่างเป็นธรรมชาติในกระบวนการคำนวณ จนทำให้สร้างโค้ดที่ ‘ฉลาดกว่า’ ได้
การประยุกต์ใช้แนวทาง Monte Carlo
- นำ Monte Carlo sampling มาใช้เพื่อวิเคราะห์การแจกแจงความน่าจะเป็นและคำนวณค่าคาดหมาย
- สามารถจำลองผลลัพธ์ของสล็อตแมชชีนซ้ำ ๆ เพื่อ หาค่าคาดหมายได้อย่างง่ายดาย
- สร้างผลลัพธ์ที่สมจริงได้แม้ไม่ต้องคำนวณเชิงวิเคราะห์ที่ซับซ้อน เพียงอาศัยการสุ่มซ้ำด้วยคอมพิวเตอร์
การสร้างแบบจำลองการแจกแจงความน่าจะเป็นที่หลากหลาย
Uncertain<T> มี ตัวสร้างการแจกแจงความน่าจะเป็น หลายแบบในตัว ทำให้สามารถจำลองข้อมูลโลกจริงอย่างละเอียด เช่น สัญญาณรบกวนจากเซ็นเซอร์ พฤติกรรมผู้ใช้ และ network latency
- รองรับการกำหนดพารามิเตอร์สำหรับหลายสถานการณ์ เช่น mixture distribution, Bernoulli, exponential, normal
- ยังมี โครงการภาพแบบโต้ตอบ แยกต่างหาก เพื่อช่วยให้เข้าใจการแจกแจงแต่ละแบบได้อย่างเป็นสัญชาตญาณมากขึ้น
มีการดำเนินการด้านสถิติและการวิเคราะห์ให้ใช้งาน
- มีฟังก์ชันสถิติหลากหลาย เช่น ค่าคาดหมาย, ส่วนเบี่ยงเบนมาตรฐาน, ช่วงความเชื่อมั่น, ความเบ้ (skewness), ความโด่ง (kurtosis), เอนโทรปี
- ผลลัพธ์ของการคำนวณสามารถปรับจำนวนตัวอย่างได้ จึง แลกเปลี่ยนระหว่างความแม่นยำกับประสิทธิภาพได้
- ยังใช้ cumulative distribution function (CDF) เพื่อคำนวณความน่าจะเป็นของการมีค่าน้อยกว่าหรือเท่ากับค่าหนึ่งได้อย่างสะดวก
แนวทางการนำไปใช้ในโลกจริง
- อธิบายปัญหาที่อาจเกิดขึ้นจริงในแอปเมื่อ มองข้ามความไม่แน่นอน เช่น การแสดงความเร็ว GPS ที่ผิดเพี้ยนอย่างมาก
- เน้นการ เปลี่ยนผ่านแบบค่อยเป็นค่อยไป โดยแนะนำให้เริ่มผสาน
Uncertain<T> จากเส้นทางหลักอย่างการวัดระยะทางก่อน
- สามารถ ปรับสมดุลความแม่นยำและประสิทธิภาพ ได้ด้วยการตั้งค่าต้นทุนการคำนวณ เช่น จำนวนตัวอย่าง
- ในงานจริงแนะนำให้ใช้เครื่องมือ profiling อย่าง Instruments.app อย่างจริงจัง
- เป้าหมายไม่ใช่การกำจัดความไม่แน่นอน แต่คือ ยอมรับการมีอยู่ของมันและสร้างรูปแบบการพัฒนาที่รับมือได้อย่างเหมาะสม
บทสรุปและมุมมองต่อไป
- นักพัฒนาสามารถเริ่มนำการจัดการความไม่แน่นอนมาใช้จาก ขอบเขตเล็ก ๆ ก่อน เพื่อปรับปรุงการใช้งานและลดข้อผิดพลาด
- ยอมรับว่าความแน่นอนอย่างสมบูรณ์ไม่มีอยู่จริง และใช้เครื่องมือกับ abstraction ที่เหมาะสมเพื่อยกระดับคุณภาพของซอฟต์แวร์ขึ้นอีกขั้น
- ในทางปฏิบัติ การจัดการกับความไม่แน่นอนที่มีอยู่จริงให้ถูกต้อง คือการปรับปรุงงานพัฒนาอย่างแท้จริง
1 ความคิดเห็น
ความเห็นบน Hacker News