อธิบาย Kalman Filter แบบเข้าใจง่าย
(thekalmanfilter.com)- Kalman Filter เป็นอัลกอริทึมที่สร้าง ค่าประมาณสถานะที่แม่นยำยิ่งขึ้น แบบเรียลไทม์จากค่าที่วัดได้ซึ่งมีสัญญาณรบกวนหรือไม่แม่นยำ และถูกใช้ในการพยากรณ์และการควบคุมที่อาศัยเซ็นเซอร์
- ไม่ได้มีหน้าที่เพียงทำให้ค่าที่วัดได้เรียบขึ้นเท่านั้น แต่ยังสามารถประมาณ ตัวแปรสถานะอย่างตำแหน่งและความเร็ว ที่สังเกตได้ยากโดยตรง
- ตัวอย่างการติดตามด้วยเรดาร์แสดงลำดับการรับค่าตำแหน่ง 2D และ covariance เป็นอินพุต แล้วประมาณ ตำแหน่งและความเร็ว ของวัตถุเป็นเวกเตอร์สถานะขนาด 4×1
- หลังจากกำหนดค่าเริ่มต้นของสถานะด้วยค่าที่วัดได้สองครั้งแรกแล้ว จะทำซ้ำขั้นตอนการพยากรณ์ การคำนวณ Kalman Gain และการอัปเดตสถานะกับ covariance ของข้อผิดพลาดต่อไป
- ประวัติที่ฟิลเตอร์เก็บรักษาไว้มีเพียงค่าประมาณสถานะปัจจุบันค่าเดียว จึงนำไปใช้งานได้ง่ายแม้บน อุปกรณ์ที่มีข้อจำกัดด้านหน่วยความจำ
ภาพรวมของ Kalman Filter
- Kalman Filter สามารถมองได้เหมือน กล่องดำ ที่มีอินพุตและเอาต์พุต
- อินพุตคือค่าที่วัดได้ซึ่งมีสัญญาณรบกวนหรือบางครั้งก็ไม่แม่นยำ
- เอาต์พุตคือค่าประมาณที่มีสัญญาณรบกวนน้อยลงและแม่นยำขึ้น
- ค่าประมาณอาจเป็น พารามิเตอร์สถานะของระบบ ที่ไม่ได้ถูกวัดหรือสังเกตโดยตรง
- ใช้สำหรับประมาณทั้งพารามิเตอร์ที่สังเกตได้และสังเกตไม่ได้ แบบเรียลไทม์ ด้วยความแม่นยำสูง
- ค่าประมาณที่มีความแม่นยำสูงนำไปใช้กับการพยากรณ์และการตัดสินใจที่ละเอียดแม่นยำ
- จึงถูกใช้งานบ่อยใน หุ่นยนต์ และระบบเรียลไทม์ที่ต้องการข้อมูลที่เชื่อถือได้
ปัญหาที่ Kalman Filter แก้ได้
- ใช้ค่าที่วัดได้ซึ่งไม่แม่นยำหรือมีสัญญาณรบกวน เพื่อประมาณสถานะของตัวแปร หรือประมาณตัวแปรอื่นที่สังเกตโดยตรงได้ยาก ให้มีความแม่นยำสูงขึ้น
- ตัวอย่างการใช้งานที่พบได้บ่อยมีดังนี้
- การติดตามวัตถุ: ใช้ตำแหน่งที่วัดได้เพื่อประมาณตำแหน่งและความเร็วของวัตถุให้แม่นยำขึ้น
- การประมาณน้ำหนักจากเครื่องชั่งดิจิทัล: ใช้แรงกดบนพื้นผิวเพื่อประมาณน้ำหนักของวัตถุ
- การนำวิถี การนำทาง และการควบคุม: ใช้เซ็นเซอร์ IMU เพื่อประมาณตำแหน่ง ความเร็ว และความเร่ง แล้วนำไปใช้ควบคุมการเคลื่อนไหวถัดไป
- จุดแข็งของ Kalman Filter ไม่ได้อยู่ที่การทำให้ค่าที่วัดได้เรียบขึ้นเท่านั้น แต่คือความสามารถในการประมาณ พารามิเตอร์ของระบบที่วัดได้ยาก
- ในระบบเรียลไทม์ ค่าประมาณที่แม่นยำขึ้นจะนำไปสู่การควบคุมและการทำงานที่ดีกว่า
อินพุตและเอาต์พุตของตัวอย่างการติดตามด้วยเรดาร์
- ตัวอย่างนี้กล่าวถึงสถานการณ์ การติดตามด้วยเรดาร์ เพื่อเฝ้าติดตามเครื่องบินและวัตถุรอบสนามบิน
- สถานะแทร็กที่ได้จะถูกนำไปแสดงให้ผู้ปฏิบัติงานควบคุมการจราจรทางอากาศที่เฝ้าระวังน่านฟ้าเห็น
- เรดาร์ส่งออก ค่าการวัดตำแหน่ง x, y ในระบบพิกัดคาร์ทีเซียน 2D
- ค่าที่วัดได้แสดงเป็นคอลัมน์เวกเตอร์ขนาด 2×1 z
- เมทริกซ์ความแปรปรวน-โคเวเรียนซ์ ของค่าที่วัดได้แสดงด้วย R
- เวลาที่ประทับกับการวัดแสดงด้วย t
- ตัวห้อย m หมายถึงพารามิเตอร์การวัด และ k หมายถึงลำดับของการวัด
- Kalman Filter ใช้ค่าที่วัดได้จากเรดาร์เพื่อประมาณ ตำแหน่งและความเร็ว ของวัตถุ
- ค่าประมาณแสดงเป็นคอลัมน์เวกเตอร์ขนาด 4×1 x
- เมทริกซ์ความแปรปรวน-โคเวเรียนซ์ ของค่าประมาณแสดงเป็นเมทริกซ์ขนาด 4×4 P
- เวลาที่ประทับกับค่าประมาณสถานะแสดงด้วย T
ขั้นที่ 1: กำหนดค่าเริ่มต้นของสถานะระบบ
- วิธีการกำหนดค่าเริ่มต้น ของ Kalman Filter แตกต่างกันไปตามแอปพลิเคชัน
- ในตัวอย่างการติดตามด้วยเรดาร์นี้ ใช้ค่าที่วัดได้ครั้งแรกเพื่อกำหนดค่าเริ่มต้นของสถานะระบบ
- แม้อินพุตการวัดจะมีเพียงข้อมูลตำแหน่ง แต่สถานะระบบที่เป็นเอาต์พุตประกอบด้วย ตำแหน่งและความเร็ว ของวัตถุ
- เมื่อได้รับค่าที่วัดได้ครั้งแรก ข้อมูลที่ทราบได้มีเพียงตำแหน่ง ณ เวลานั้น
- หลังการประมาณครั้งแรก ค่าประมาณสถานะระบบจะถูกตั้งเป็นตำแหน่งจากอินพุต
- covariance ของข้อผิดพลาดของสถานะระบบจะถูกตั้งจากความแม่นยำของตำแหน่งในค่าที่วัดได้ครั้งแรก
ขั้นที่ 2: กำหนดสถานะระบบใหม่อีกครั้ง
- เนื่องจากการประมาณความเร็วต้องใช้ค่าการวัดตำแหน่งครั้งที่สอง จึงต้อง กำหนดค่าประมาณสถานะระบบใหม่อีกครั้ง
- ความเร็วคำนวณจากการประมาณเชิงเส้น
- ความเร็ว = ระยะทางที่เคลื่อนที่ / เวลาที่ใช้ในการเคลื่อนที่
- ค่าประมาณสถานะระบบที่อัปเดตแล้วประกอบด้วยตำแหน่งจากการวัดครั้งที่สองและความเร็วที่คำนวณได้
- covariance ของข้อผิดพลาดของสถานะระบบที่อัปเดตแล้วจะรวมความแม่นยำของตำแหน่งจากการวัดครั้งที่สองและความแม่นยำโดยประมาณของความเร็ว
- ค่าประมาณความแม่นยำของความเร็วสามารถปรับ จูน ได้หลังจากปล่อยให้ข้อมูลไหลผ่านฟิลเตอร์
- ในตัวอย่างนี้ตั้งค่าเทอมความแปรปรวนของความเร็วเป็น 10⁴
- ค่านี้แสดงถึงความไม่แน่นอนสูงของค่าความเร็วในสถานะ
- หน่วยของความเร็วในตัวอย่างคือ m/s
การประมวลผลแบบวนซ้ำหลังการกำหนดค่าเริ่มต้น
- สองขั้นตอนแรกคือกระบวนการกำหนดค่าเริ่มต้นและกำหนดใหม่ให้กับค่าประมาณของระบบด้วยค่าการวัดไม่กี่ครั้ง
- วิธีการกำหนดค่าเริ่มต้นอาจแตกต่างกันไปตามแอปพลิเคชัน
- เป้าหมายคือการมี ค่าประมาณสถานะระบบ ที่สามารถอัปเดตด้วยสมการ Kalman Filter ได้เมื่อมีค่าการวัดในลำดับถัดไป
- หลังจากนั้น ขั้นตอนต่อไปคือสะท้อนค่าการวัดใหม่เข้าสู่ฟิลเตอร์และอัปเดตค่าประมาณสถานะ
ขั้นที่ 3: พยากรณ์ค่าประมาณสถานะระบบ
- เมื่อค่าการวัดครั้งที่สามเข้ามา จะมีการส่งต่อค่าประมาณสถานะระบบไปข้างหน้าเพื่อให้ จัดแนวตามเวลา กับค่าการวัด
- การจัดแนวนี้จำเป็นสำหรับการรวมค่าการวัดกับค่าประมาณสถานะเข้าด้วยกัน
- การพยากรณ์ใช้ แบบจำลองระบบ
- ในตัวอย่างนี้ ใช้แบบจำลองการเคลื่อนที่เชิงเส้นด้วยความเร็วคงที่เพื่อประมาณการเปลี่ยนแปลงตำแหน่งของวัตถุในช่วงเวลา
- แบบจำลองความเร็วคงที่สมมติว่าความเร่งเป็น 0
- เมทริกซ์การเปลี่ยนสถานะแสดงสมการการเคลื่อนที่นี้
- เมทริกซ์นี้ใช้สำหรับส่งต่อค่าประมาณสถานะและเมทริกซ์ covariance ของข้อผิดพลาดของสถานะอย่างเหมาะสม
- เมื่อส่งต่อค่าประมาณสถานะไปยังเวลาในอนาคต จะเกิดความไม่แน่นอนของสถานะ ณ เวลานั้น จึงทำให้ covariance ของข้อผิดพลาดเพิ่มขึ้น
เมทริกซ์ Q และเมทริกซ์ H
- เมทริกซ์ Q แสดง process noise ของแบบจำลองระบบ
- แบบจำลองระบบเป็นเพียงค่าประมาณ
- ความแม่นยำของแบบจำลองจะแปรผันไปตลอดช่วงชีวิตของสถานะระบบ
- เมทริกซ์ Q แสดงความไม่แน่นอนนี้ และจะถูกบวกเพิ่มเข้าไปใน noise ของสถานะเดิม
- ในตัวอย่างนี้ การเร่งและการชะลอจริงมีส่วนทำให้เกิดข้อผิดพลาดนี้
- เมทริกซ์ H คือเมทริกซ์สถานะ-การวัด ซึ่งใช้แปลงค่าประมาณสถานะระบบจาก state space ไปยัง measurement space
- ในบางแอปพลิเคชัน เป็นเมทริกซ์ที่ประกอบด้วย 0 และ 1
- ในแอปพลิเคชันที่ใช้ Extended Kalman Filter จะถูกเติมด้วยสมการเชิงอนุพันธ์
- คำอธิบายที่เกี่ยวข้องต่อเนื่องไปยังบทความ Extended Kalman Filters
- เมทริกซ์ H ในตัวอย่างนี้เป็นเมทริกซ์อย่างง่ายที่ลดค่าประมาณสถานะและ covariance ของข้อผิดพลาดให้สามารถเปรียบเทียบได้เฉพาะ ค่าตำแหน่ง ไม่ใช่ทั้งตำแหน่งและความเร็วทั้งหมด
ขั้นที่ 4: คำนวณ Kalman Gain
- Kalman Filter จะคำนวณ Kalman Gain สำหรับค่าการวัดใหม่ทุกครั้ง
- Kalman Gain เป็นตัวกำหนดว่าค่าการวัดอินพุตจะมีอิทธิพลต่อค่าประมาณสถานะระบบมากเพียงใด
- หากสัญญาณรบกวนของค่าการวัดสูงมาก Kalman Gain จะเชื่อค่าประมาณสถานะปัจจุบันมากกว่าข้อมูลใหม่ที่แม้จะใหม่แต่ไม่แม่นยำ
- วิธีที่ถ่วงน้ำหนักระหว่างค่าประมาณปัจจุบันกับข้อมูลการวัดใหม่อย่างเหมาะสมเพื่อสร้าง ค่าประมาณที่เหมาะที่สุด คือแก่นหลักของอัลกอริทึม Kalman Filter
ขั้นที่ 5: อัปเดตสถานะและ covariance ของข้อผิดพลาด
- Kalman Filter ใช้ Kalman Gain เพื่อประมาณสถานะระบบและเมทริกซ์ covariance ของข้อผิดพลาด ณ เวลาของค่าการวัดอินพุต
- Kalman Gain ถูกใช้เพื่อให้ค่าน้ำหนักที่เหมาะสมกับค่าการวัดในการคำนวณสองส่วน
- การคำนวณ ค่าประมาณสถานะระบบ ใหม่
- การคำนวณ covariance ของข้อผิดพลาด ของสถานะระบบ
- ค่าประมาณสถานะที่คำนวณได้คือประวัติสถานะเพียงอย่างเดียวที่ Kalman Filter เก็บไว้
- ด้วยคุณสมบัตินี้ Kalman Filter จึงสามารถนำไปใช้ได้แม้บนอุปกรณ์ที่มี ข้อจำกัดด้านหน่วยความจำต่ำ
สรุป
- Kalman Filter เป็น กระบวนการทั่วไป สำหรับการประมาณสถานะที่เหมาะที่สุด
- ถูกใช้ในแอปพลิเคชันหลากหลายที่ต้องการค่าประมาณที่แม่นยำ
- เมื่อแบ่งเป็นขั้นตอนย่อย ๆ จะทำให้เห็นว่า Kalman Filter ทำงานในโครงสร้างที่เข้าใจง่ายขึ้นและไม่น่าหนักใจนัก
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
พูดถึง Kalman filter แล้วจะขาดลิงก์สื่อการเรียนชั้นยอดนี้ไปไม่ได้ เขียนเป็นชุด Jupyter notebook: https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Pyt...
หนังสือเล่มนี้มอง alpha-beta filter ว่าเป็นเหมือนน้องเล็กของ Kalman filter แบบเต็มรูปแบบ แต่พอช่วงหลังผมต้องอ่านเรื่องนี้เยอะเพราะงานต้องใช้ของคล้ายกัน ก็เริ่มตระหนักว่า alpha-beta filter และตระกูล Kalman เน้นการพยากรณ์อนาคตระยะใกล้มาก ขณะที่สิ่งที่ผมต้องการจริง ๆ คือการทำ smoothing กับข้อมูลในอดีต
เลยเริ่มอ่านเรื่อง double exponential smoothing และมันก็ดูเหมาะกับ use case มาก แต่พอขุดลึกลงไปก็พบว่าสุดท้ายมันคือ alpha-beta filter ที่แค่เปลี่ยนชื่อตัวแปรเท่านั้น
รู้สึกว่าคณิตศาสตร์แขนงนี้ทั้งหมดตั้งอยู่บนทฤษฎีพื้นฐานร่วมกันไม่กี่อย่าง แต่พอแต่ละสาขาไปถึงระบบเดียวกันด้วยแนวทางต่างกัน ชื่อกับสัญลักษณ์เลยต่างกันจนความเหมือนถูกซ่อนไว้ เหมือนว่าที่ใจกลางของเรื่องอย่าง power series, ค่าคงที่ธรรมชาติ, gradient descent, filter, feedback system, general systems theory น่าจะมีแกนของสัญชาตญาณเล็ก ๆ ร่วมกันอยู่ และถ้าจับแกนนั้นได้ คณิตศาสตร์หลายอย่างก็น่าจะเชื่อมต่อกันได้อย่างสวยงาม
ไม่ได้ทำไปเพื่อประหยัดกระดาษหรือเขียนให้ง่ายขึ้น การพิมพ์อักษรกรีกพร้อม superscript/subscript ใน LaTeX บนคีย์บอร์ดอังกฤษไม่ได้ง่ายกว่าการพิมพ์คำยาว ๆ เลย สิ่งที่ทำคือพยายามส่งข้อมูลบางอย่างให้ผู้อ่านในแบบที่สื่อด้วยวิธีอื่นได้ยาก
ส kýญลักษณ์ทางคณิตศาสตร์ดูเหมือนตัวอักษร แต่โดยเนื้อแท้แล้วมันเป็น ส kýญลักษณ์เชิงภาพ อยู่มาก และคำยาว ๆ จะไปบังภาพนั้น
ถ้าได้เรียนวิชา control และ signal/systems อย่างจริงจัง คุณจะซึมซับสัญชาตญาณแบบนั้นไปเอง และค่อย ๆ เรียนรู้ทั้งคณิตศาสตร์และคำศัพท์โดยไม่ยึดติดกับธรรมเนียมการเขียนแบบใดแบบหนึ่งมากเกินไป สัญชาตญาณที่แท้จริงคือ “ทุกอย่างคือ filter” และที่เหลือคือการวิเคราะห์และสังเคราะห์ไอเดียนั้น
ตอนนี้ AI/ML โตขึ้นมาก ไอเดียจากทฤษฎีการควบคุมแบบดั้งเดิมก็เริ่มถูกรวมเข้ากับ reinforcement learning มากขึ้นด้วย
เพราะโดยทั่วไป Q และ R มักถูกปรับด้วยมือจน “ดูโอเค” แล้วก็แทบไม่เปลี่ยนอีก นอกจากนี้แทนที่จะต้องจูนค่าหลายตัวใน Q และ R คุณก็แค่จูนค่า gain ตัวเดียวด้วยมือได้
ถ้า noise ของค่าที่วัดได้คงที่ตลอด มันก็จะลู่เข้าเป็นค่าคงที่ตามเวลา และจะมีประโยชน์เป็นพิเศษก็ต่อเมื่อเรารู้ความแม่นยำของการวัดได้ดี แต่ค่าดังกล่าวเปลี่ยนไปมาก
เมื่อไม่นานมานี้ผมได้รับหน้าที่ implement Kalman filter และพบว่าหาแหล่งอธิบายดี ๆ ในภาษาที่นักพัฒนาอย่างผมเข้าใจได้ยากมากจริง ๆ หลังจากใช้เวลาศึกษาราวหนึ่งเดือน ผมก็เขียนบทความไว้สองชิ้น ซึ่งอาจช่วยใครบางคนได้: https://www.splinter.com.au/2023/12/14/the-kalman-filter-for..., https://www.splinter.com.au/2023/12/15/the-kalman-filter-wit...
ในฐานะนักพัฒนา มันค่อนข้างน่าขันที่ผมเพิ่งจะเข้าใจคณิตศาสตร์หลังจากลองลงมือ implement เองแล้ว ดูเหมือนมันเป็นวิธีเรียนรู้แบบค่อย ๆ สร้างบนสิ่งที่รู้อยู่แล้ว ไม่แน่ใจว่ามีคำเรียกแนวทางแบบนี้หรือเปล่า
ฉันคิดมาตลอดว่าคณิตศาสตร์จะเรียนง่ายขึ้นมากถ้าใช้ ชื่อตัวแปรที่อธิบายความหมายได้ชัดเจน อย่างน้อยถ้าเป็นสื่อเชิงโต้ตอบอย่างเว็บ ก็ยังใส่ tooltip ขั้นต่ำได้ ตอนเรียนคณิตศาสตร์ เวลาราว 90% หมดไปกับการไล่หาว่าสัญลักษณ์แต่ละตัวหมายถึงอะไร
อีกอย่างตรงนี้ที่บอกว่าตัวห้อย “แสดงลำดับของการวัด” ก็ทำให้งงว่าหมายถึงลำดับแบบไหน น่าจะหมายถึงดัชนีมากกว่า ฉันเองก็ไม่ได้จับ Kalman filter มานานแล้ว
ยิ่งคณิตศาสตร์มีความเป็นนามธรรมมากขึ้น ขอบเขตของตัวแปรส่วนใหญ่ก็จะยิ่งสั้นลง ปกติตัวแปรจะถูกนิยามก่อนใช้งานไม่นาน และขอบเขตก็มักไม่เกินบทพิสูจน์หรือการอนุมานนั้น ๆ
แต่ตัวเลือกบางอย่างในบทความนี้ก็แปลกจริง ๆ เช่น ใช้ P เป็นทั้งตัวแปรและดัชนีพร้อมกัน ทั้งที่ precision matrix เป็นเมทริกซ์ผกผันอย่างแท้จริงของ covariance matrix แต่กลับใช้ P กับ covariance matrix
ความกำกวมแบบนี้แหละคือส่วนที่น่าหงุดหงิดที่สุดของงานวิจัย ต้องทำให้ชัดเจนเสมอ ควรใช้คำอธิบายแบบสัมบูรณ์ ไม่ใช่แบบสัมพัทธ์ อย่าเขียนว่า “ดูด้านขวา” เพราะฉันอาจกำลังดูด้านซ้ายก็ได้
ถ้าเขียนว่า “หลังจากหมุนปริซึมแล้ว กรวยแสง...” ก็ยังขาดข้อมูลว่าหมุนไปทางไหน ซ้ายหรือขวา แนวนอนหรือขึ้นลง เร็วหรือช้า คนเขียนเห็นองค์ประกอบสำคัญพวกนี้ครบอยู่ในหัว แต่ผู้อ่านอ่านใจไม่ได้
ตัวห้อย “p” น่าจะหมายถึง prediction หรือการพยากรณ์ ดังนั้น x_p ของเวลา 3 คือสถานะที่คาดไว้สำหรับเวลา 4 แต่เมื่อถึงเวลา 4 จริง ก็จะนำค่าการวัดใหม่มาคิดรวมเพื่อคำนวณ x_4
พูดให้ชัดคือ x_4 นี้ไม่เหมือนกับ x_p ที่คำนวณไว้ตอนเวลา 3 เพราะการพยากรณ์ย่อมคลาดเคลื่อนอยู่เสมอ
ปัญหาคือคนที่เพิ่งเริ่มยังไม่คุ้นกับแนวคิดหรือ สัญกรณ์มาตรฐาน ของแต่ละโจทย์แต่ละสาขา ความเจ็บปวดเวลาเริ่มเรียนเรื่องใหม่จึงยังคงอยู่
Kalman filter อาจเป็นหนึ่งในกรณีประหลาดที่ เวอร์ชันแบบย่อ ในคณิตศาสตร์ถูกย่อมากเกินไปจนแทบไม่เห็นหน้าตาเดิม
สิ่งที่มันทำจริง ๆ คือรับค่าการวัดเข้ามาหนึ่งค่า จำลองสถานะอนาคตที่เป็นไปได้ จากนั้นรวมข้อมูลนี้เข้ากับค่าการวัดถัดไป แล้วทำซ้ำไปเรื่อย ๆ
ตัวอย่างเช่น ถ่ายภาพลูกเทนนิสหลายภาพ ประเมินตำแหน่งและความเร็วจากภาพแรก จากนั้นจำลองว่ามันน่าจะไปทางไหน แล้วเทียบกับภาพถัดไปเพื่อดูว่าการประมาณแบบไหนใกล้ความจริงกว่า หรือถ้าเป็นตัวอย่างแบบดั้งเดิมกว่านั้น ก็อาจนึกถึงการวัดมุมเงยของดวงอาทิตย์เพื่อสร้างเส้นตำแหน่งที่เป็นไปได้บนแผนที่ แล้วนำไปเทียบกับจุดที่เดิมเราคิดว่าตัวเองอยู่
แน่นอนว่าการคำนวณแบบเป๊ะ ๆ แทบเป็นไปไม่ได้ในทางปฏิบัติ จึงต้องลดรูปด้วยการสุ่มตัวอย่าง แต่ถึงอย่างนั้นก็ยังยากอยู่ดี เลยสมมติว่าการแจกแจงใกล้เคียง การแจกแจงแบบเกาส์ ในระดับหนึ่ง จากนั้นลดรูปต่อโดยสมมติว่าการเปลี่ยนแปลงของระบบเป็นการแปลงเชิงเส้น จึงได้เป็น Kalman filter แบบที่พูดถึงกันตรงนี้
ถ้าแค่มอง linear algebra แล้วเข้าใจได้เลยว่าเกิดอะไรขึ้นจริง ๆ ก็น่าจะน่าทึ่งมาก
แต่คำอธิบายนี้แหละที่ทำให้ฉันได้ สัญชาตญาณ เป็นครั้งแรกว่าจริง ๆ แล้วมันกำลังเกิดอะไรขึ้น สำหรับคนสายคอมพิวเตอร์อย่างฉัน แม้แต่ชื่อนี้เองก็ชวนให้เข้าใจผิดพอสมควร เพราะมันไม่ใช่ filter แบบที่พูดถึงใน stream processing หรือ SQL
Kalman filter พยายามประมาณค่า อินพุตแฝง ที่ทำให้เกิดค่าการวัดที่เห็นอยู่ เพื่อทำเช่นนั้นจึงตั้งโจทย์
หาค่า x ที่ทำให้ [ค่าที่วัดจริง - ค่าที่คาดว่าจะวัดได้(x)]^2/s^2 ต่ำสุดโดยsคือซิกมาของสัญญาณรบกวนสิ่งนี้มาจากปัญหาการประมาณสถานะที่
ทำให้ likelihood ของการเห็นค่าที่วัดจริงสูงสุดสำหรับ xเพราะในฟังก์ชัน likelihood พจน์สำคัญมีเพียง-([x-expected(x)]/s)^2เท่านั้น แค่ดูเลขชี้กำลังของการแจกแจงปกติ หรือจริง ๆ แล้วของการแจกแจงแบบเอ็กซ์โพเนนเชียลแทบทุกชนิดก็ได้เนื่องจาก
ค่าที่วัดจริงเป็นค่าคงที่ ถ้าฟังก์ชันค่าที่คาดว่าจะวัดได้เป็นเชิงเส้น ก็แก้ได้ตรง ๆ ด้วย convex optimization หาอนุพันธ์แล้วตั้งให้เท่ากับ 0 ก็จะได้ขั้นตอนอัปเดตของ Kalman filter ออกมาถ้าฟังก์ชันไม่เป็นเชิงเส้น ก็เท่ากับทำ Newton-Raphson หนึ่งก้าว โดย linearize สมการก่อน ทำการหาค่าต่ำสุด แล้วคืนคำตอบของ “การทำให้เป็นเชิงเส้นแบบปลอม ๆ” นั้นออกมา ทั้งหมดนี้เป็นแคลคูลัสและ linear algebra ระดับปริญญาตรี เพียงแต่ไม่ค่อยมีใครบอกกันแบบนี้
แต่คำอธิบายนี้ก็ผิดอย่างสิ้นเชิงได้เหมือนกัน มันเป็นแฮ็กจากยุค 1960 ที่พยายาม maximize likelihood function ด้วยการทำให้เป็นเชิงเส้นแบบเวียนกลับทีละขั้นตอน วิศวกรหลายรุ่นเชื่อว่ามันเป็นวิธีที่เหมาะที่สุดเพราะอ่าน Cramér-Rao bound ผิด แต่ความจริงไม่ใช่
ทุกวันนี้เรามีพลังประมวลผลมากขึ้นราว 10,000 เท่า และจะได้ผลดีกว่าหากตั้งสมการไม่เชิงเส้นแล้วแก้ด้วย Newton-Raphson หลายก้าว หรือเก็บประวัติการวัดที่ยาวขึ้นแล้วแก้ทั้งชุดนั้นด้วย Newton-Raphson หลายก้าว หรือใช้การแทนแบบ Gaussian mixture เพื่อรองรับ measurement function ที่มีหลายยอด
เรื่องพวกนี้ถูกพูดถึงอย่างดีในงานวิจัยด้าน state estimation ตั้งแต่ทศวรรษ 1980 จนถึงปัจจุบัน แต่ตำราเรียนจำนวนมากก็ยังเหมือนถูกสลักค้างไว้ในปี 1972
Cramér-Rao bound จะนิยามได้ก็ต่อเมื่อ likelihood function ของการวัดทั้งหมดสามารถถูก linearize ได้ที่สถานะจริงเท่านั้น ซึ่งทำได้เพียงในเชิงลู่เข้าเมื่อพิจารณาเป็นชุดที่เก็บค่าการวัดทั้งหมดไว้ และเป็นไปไม่ได้ก่อนเวลาที่ไม่สิ้นสุด รวมถึงเป็นไปไม่ได้สำหรับ recursive filter ด้วย
ในบรรดาคำอธิบายเก่า ๆ บทความนี้ดีมาก: https://www.bzarg.com/p/how-a-kalman-filter-works-in-picture..., https://news.ycombinator.com/item?id=13449229
ถ้าจำเป็นต้องใช้ Kalman filter จริง ๆ ก็น่าจะอ่านและทำความเข้าใจบทความนี้ หรือเอกสารใน Wikipedia หรือแม้แต่ซอร์สโค้ดสำหรับการติดตั้ง(https://github.com/LdDl/kalman-rs/blob/master/src/kalman/kal...)ได้
แต่จากประสบการณ์ของผม คนแทบจะทั้งหมดบนโลกนี้เรียนรู้ได้ดีที่สุดจากตัวอย่างในฐานะ ผู้เรียนรู้ด้วยภาพ ดังนั้นจึงน่าแปลกใจที่บทช่วยสอนตรงกลางหน้าไม่ใส่ตัวเลขตัวอย่างลงในสูตร อาจเป็นไปได้ว่าผมมองข้ามไป แต่แม้แต่ภาพประกอบก็เริ่มหลังจากมีข้อความว่า “Kalman filter คืออะไร” อยู่เต็มหนึ่งหน้า และภาพนั้นเองก็ยังเป็นสูตรเพิ่มอีก
เรื่องแบบนี้เกิดขึ้นบ่อยมากจนแทบน่าตกใจ และในรูปแบบที่เบากว่านี้ ปัญหาเดียวกันก็พบได้ในไลบรารีซอฟต์แวร์ที่ไม่ใส่ ตัวอย่างโค้ด มาด้วย
สิ่งที่ทำให้ผมเข้าใจได้คือ เมื่อรวมการแจกแจงของค่าที่วัดได้ซึ่งไม่แน่นอนสองชุดเข้าด้วยกัน หรือก็คือการแจกแจงที่มีความแปรปรวนสูง เราจะได้ค่าที่วัดได้ที่แน่นอนขึ้น หรือก็คือการแจกแจงที่แคบลง
ถ้านำค่าที่วัดได้ที่แน่นอนขึ้นนี้ไปรวมกับค่าที่วัดได้ถัดไปอีก แล้วทำซ้ำไปเรื่อย ๆ นั่นก็คือ Kalman filter
ในบรรดาวิดีโอชุดที่อธิบาย KF อันนี้ดีมากจริง ๆ ผมเข้าใจได้ดีกว่าสื่ออ้างอิงของบทความต้นฉบับเสียอีก: https://www.youtube.com/watch?v=CaCcOwJPytQ
คุณพ่อผู้ล่วงลับของผมใช้ฟิลเตอร์นี้บ่อยมากตลอดอาชีพของท่าน ตั้งแต่ช่วงที่มันเพิ่งถูกคิดค้นขึ้นมา ท่านทำงานเกี่ยวกับเรดาร์และระบบนำวิถีมิสไซล์
ลองหลับตาแล้วเดินไปมาสักครู่ ลองนึกภาพว่าตัวเองอยู่ตรงไหน แล้วพอลืมตาขึ้นมา ตำแหน่งจริงต่างจากตำแหน่งที่คิดไว้ไหม?
ขั้นตอนสุดท้ายนั้น หรือก็คือการใช้การสังเกตเพื่ออัปเดต ความเชื่อเกี่ยวกับตัวแปรสถานะ คือสิ่งที่ Kalman filter ทำ