การเรียนรู้แบบเสริมกำลัง: value iteration และ Q-learning ใน Python
ในการเรียนรู้แบบเสริมกำลัง เอเจนต์จะลงมือทำในสภาพแวดล้อมและได้รับรางวัล มันเรียนรู้ว่าแต่ละสถานะหรือการกระทำดีแค่ไหน เพื่อเลือกการกระทำที่ให้รางวัลมากที่สุดในระยะยาว
แนวคิดแบบเข้าใจง่าย
ในการเรียนรู้แบบเสริมกำลัง เอเจนต์จะลงมือทำในสภาพแวดล้อมและได้รับรางวัล มันเรียนรู้ว่าแต่ละสถานะหรือการกระทำดีแค่ไหน เพื่อเลือกการกระทำที่ให้รางวัลมากที่สุดในระยะยาว
สอนเอเจนต์ให้ไปถึงเป้าหมาย: คำนวณค่าของแต่ละสถานะด้วย value iteration แล้วเรียนรู้ค่าเหล่านั้นจากการลองผิดลองถูกด้วย Q-learning
ประเด็นสำคัญ
- ตัวลดทอน γ ทำให้รางวัลที่มาเร็วกว่ามีค่ามากกว่า
- value iteration ต้องมีแบบจำลองของสภาพแวดล้อม ส่วน Q-learning เรียนรู้จากประสบการณ์
- Q(s, a) คือรางวัลรวมที่คาดว่าจะได้เมื่อทำการกระทำ a ในสถานะ s
- ต้องมีการสำรวจ (ในที่นี้คือการเดินสุ่ม 20%) เพื่อให้เอเจนต์ค้นพบเป้าหมาย
ควรใช้เมื่อใด?
- เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
- เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
- เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์
ลองดูการทำงานจริง
กด เล่น ด้านซ้ายเพื่อกระจายค่าจากเป้าหมายไปทั่วตาราง ด้านขวาดูเอเจนต์เรียนรู้เส้นทางเดียวกันด้วยการลองผิดลองถูก
โค้ดตัวอย่าง
import random
# A corridor of 5 cells: start in cell 0, reward +10 for reaching cell 4.
N, GOAL, GAMMA = 5, 4, 0.9
# Value iteration: a cell is worth its reward plus the discounted best neighbour.
values = [0.0] * N
for _ in range(50):
values = [0.0 if s == GOAL else max((10 if n == GOAL else 0) + GAMMA * values[n]
for n in (max(0, s - 1), min(N - 1, s + 1))) for s in range(N)]
print("state values:", [round(v, 2) for v in values])
# Q-learning learns the same thing from trial and error.
random.seed(0)
Q = [[0.0, 0.0] for _ in range(N)] # actions: 0 = left, 1 = right
for episode in range(200):
s = 0
while s != GOAL:
a = random.randrange(2) if random.random() < 0.2 else Q[s].index(max(Q[s]))
n = max(0, s - 1) if a == 0 else min(N - 1, s + 1)
reward = 10 if n == GOAL else 0
target = reward + (0 if n == GOAL else GAMMA * max(Q[n]))
Q[s][a] += 0.5 * (target - Q[s][a]) # move the estimate toward the target
s = n
print("best action per cell:", ["right" if q[1] >= q[0] else "left" for q in Q[:GOAL]])
print("Q(0, right):", round(Q[0][1], 2))
ผลลัพธ์ที่คาดหวัง
state values: [7.29, 8.1, 9.0, 10.0, 0.0]
best action per cell: ['right', 'right', 'right', 'right']
Q(0, right): 7.29
หลักการทำงาน
value iteration ทำการอัปเดตแบบ Bellman ซ้ำ ๆ โดยค่าของช่องหนึ่งคือรางวัลที่ดีที่สุดบวกค่าที่ถูกลดทอนของช่องถัดไป จึงได้ 10, 9, 8.1 และ 7.29 เมื่ออยู่ห่างเป้าหมายออกไป ส่วน Q-learning ไม่รู้กติกา หลังทุกก้าวมันจะขยับค่าประมาณเข้าหา reward + γ·max Q(next) และเรียนรู้ว่าควรไปทางขวาเสมอ
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัด
ลองเปลี่ยน input และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น
- เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
- พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
- แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- Value iteration คำนวณว่าแต่ละสถานะของกระบวนการตัดสินใจแบบมาร์คอฟมีค่าแค่ไหน โดยใช้การอัปเดตความเหมาะสมที่สุดของเบลล์แมนซ้ำ ๆ ปานกลาง
- การอัปเดต Q-learning ใช้การอัปเดต Q-learning กับลำดับประสบการณ์ และดูรางวัลไหลย้อนกลับไปยังสถานะก่อนหน้า ปานกลาง