DQN: Deep Learning สามารถเล่นเกม Atari เอาชนะมนุษย์ 29 เกม โดยใช้ Model เหมือนเดิมได้อย่างไร [Part…


TLDR: ผมแนะนำให้อ่านแบบเต็มดีกว่า

เมื่อประมาณปี 2015 บริษัท DeepMind ที่โด่งดังในฐานะเป็นผู้สร้าง AlphaGo อันโด่งดัง ได้เปิดเผยงานตีพิมพ์ฉบับหนึ่งโดยมีหัวข้อว่า “Human-level control through deep reinforcement learning”

ความน่าสนใจของงานตีพิมพ์ฉบับนี้คือ เป็นงานที่นำเสนอวิธีแบบใหม่ที่ทำให้ Deep Learning สามารถเรียนรู้วิธีที่จะเล่นเกม Atari ที่แตกต่างกันหลายๆเกมได้ ซึ่งตัวตัวงานนี้ได้ทำการทดสอบทั้งหมด 49 เกม และมี 29 เกมที่สามารถเอาชนะมนุษย์ได้

โดยที่ทั้ง 49 เกมนั้น ใช้ Model เหมือนกันทุกอย่างทุกประการ

รูปประกอบจาก https://flic.kr/p/5uwgbr

ตัวงานวิจัยได้เสนอเทคนิคผสมผสานระหว่าง Deep Neural Network กับ Reinforcement Learning โดยมีชื่อว่า Deep Q-Network หรือ DQN

โดยตัว DQN เองนั้น สามารถที่จะเข้าใจข้อมูลรูปภาพ โดยเป็นข้อมูลในระดับ Pixel คือไม่ต้องใช้ข้อมูลอย่างอื่นประกอบ (เช่นตำแหน่งของผู้เล่น ตำแหน่งของศัตรู ความเร็วของรถ หรือแม้กระทั่งกติกาของเกม) ซึ่ง DQN จะใช้พลังของ Deep Neural Network มาช่วยในการแปลงข้อมูลของรูปภาพมาช่วยตัดสินใจในการเล่น

ความน่าสนใจของ DQN คือเทคนิคตัวนี้สามารถใช้ในงานทั่วๆไปได้ เพราะไม่มีข้อจำกัดด้าน Input เลย (ใช้ภาพจากเกมไหนก็ได้) โดยที่ตัวงานวิจัยเองก็ทดลองสร้าง Model Deep Learning ที่มี Architecture เหมือนๆกันและ Hyperparameters เหมือนกัน แล้วนำไป Train บนเกม Atari ทั้ง 49 เกม ปรากฏว่าตัว DQN สามารถเอาชนะมนุษย์ได้มากถึง 29 เกม

สามารถข้ามเนื้อหาเทคนิค และหลักการทำงานของ DQN ทั้งหมด ข้ามไปอ่าน Result ใน Section สุดท้ายได้เลยครับ


Reinforcement Learning

ก่อนที่เราจะไปพูดถึงเจ้าตัว DQN นั้น คอนเซ็ปพื้นฐานที่สำคัญมากก่อนจจะมาเป็น DQN นั้นก็คือ Reinforcement Learning ครับ

Reinforcement Learning

โดยหลักแล้วตัวละครที่เกี่ยวข้องกับ Reinforcement Learning จะมีไม่กี่ตัวและคำศัพท์ไม่มากเท่าไหร่ เริ่มแรกคือ Environment ที่เปรียบเสมือนกับโลกบางอย่างที่มีกติกา มีกฏ หรือมีเงื่อนไขอยู่ข้างใน จะเปรียบเป็นเกมใน Atari ต่างๆทั้ง 49 เกม 49 Environments ก็ได้

แล้วก็จะมี Agent ซึ่งถ้าเรา Environment เป็นเกมตั้งต้นแล้ว Agent มักจะเป็นผู้เล่น ซึ่งจะเป็นมนุษย์​ เป็นโปรแกรม ที่สามารถมีการโต้ตอบกับ Environment ได้ โดยรูปแบบของการโต้ตอบจะเป็นในรูปของ Action คือการที่ Agent กระทำบางอย่างบน Environment เช่น เลื่อนตัวละคร การทำให้ตัวละครกระโดด การใช้สกิล หรือการวางหมาก การเลือกไพ่ ที่อยู่ภายใต้กฏและกติกาของ Environment นั้นเป็น Action ทั้งหมด

สุดท้ายก็คือตัว State กับ Reward สำหรับตัว State นั้นจะเปรียบเสมือนเป็นสถานะปัจจุบันของ Environment หรือสถานะก่อนๆหน้ารวมกัน State จะเปรียบเสมือน Information บางอย่างที่ทำให้เรารู้ว่าปัจจุบันนี้เกมของเราเป็นอย่างไรบ้าง หน้าตาเป็นอย่างไร เลือดของตัวละครเหลือเท่าไหร่ จำนวนชีวิต ตอนนี้เราอยู่ด่านไหน ซึ่งจะเป็นข้อมูลที่เป็นประโยชน์ต่อ Agent ในการเลือก Action ต่อไป

Reward คือผลลัพธ์หรือมูลค่าที่ได้จากการโต้ตอบกับ Environment โดยทั่วไปแล้ว Reward จะคิดง่ายๆจาก Progress ที่เรากำลังเล่นเกม ยกตัวอย่างเช่นถ้าเราชนะก็ได้ Reward +1 หรือแพ้ก็ -1 เป็นต้น

Reinforcement Learning with 49 Atari Games

ในงานตีพิมพ์ชิ้นนี้ เขาได้นำเทคนิค DQN มาประยุกต์กับเกม Atari ทั้งหมด 49 เกมจึงตั้งเงื่อนไขบางอย่างที่ทำให้ตัว DQN ใช้กับทุกๆเกมได้ เช่น

  1. ตัว State จะเป็น Pixel จากรูปภาพล้วนๆ ดังนั้นข้อมูลที่นำประมวลนั้นมีแค่รูปภาพอย่างเดียว ไม่มีข้อมูลอื่น เช่น เลือดของตัวละคร ตำแหน่งของตัวละคร
  2. Reward เนื่องจากแต่ละเกมต่างมี Reward ที่ไม่เหมือนกันเลย เขาก็ได้ตัด Reward เป็น 3 แบบคือ +1 สำหรับ Reward ที่เป็นบวกทั้งหมด -1 สำหรับ Reward ที่เป็นลบ และ 0 เหมือนเดิม
  3. Action จะเหมือนเดิม ไม่มีเปลี่ยนไปในแต่ละเกม แต่ตัว Model จะเปลี่ยนนิดหน่อย (ตัวโมเดลจะเป็น Convolutional Neural Network ที่แก้ Layer สุดท้ายให้ Output ตามจำนวน Actions ซึ่งจะอธิบายต่อไปภายหลัง)
  4. Agent ทุกตัวใช้ Convolutional Neural Network ทุกตัวใช้ Architecture เหมือนกันหมด (ยกเว้น Layer สุดท้าย) แล้วนำไป Train ในเกมต่างๆ 49 เกม

Q (Action Value)

ตัว Q หรือชื่อเต็มๆว่า State-Action Value หรือ Action Value นั้น อาจจะเห็นผ่านตาบ้างใน Q-learning โดยที่ Q นั้นเปรียบเสมือน Function ทางคณิตศาสตร์ตัวหนึ่งที่ใช้ในการคำนวณ​ Discounted Reward โดยกำหนด (s,a) เป็น Input ของ Function

แต่ก่อนจะไปจะถึงตัว Q นั้น สิ่งแรกที่จะต้องเข้าใจก่อนคือ Discounted Reward

Discounted Reward

ปกติแล้วเวลาเราเล่นเกมเกมหนึ่งนั้น แต่ละเกมก็จะมีภาพหลายๆภาพเปลี่ยนแปลงไปในทุกๆมิลลิวินาที หรือที่เรียกกันว่า Frame ที่แตกต่างกันออกไปมหาศาล ปกติแล้วในแต่ละ Frame จะประกอบด้วย State ที่เปลี่ยนไปทุกครั้งที่ Frame เปลี่ยนไป Action ที่อาจจะมีบ้างในบางครั้ง แต่บางครั้งการที่เราไม่ใช้ Action อะไรเลยก็อาจจะเป็น Action รูปแบบหนึ่งหรือ No-action

ซึ่งจะทำให้มี Action, No-action เกิดขึ้นทุกๆ State และมี Feedback Loop กลับมาตามภาพ Reinforcement Learning ที่อธิบายไปด้านบน

จึงทำให้มี Reward เกิดขึ้นออกมาทุกครั้งที่มีการเปลี่ยนแปลงของ State หรือ Frame

แต่ Reward ที่ได้มานั้นเป็น Reward ที่เกิดขึ้น ณ จุดปัจจุบันหรือจุดใดๆจุดหนึ่งของเกม เช่น มาริโอ้กระโดดไปถึงธงเส้นชัย +1 มาริโอ้ตกหลุมเหว -1 แต่ก่อนที่เราจะไปถึงธงหรือหลุมเหวนั้น ค่ากลายเป็น 0 ตลอด

จะเป็นไปได้ไหมที่จะมีตัวเลข ตัวเลขหนึ่งที่ทำหน้าที่คล้ายๆ Reward (แต่ไม่ใช่ Reward) เพื่อมาบอกว่าตอนนี้เราใกล้ถึงธงแล้วนะ เรามีโอกาสจะได้ Reward +1 ในอนาคตแต่ปัจจุบันนี้ยังไม่ได้ แต่ใกล้จะได้แล้วในอนาคตนะ หรือ ในอนาคตเรามีโอกาสจะตกหลุม เราอาจจะได้ Reward -1 เพียงแต่ตอนนี้เรายังไม่ถึงจุดนั้น แค่ใกล้จะเอื้อมถึงแล้ว

Summation Rewards

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

แต่ว่าพอไปใช้ในการคำนวณแล้ว ค่า Summation ตัวนี้ยังมีปัญหาบางอย่างตรงที่

  1. บางครั้งค่า Reward ตอนจบเกม มันไกลจากปัจจุบันมาก ซึ่งเรายังไม่สนใจค่า Reward ในตอนนั้น
  2. เราต้องการสนใจปัจจุบันให้ค่า Reward ปัจจุบันสำคัญกว่า Reward ในอนาคต
  3. สำหรับเกมที่ไม่มีวันจบ สมการนี้จะคำนวณไปจนถึงเวลาเป็น Infinity เลย

สมการจึงเปลี่ยนแปลงนิดหน่อยโดยได้เพิ่ม Discount Factor เข้ามาในสมการ (Gamma)

Discounted Reward

โดยปกติแล้วตัว Discount Factor จะมีค่าที่ 0 – 1 ซึ่งถ้าเป็น 1 ก็จะเหมือนกับสมการด้านบนที่ไม่คิด Discount Factor ซึ่งมักจะกำหนดใกล้เคียง 1 แทน

ซึ่งตัว Discounted Reward จะมาใช้ควบคู่กับ Q อีกที ในการคำนวณว่า Reward ปัจจุบันบวกไปเรื่อยๆผ่าน Discount Factor จนถึงอนาคต จะมีผลรวมออกมาเป็นเท่าไหร่ ซึ่งสามารถบอกเราได้ระดับหนึ่งว่าสถานะการณ์ปัจจุบันของเราเป็นอย่างไรบ้าง

เช่นถ้า Discounted Reward เป็น +0.95 แต่ Reward ปัจจุบันเป็น 0 แสดงว่าในอนาคตเรามีโอกาสได้ Reward +1 (Discount Factor อาจจะเป็น 0.95) หมายถึงเราจะเจอเรื่องดีๆในอนาคต แต่ถ้า Discounted Reward เป็น -0.95 แต่ Reward ปัจจุบันเป็น 0 แสดงว่าเรามีโอกาสแพ้ในอนาคต

ตัว Discounted Reward จึงสามารถบ่งบอกถึงสถานะปัจจุบันของเราได้ระดับหนึ่ง

Q-value

ภาพจาก Paper https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf

Q คือ Function ทางคณิตศาสตร์ตัวหนึ่ง ที่พยายามจะคำนวณค่า Discounted Reward จาก (s,a) โดยที่ s คือ State ใดๆและ a คือ Action ใดๆ

ถ้าเอามาอธิบายเป็นภาษาง่ายๆก็คือ Q เหมือนเป็นเครื่องคำนวณตัวหนึ่ง ที่เราสามารถป้อนหน้าตาของเกมจากด่านไหนก็ได้ เรากำลังเล่นถึงตรงไหนของเกมก็ได้ หรือจะมองเป็นหมากรุก ที่เป็น Combination ต่างๆที่หมากวางบนกระดาน ซึ่งนั่นคือ State ใดๆก็ได้ และเราป้อนข้อมูลอีกตัวคือ Action เช่น เรากำลังกระโดด เราขยับม้าไปที่ตำแหน่งด้านบน หรือเราอยู่เฉยๆ ซึ่งหมายถึง Action ใดๆก็ได้

นำ State กับ Action มาประกอบกัน ใส่ลงไปในเครื่องคำนวณ​ชื่อว่า Q แล้ว Q ก็จะตอบเรากลับมาว่า ถ้าเราใส่ State กับ Action นั้น Discounted Reward จะเป็นเท่าไหร่ ซึ่งตัว Discounted Reward สามารถบอกสถานะการในอนาคตได้ว่า State, Action ปัจจุบันดีหรือแย่อย่างไร

Choosing Action

สมมุติว่าคุณสร้างเกมมา และคุณมี Q-value ครบสำหรับทุก State และ Action ถ้าคุณต้องการจะเล่นเกมให้ชนะ คุณต้องเล่นเกมให้ได้ Reward สูงที่สุด ตอนนี้คุณอยู่ที่ State เริ่มเกม คุณต้องเลือก Action อย่างชาญฉลาดเพื่อให้ได้ Reward สูงสุด ซึ่งคุณจะต้องเลือก Action ที่ทำให้เกิด Discounted Reward ที่สูงที่สุด เนื่องจากไม่สามารถตัดใจจาก Reward เพราะยังเป็น 0 อยู่

Q-value จึงมาเป็นตัวเลือกสำคัญในการเลือก Action เพราะ Q สามารถคำนวณ​ Discounted Reward ได้จาก State ที่ให้ไปกับ Action ที่ให้

Action Selection

สำหรับสมการด้านบนนี้หมายถึง เราต้องการจะเลือก Action (a) ที่ดีที่สุด โดยการเปรียบเทียบระหว่าง Q(s,a’) ทุกๆอัน โดยที่ a’ เป็น Action ทั้งหมดที่เป็นไปได้ที่จะใช้ใน State s

สรุปได้คร่าวๆคือเลือก Action a ที่มีค่า Q สูงสุดๆในทุกๆ Action ที่เป็นไปได้

ซึ่งหลังจากได้ Action a มาแล้ว เราก็ใช้ Action นั้นจนเกิดเป็น State อันใหม่ชื่อ S’ แล้วเราก็ใช้กฏนี้ต่อไปเรื่อยๆ จนสิ้นสุดเกมก็จะได้ค่า Reward ที่ใกล้เคียงค่าที่สูงที่สุด

ทุกๆครั้งที่เลือกค่า Q สูงสุดจะนำไปสู่ Reward ที่สูงต่อไปเรื่อยๆ ดังนั้นการเลือก Action ที่ทำให้ได้ค่า Q ที่สูงที่สุดนำไปสู่ Reward ที่สูงที่สุดด้วย

Q-value จึงเป็นกุญแจสำคัญมากๆในการจะทำให้เกมคุณแพ้หรือชนะได้เลย


DQN: Introduction

Neural Network

DQN นั้นย่อมาจาก Deep Q-Network หากท่านเดาว่ามันคือการนำ Neural Network มาประมาณค่า Q ท่านก็มาถูกทางแล้วครับ เราจะทบทวนอย่างคร่าวๆเกี่ยวกับตัว Neural Network กันก่อน

บทความนี้จะตัดเนื้อหา Neural Network ออกไป เพื่อลดความยาวของบทความ หากต้องการทำความเข้าใจตั้งแต่พื้นฐานแบบรวบรัด สามารถอ่านเพิ่มเติมได้ที่ 
AlphaGo Zero ตัวใหม่: เหนือกว่าทุกตัวก่อนหน้า โดยไม่ใช่ข้อมูลจากมนุษย์แม้แต่นิดเดียว (Section แรก)

ขั้นที่หนึ่ง: Feed-forward

ตัว Neural Network โดยทั่วไปจะประกอบไปด้วย Input Layer ที่รับข้อมูล Input เข้ามาในตัว Neural Network แล้วก็จะผ่านการคูณ การยกกำลังต่างๆ ในทางคณิตศาสตร์ต่างๆ โดยจะมี Hidden Layer ที่มี Node ต่างๆอยู่ข้างในที่เชื่อมกับ Input เพื่อคำนวณตัวเลขเหล่านี้

Node แต่ละ Node ก็จะมีส่วนเชื่อมระหว่าง Layer แต่ละ Layer ไว้อยู่ ซึ่งเส้นเหล่านี้คือ Weight ที่เป็นตัวเพิ่มสเกลหรือลดสเกลของ Data ในแต่ละ Node ก่อนหน้า ก่อนจะทำมารวมกันแล้วผ่าน Activation Function

แล้ว Data ก็จะถูกเปลี่ยนไปเรื่อยๆจนไปสิ้นสุดในส่วนที่เป็น Output Layer ซึ่งผลลัพธ์ที่ออกมานั้นจะเป็น Predicted Output คือ Output ที่ Neural Network ได้พ่นออกมาหลังจากใส่ Input เข้าไป

ดังนั้นหน้าที่ของ Neural Network คือ รับ Input เข้ามาที่ Input Layer แล้วไปปู้ยี้ปู้ยำใน Hidden Layer ก่อนจะออกมาเป็น Predicted Output ใน Output Layer

แต่ Predicted Output ในตอนที่เริ่ม Train แรกๆนั้น ตัว Neural Network ยังไม่ฉลาดเท่าไหร่ เนื่องจาก Weight ยังไม่ถูกต้องพอที่จะทำให้ใส่ Input ไปแล้วพ่น Output ตามที่ต้องการได้

กระบวนการทั้งหมดที่ใส่ Input ผ่าน Weight ต่างๆและออกมาเป็น Output คือ Feed-forward

ขั้นที่สอง: Loss Function

จึงต้องมีกระบวนการความผิดพลาดระหว่าง Output ที่พ่นออกมากับ Output จริงๆ ซึ่งก็คือ Predicted Output กับ Actual Output โดยเราจะหาความผิดพลาดทั้ง 2 ค่าผ่าน Loss Function ได้ออกมาเป็น Error เลขตัวเดียวที่บอกว่า Predicted Output กับ Actual Output คลาดเคลื่อนไปเท่าไหร่

ขั้นที่สาม: Backpropagation

ตัวเลข Error นี้จะถูกส่งผ่านเข้าไปใน Neural Network อีกครั้ง แต่จะเป็นกระบวนการย้อนกลับ เพื่อไปปรับ Weight ใน Neural Network ให้ทำนายได้ถูกต้องแม่นยำขึ้น จาก Error ที่ส่งกลับไป โดยใช้กระบวนการทางคณิตศาสตร์​ Differentiate เพื่อให้ปรับ Weight เพื่อให้ได้ Error ที่น้อยลงไปเรื่อยๆ หรือที่เรียกว่า Backpropagation

ขั้นที่ 1,2,3 ซ้ำไปเรื่อยๆ: Training

กระบวนการ Train คือการทำในตัว Neural Network เรียนรู้จาก Data แล้วค่อยๆปรับ Weight จน Neural Network สามารถทำนาย Output ได้ใกล้เคียง Actual Output มากๆ หรือ Error ที่ต่ำมาก

โดยกระบวนการนี้จะนำ Data เยอะๆ (Input, Actual Output) หลากหลายรูปแบบป้อนลงไปกระบวนการทั้ง 3 แล้วตัว Model ก็จะฉลาดขึ้นเรื่อยๆ จนฉลาดมากในที่สุด

Q-learning

ชื่อนี้ตรงไปตรงมาเลยครับ เป็นการเรียนรู้คำนวณค่า Q จาก Environment ที่เรามี โดย Environment อาจจะเป็นเกม Atari กระดานหมากฮอสหรือกระดานหมากรุกก็ได้

ซึ่งเริ่มต้นแล้วค่า Q จะเป็น 0 (หรืออาจจะเป็นอย่างอื่นก็ได้ แต่ขอยกตัวอย่างเป็น 0 ไปก่อน) กำหนดเป็น 0 ทั้งหมดไม่ว่าจะเป็น (state, action) ใดๆ ซึ่งตัวแปรสำคัญที่จะมาช่วยให้ค่า Q เปลี่ยนแปลงนั้นคือตัว Reward เอง ที่จะส่งผลต่อ Discounted Reward และค่า Q ด้วย

ดังนั้นหนึ่งในขั้นตอนสำคัญที่จะทำให้ค่า Q มีการเรียนรู้คือ เราจำเป็นจะต้องป้อนข้อมูล State, Action, Reward เข้าไปเยอะๆจนทำให้ Q มีความแม่นยำมากๆจนสามารถนำค่า Q ตัวนี้ไปใช้เล่นเกมได้จริง

กระบวนการคร่าวๆของ Q-learning คือ ตอนแรก Q จะเป็น 0 แล้วพอรับข้อมูล State, Action, Reward เข้ามา Q ก็จะปรับค่าให้สอดคล้องกับข้อมูลเหล่านั้น โดยคำนวณ Discounted Reward อย่างเสร็จสรรพ แต่ในกระบวนการคำนวณจะมีการนำค่า Q ก่อนหน้า (คือตอนที่เป็น 0) มาใช้ร่วมด้วย ก่อนจะอัพเดทให้ค่า Q ปัจจุบัน

สมมุติว่าผ่านการอัพเดทไป 1 ครั้ง ค่า Q(state_x, action_y) = 1 ต่อไปก็จะนำ Q ตัวเดิมที่มีค่าเป็นเลข 1 นี้มาคำนวณต่อ แล้วค่าจะเปลี่ยนแปลงไปเรื่อยๆ

แต่จะเปลี่ยนแปลงอย่างมีนัยยะจนไปถึงจุดสมดุลจุดหนึ่ง จึงค่อยหยุดอัพเดท

Q-learning

สมการอาจจะดูน่ากลัวเล็กน้อย มาลองเริ่มแกะทีละส่วนจาก

จะเห็นว่าหลายตัวแปรที่เราคุ้นเคยมาแล้ว เช่น r_t ที่เป็น Reward ที่เกิดขึ้นจาก state_t และ action_t ใดๆ (จะพูดถึง state_t กับ action_t ต่อไป) ที่ห้อย t หมายถึงเวลาใดเวลาหนึ่งหรือมองเป็น Frame ใดๆของเกมก็ได้

ตัวถัดมาคือ discount factor ที่คุ้นเคยมาจาก Discounted Reward ซึ่งคือตัวเดียวกันเลยครับ

สุดท้ายก็เป็นพจน์​ max Q(s_{t+1}, a) ตัวนี้ก็จะคล้ายๆกับสมการในกล่าวไปตอน Choosing Action แต่แทนที่จะเลือก Action จะเลือก Q ที่สูงที่สุดแทน สังเกตุจะเห็นว่ามี t+1 ห้อยเล็กๆต่อท้าย นั่นคือไม่ใช่ Q-value ของ state ปัจจุบัน แต่เป็น Q-value ของ state ถัดไป

เมื่อนำทั้ง 3 องค์ประกอบมารวมกัน จะหมายถึงการนำ Reward ของ state ปัจจุบัน ไปบวกกับค่า Q ที่สูงที่สุดของ state ถัดไปโดยปรับค่าคูณกับ Discount Factor

จะเห็นว่าการคำนวณเหมือนกับ Discounted Reward อย่างมาก เราจะมองพจน์ทั้งก้อนนี้เป็น Discounted Reward เลยก็ได้

แต่เป็น Discounted Reward ที่ยังไม่สมบูรณ์นัก เนื่องจากมีพจน์​ max Q(s_{t+1}, a) ที่เปลี่ยนไปจากสมการ Discounted Reward ซึ่งสมการนี้จุดที่แตกต่างอย่างชัดเจนคือเราจะสมมุติไปก่อนว่า Q(s_{t+1}, a) คือค่าที่ Optimal ที่สุดแล้ว

ซึ่งในเริ่มแรก Q(s_{t+1}, a) ยังไม่ใช่ค่าที่ Optimal เพราะอาจจะเป็นเลข 0 ซึ่งเป็นค่าเริ่มต้น แต่เมื่ออัพเดทไปเรื่อยๆค่า Q จะเข้าสู่จุดสมดุล ณ จุดใดจุดหนึ่ง ทำให้ค่า Q สมเหตุสมผลมากขึ้น

ตัวสมการนี้แรกๆอาจจะงงหน่อยนะครับ แต่ถ้าเห็นภาพรวมอาจจะเข้าใจมากขึ้น

สำหรับตัวสมการนี้จะเป็นการอัพเดทค่า Q(s_t, a_t) ซึ่ง s_t, a_t คือ state_t, action_t ใดๆที่ Frame ที่ t

สมการจะมี 2 ส่วนคือ (1-a) ที่เป็นส่วนปรับน้ำหนักของค่า Q อันเก่า (จะเห็นว่า Q ด้านซ้ายมือสุดกับตัวที่คูณ (1-a) เหมือนกันเลย) เพื่อจะได้แบ่งน้ำหนักส่วนหนึ่งให้กับส่วนที่ 2

สำหรับส่วนที่ 2 ที่คูณด้วย a นั้น เราจะเปรียบเสมือน a เป็น learning rate ที่ปรับค่า Q(s_t, a_t) เก่าไปเรื่อยๆโดยค่อยๆเพิ่มค่าส่วนที่เป็น optimal discounted rewards ที่คำนวณเสร็จแล้วใน section ด้านบนมาคูณกับ a แล้วค่อยอัพเดทลงใน Q(s_t, a_t)

ถอยกลับมาสมการเดิมอีกครั้ง จะเห็นว่าสมการมีความสมเหตุสมผลมากขึ้น

โดยหลักๆสมการนี้พยายามสมมุติว่า Q(s_{t+1}, a) คือค่าที่ optimal แล้ว แล้วนำมาคำนวณคู่กับ Discount factor และ Reward ก่อให้กลุ่มพจน์นี้คือ optimal Discounted value

จากนั้น Q(s_t, a_t) พยายามปรับตัวเองให้ค่าใกล้เคียง Optimal discounted value มากที่สุดเท่าที่จะทำได้ โดยการนำค่า Optimal discounted value มาทรอดแทรกทีละนิดผ่าน learning rate

เมื่ออัพเดทอย่างนี้ไปเรื่อยๆ ค่าทั้งหมดจะอยู่ในจุดสมดุลที่จุดๆหนึ่ง ที่ Q(s_t, a_t) ทั้งสมการสอดคล้องกันหมด และ Q คือค่าที่ optimal จริงๆ จึงสิ้นเสร็จกระบวนการ Q-learning


DQN: Inside

DQN Loss Function

จะเห็นว่าเราได้พูดถึง (Deep) Neural Network กับ Q-learning ไปเรียบร้อยแล้ว มาถึงเจ้าฮีโร่ตัวเอก DQN ที่เราจะได้พูดถึงสักที

สำหรับตัว DQN นั้น เขาได้ประยุกต์เทคนิคของ Q-learning มาใช้ควบคู่กับกระบวนการ Train ใน Neural Network ทำให้เราสามารถนำ 2 สิ่งมหัศจรรย์นี้มาใช้ร่วมกันได้

หัวใจหลักๆของ DQN มี2 ตัวครับ

  1. เราจะตัว Q ไม่ใช่เพียงแค่ Function ทางคณิตศาสตร์อีกต่อไป แต่เราจะมองว่า Q คือ Neural Network ที่รับ Input เป็น State, Action และ Output ออกมาเป็นค่า Q-value
  2. Loss Function ที่ผมแปะด้านบน

ในกระบวนการ DQN นั้น เราจำเป็นต้องเก็บข้อมูล (state_t, action_t, reward_t, state_{t+1}) ไปก่อน state_t คือ state ใดๆ ณ เวลาที่ t และ state_{t+1} คือ state ถัดไป หรือจะเขียนสั้นๆอีกแบบได้เป็น (s, a, r, s’) มีความหมายอย่างเดียวกัน

แล้วเราจะนำข้อมูลเหล่านี้ไป Train ลงใน Q ที่เป็น Neural Network (ต่อไปจะเรียกว่า Q-network) โดยการป้อนข้อมูลทั้ง 4 ตัวนี้ลงไป แล้ว Q-network ก็จะมีการปรับค่าโดยคำนวณ​ Error จาก Loss Function ที่เป็นผลต่างระหว่าง Predicted Output กับ Actual Output

หลังจากนั้นก็นำ Error ตรงนี้ Backpropagation กลับไปยัง Q-network

ซึ่งส่วนที่เป็น Loss Function จะนำหลักการของ Q-learning มาประยุกต์ด้วย ซึ่งโดย concept แล้วคล้ายคลึงกันมา

เราจะมาลองเริ่มแกะ Loss Function ทีละส่วน

สมการนี้คุ้นหน้าคุ้นตามาก มันคือการคำนวณ​ Optimal Discounted Rewards เหมือนใน Q-learning ทุกประการ โดยที่สมมุติว่า Q นั้น Optimal อยู่แล้ว

หลังจากนั้นเราก็นำ Optimal discounted reward มาหาผลต่างจาก Q(s,a) ตัวดั้งเดิมแล้วยกกำลัง 2 (Square Error) ก็จะได้ค่า Error ออกมา แล้วนำค่า Error นี้ไป Backpropagation ใน Q-network ต่อ

เสร็จละครับสำหรับตัว DQN หลักการนั้นตรงไปตรงมามาก และเป็นเทคนิคที่สวยมากที่นำ Q-learning มาใช้ร่วมกับ Neural Network ได้

Q-learning vs DQN

หลายคนอาจจะเห็นว่าบางครั้งเราไม่จำเป็นต้องใช้ DQN เลย ใช้ Q-learning ก็สมบูรณ์ในตัวแล้ว

แต่จะมีบางกรณีที่ DQN ได้เปรียบมาก

ที่เห็นได้ชัดที่สุดคือ state ของ DQN สามารถมีได้อย่างไม่จำกัด ให้ Neural Network จัดการ state ที่มากมายมหาศาลและแปลงเป็น Q-value ได้เลย โดยไม่สนใจว่า state จะเป็นอย่างไร

ด้วยข้อได้เปรียบตรงนี้ ทำให้ state สามารถเป็นอะไรก็ได้ และมีหลากหลายรูปแบบมาก ดังนั้นการจะให้ state เป็น pixel รูปภาพของเกมจึงไม่ใช่ปัญหาอะไรเลยแม้แต่น้อย แต่ในขณะที่ Q-learning นั้น state จะต้องมีอย่างจำกัด ทำให้ Q-learning เสียเปรียบในตรงนี้มาก

และเนื่องจาก state เราไม่สนใจว่าเป็นรูปแบบใดๆเลย ดังนั้น Q-network จึงสามารถจัดการ state ต่างๆได้อย่างชาญฉลาดมาก จึงเป็นเหตุผลว่าทำไม DQN ถึงใช้ Model เดียวในการเล่นเกม 49 เกมได้อย่างไม่มีปัญหา

Result

DQN Performances

เมื่อนำ DQN มาทดลองกับเกม Atari ทั้ง 49 เกม แล้วเทียบ Reward ของมนุษย์โดยเฉลี่ยกับ DQN

จะเห็นได้ว่าสำหรับอันดับ 1 นั้น DQN ได้คะแนนสูงกว่ามนุษย์ถึง 2539% ในเกม Pinball! แม้กระทั่ง Boxing และ Breakout ที่ทำคะแนนได้เกิน 1000% เมื่อแข่งกับมนุษย์ และมี 29 เกมที่สามารถเอาชนะมนุษย์ได้

ความน่าสนใจเมื่อเรามาลองวิเคราะห์ลักษณะการเล่นเกม Breakout ที่เล่นโดย DQN นั้น จะพบบางอย่างที่เหลือเชื่อที่ตัว DQN สามารถค้นหารูปแบบบางอย่างเจอที่มนุษย์ไม่เจอ

  • เริ่มแรกตัวโปรแกรมยังไม่ฉลาดมาก ยังไม่เข้าใจด้วยซ้ำว่ากติกาของเกมเป็นอย่างไร อะไรคือศัตรู อะไรคือกระดานของเรา แล้วต้องเล่นอย่างไร
  • แต่พอผ่านไปได้สักพักตัวโปรแกรมก็เข้าใจว่า เราจะต้องตีลูกบอลโต้ตอบกลับไปมาเพื่อให้ได้คะแนน แล้วเข้าใจว่าถ้าลูกตกลงมาเราจะแพ้
  • เมื่อผ่านไป 600 episodes โปรแกรมพยายามจะทำลายกำแพงที่ขอบด้านซ้ายและขอบด้านขวา ทำให้ลูกเข้าไปอยู่ในเขตด้านบนทำให้ลูกบอลกระเด้งกระดอนที่ขอบกำแพงด้านบนโดยที่เราแทบไม่ต้องทำอะไร

นับว่าเหลือเชื่อมากที่ DQN สามารถฉลาดได้ระดับนี้ จึงนับว่าเป็นก้าวสำคัญของ Reinforcement Learning ที่ Deepmind ได้สร้างปรากฏการณ์ครั้งยิ่งใหญ่นี้

จุดอ่อน

DQN ไม่ได้เก่งกาจทุกๆเกมเสมอไป ถ้าลองดูที่งานตีพิมพ์แล้วจะเห็นว่ามีเกมอยู่ 1 เกมที่ DQN ไม่ได้คะแนนเลย เกมนั้นชื่อว่า Montezuma’s Revenge

สาเหตุนั่นก็เพราะว่า ตัวเกมมีเงื่อนไขในตัวเกมมากมายเต็มไปหมด เราจะต้องถามกฏแบบ 1–2–3 ถึงจะผ่านด่านและได้คะแนนได้ ต้องเก็บกุญแจเพื่อเปิดประตู หลบสิ่งกีดขวางและฉากมากมายเต็มไปหมดที่ DQN ไม่สามารถเข้าใจได้ว่าวัตถุแต่ละอันคืออะไร

ซึ่งความซับซ้อนระดับนี้มนุษย์นั้นยังได้เปรียบอยู่ ซึ่งตอนนี้ก็กำลังพัฒนากันอยู่เพื่อปรับปรุงให้ Reinforcement Learning มีเทคนิคที่ฉลาดขึ้นเรื่อยๆ


สำหรับใน Part II ต่อไปนั้นจะมีการอธิบายเทคนิคบางอย่างที่ผมยังอธิบายไม่ครบถ้วน ซึ่งจะขอยกไป Part ต่อไปเพื่อลดความยาวของเนื้อหา

  • Experience Replay ที่ถูกพัฒนาใน DQN
  • Q-network เมื่อนำไปโค้ดจริงๆนั้น ปกติเขาไม่นิยม (state, action) เป็น Input แต่จะให้ state เป็น Input ตัวเดียวและ Output ออกมาเป็น Q-value ตามจำนวน Action
  • ใน Part II จะมี source code อย่างคร่าวๆของ Q-learning

ผิดพลาดประการใดขออภัยด้วยนะครับ สามารถคอมเม้นท์ ชี้แจง แก้ไขเพิ่มเติมได้เลยครับ

Credit

View at Medium.com