Reinforcement Learning
และตัวอย่างพื้น ๆ
อันว่าโลกแห่ง Machine Learning (ML) นั้นก็กว้างนัก หากนับ ๆ ลูก ๆ ของมันก็คงไม่น้อยกว่า
- Supervised Learning ที่พยายามหาวิธีการ map จาก “จุด” หนึ่ง ๆ ไปยัง “ป้าย” (label) ที่เหมาะสม
- Unsupervised Learning ที่พยายามจัดกลุ่ม “จุด” (ที่ไม่มีป้าย) ต่าง ๆ ให้เป็นกลุ่มตามจำนวนที่เราต้องการ และในรูปแบบที่คิดว่า “งดงามที่สุด” (ทำไมมีแต่คำกำกวม ๕๕๕)
- Semi-supervised Learning ความลงตัวของโลกทั้งสองด้านบน การเอาจุดที่ไม่ได้ติดป้าย ประกอบกับจุดที่ติดป้ายจำนวนหนึ่ง และพยายามติดป้ายให้กับจุดที่เหลือทั้งหมด
(อ่านเพิ่มเติม Machine Learning เรียนอะไร, รู้ไปทำไม @iboss)
ทั้งสามด้านบนนั้นมีเนื้อหาที่ “เข้ากันได้ดี” อย่างน้อยก็เป็นไปในทางเดียวกัน หากแต่ยังมีอีกหนึ่งที่เราท่านอาจไม่ได้ยินนักว่าเป็น Machine Learning หรือแม้แต่คอร์ส Machine Learning ของ Andrew Ng ใน Coursera ก็ไม่ได้กล่าวไว้ นั่นก็คือ Reinforcement Learning
Reinforcement Learning ในมุมมองหนึ่งก็เหมือนการสอนสุนัขให้ทำตามสิ่งที่เราต้องการ ในมุมมองหนึ่งก็เหมือนการ trial-and-error คือ ลองผิดลองถูก และหากจะจำกัดความ Reinforcement Learning ไว้ดังนั้น ก็คงไม่ผิดจากความจริงมากนัก เพราะวิธีการฝึกฝน Machine ด้วยการนี้คือการ ให้รางวัล และการลงโทษ
การนิยามการแก้ปัญหาด้วยวิธี Reinforcement Learning ก็มีสิ่งที่ต้องกำหนด (เอาไว้ก่อน) ดังต่อไปนี้
- สถานะ (S) เช่น หากเป็นบอทสำหรับเล่นเกม เอ็กซ์โอ ก็คือภาพกระดานที่กำลังเล่นอยู่ในปัจจุบัน
- การกระทำ (A) ซึ่งอาจจะไม่เหมือนกันสำหรับแต่ละสถานะ เช่น ตอนต้นเกมของเอ็กซ์โอผู้เล่นย่อมมีทางเลือกในการเล่นมากกว่าตอนท้ายเกม
- รางวัล (R) ขึ้นอยู่กับแต่ละสถานะ หรือขึ้นอยู่กับการกระทำ หรือทั้งคู่ก็ได้ โดยทั่วไปสำหรับการเล่นเกมแล้วก็คือผลลัพธ์ของการเล่น เช่น ชนะอาจจะเป็นเลขบวก (+) แพ้อาจจะเป็นเลขลบ (-) หากเสมอก็อาจะเป็นศูนย์ (0) รางวัลประเภทนี้เรียกว่า รางวัลที่ไม่ได้รับทันที เนื่องจากต้องเล่นให้จบเกมเสียก่อน รางวัลยังมีอีกประเภทคือ รางวัลที่ได้รับในทันที เช่นสำหรับโปรแกรมควบคุมหุ่นยนต์ให้เดินได้เร็ว ๆ รางวัลอาจจะเป็นความเร็วของหุ่นบนต์ถ้าเดินได้เร็วก็จะได้รับรางวัลเยอะ ๆ ทันที
แล้วเป้าหมายของการกระทำคือ นโยบาย (Policy) ที่ดีที่สุดที่ นั่นคือได้รางวัลรวมที่คาดหวัง (Maximum Sum of Expected Rewards) เยอะที่สุด
ขอเร่ิมด้วยตัวอย่างการใช้ Reinforcement Learning แก้ปัญหาต่าง ๆ
วีดีโอด้านบน (ต้นฉบับจากนี่) คือการฝึกสุนัขหุ่นยนต์ให้เดินได้เร็วที่สุด โดยเนื่องจากการเดินต้องอาศัยการหมุนของข้อต่อหลายตัว ซึ่งยากยิ่งในการโปรแกรมด้วยมือคน (ลองนึกถึงโปรแกรมหุ่นยนต์ไต่เส้น แค่นั้นยังต้องปรับกันแทบสิ้นชีวา) หุ่นยนต์ตัวนี้ถูกตั้งโปรแกรมการเดินแบบง่าย ๆ เอาไว้ (แน่นอนว่าเดินช้า) แต่ว่าผู้ทดลองให้หุ่นยนต์เรียนรู้วิธีการเดินให้เร็วด้วย Reinforcement Learning หลังจากการทดลองเดินไปเดินมา 1,000 รอบ หุ่นยนต์ก็เดินได้สวยงามและรวดเร็วขึ้นและดูเป็นธรรมชาติอย่างมาก
หากจะออกแบบระบบ Reinforcement Learning ดังที่ได้เสนออาจจะต้องมีข้อกำหนดังนี้คือ
- สถานะ เป็นองศาของแต่ละข้อต่อ (ขาหน้า ขาหลัง)
- การกระทำ ก็คือการเลื่อนข้อต่อแต่ละข้อไป X องศา (หมุนมอเตอร์)
- รางวัล คือ ความเร็วในการเดิน
แล้วเร่ิมต้นการฝึกด้วยระบบที่มีวิธีการเดินโง่ ๆ อยู่แล้ว สุดท้าย Reinforcement Learning ก็จะหาวิธีการเดิน หรือ นโยบายการหมุนข้อต่อ (Policy) ที่ทำให้ได้ รวงวัลรวมคาดหวังสูงสุด
อีกตัวอย่างหนึ่งต้นฉบับจากที่เดียวกัน เป็นตัวอย่างการใช้ Reinforcement Learning ในการ ฝึกให้หุ่นยนต์คลาน (Crawler) ซึ่งไม่รู้ด้วยซ้ำว่าต้องเคลื่อนข้อต่ออย่างไรให้สามารถคลานไปข้างหน้าได้
ซึ่งการตั้งค่าระบบก็จะคล้าย ๆ กับตัวอย่างด้านบน ดังภาพต่อไปนี้
สิ่งที่น่าสนใจอีกอย่างนึงคือ โปรแกรมที่ว่าเรียนรู้ในการคลานได้นั้น ไม่ใช่โปรแกรม “จำเพาะ” เพราะในทางทฤษฎีโปรแกรมนี้สามารถใช้กับอะไรก็ได้ที่มีสถานะ มีการกระทำ มีรางวัล และต้องการนโยบายที่ดีที่สุด เพราะว่าตัวโปรแกรมเองไม่รู้ด้วยซ้ำว่ามันทำอะไร มันรู้แค่ว่ามีสถานะ มีการกระทำ มีรางวัลก็แค่หาวิธีเปลี่ยนสถานะให้ได้รางวัลเยอะ ๆ แค่นั้น
แพ้จะฟังดูดีมากแต่ก็เป็นจริงเพียงทางทฤษฎีเท่านั้น เนื่องจากในทางปฏิบัติปัญหาที่น่าสนใจมักจะมีจำนวนสถานะและการกระทำจำนวนมากจะต้องหาวิธีลดสิ่งเหล่านี้ลง ซึ่งการลดหรือการพยายามเพิ่มประสิทธิภาพนี้มีความจำเพาะของแต่ละปัญหาอยู่
จะค้นหา หรือจะกอบโกย ? (Exploration vs. Exploitation)
จากวิดีโอที่สองจะเห็นว่าในช่วงครึ่งแรกของวิดีโอหุ่นยนต์คลานนั้นแทบจะคลานเชิงสุ่ม กล่าวคือไม่เอาไหนนั่นเอง แต่พอท้าย ๆ ของวิดีโอโดยเฉพาะหลังจากที่ผู้เสนอคลิ๊กปลุ่มอัศจรรย์นั่นหลาย ๆ ครั้งก็จะเห็นว่าหุ่นยนต์เดินได้เป็นธรรมชาติขึ้นอย่างมาก
ที่เป็นเช่นนั้นก็เพราะในช่วงแรกของการฝึกฝนนั้นเนื่องจากประสบการณ์ของหุ่นยนต์ยังมีน้อย ยังไม่ทราบวิธีการเดินดี ๆ หรอก ผู้พัฒนาจึงพยายามให้หุ่นยนต์เดินอย่างสุ่ม กล่าวคือการค้นหาวิธีที่ดีกว่าที่เคยรู้ และพอเรียนรู้ได้มากพอระดับหนึ่งเราก็จะพยายามบอกให้หุ่นยนต์เริ่มทำการกอบโกยได้แล้ว ก็คือลดความสุ่มลง หุ่นยนต์ก็จะพยายามเคลื่อนที่ตามนโยบายที่ดีที่สุดเท่าที่มันมีอยู่ แต่การกอบโกยอย่างเดียวก็คือการไม่ค้นหาสิ่งใหม่ สิ่งที่หุ่นยนต์ทำได้ก็จะไม่ดีไปกว่านั้นหากเราไม่ให้มันค้นหา นี่จึงเป็นที่มาของคำว่า จะค้นหา หรือจะกอบโกย ?
เปรียบเหมือนชีวิตมหาลัยของเรา แรกเริ่มที่เราเข้ามาที่มหาลัยเราก็ยังไม่รู้ว่าร้านไหนอร่อย สิ่งที่เราทำก็คือการพยายามลองกินหลาย ๆ ร้าน อาจจะร้านละหลาย ๆ ครั้งด้วยเพื่อความแน่ใจ แล้วพอเราอยู่ไปซักพักเราก็จะเริ่มมีร้านประจำเป็นของตัวเองที่เราคิดว่าแน่ที่สุด อร่อยที่สุด … แต่เมื่อมีร้านใหม่มาเปิด หากเราไม่ค้นหาต่อไป แน่นอนว่าเราก็จะได้ความอร่อยเท่ากับเราเคยได้รับ แต่เราจะไม่ได้มากกว่านั้น หากเราต้องการมากกว่านั้นก็ต้องเสียเวลาไปลองร้านใหม่ ๆ บ้างเผื่อว่ามันจะดีจนดีกว่าร้านโปรดของเราในปัจจุบัน
Keywords
- MDP — Markov Decision Process
- Temporal Difference
- Q-Learning
- Epsilon greedy
- Exploration function