แนวคิด AI ด้วย Python

การเรียนรู้แบบเสริมกำลัง: value iteration และ Q-learning ใน Python

ในการเรียนรู้แบบเสริมกำลัง เอเจนต์จะลงมือทำในสภาพแวดล้อมและได้รับรางวัล มันเรียนรู้ว่าแต่ละสถานะหรือการกระทำดีแค่ไหน เพื่อเลือกการกระทำที่ให้รางวัลมากที่สุดในระยะยาว

แนวคิดแบบเข้าใจง่าย

ในการเรียนรู้แบบเสริมกำลัง เอเจนต์จะลงมือทำในสภาพแวดล้อมและได้รับรางวัล มันเรียนรู้ว่าแต่ละสถานะหรือการกระทำดีแค่ไหน เพื่อเลือกการกระทำที่ให้รางวัลมากที่สุดในระยะยาว

สอนเอเจนต์ให้ไปถึงเป้าหมาย: คำนวณค่าของแต่ละสถานะด้วย value iteration แล้วเรียนรู้ค่าเหล่านั้นจากการลองผิดลองถูกด้วย Q-learning

ประเด็นสำคัญ

  • ตัวลดทอน γ ทำให้รางวัลที่มาเร็วกว่ามีค่ามากกว่า
  • value iteration ต้องมีแบบจำลองของสภาพแวดล้อม ส่วน Q-learning เรียนรู้จากประสบการณ์
  • Q(s, a) คือรางวัลรวมที่คาดว่าจะได้เมื่อทำการกระทำ a ในสถานะ s
  • ต้องมีการสำรวจ (ในที่นี้คือการเดินสุ่ม 20%) เพื่อให้เอเจนต์ค้นพบเป้าหมาย

ควรใช้เมื่อใด?

  • เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
  • เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
  • เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์

ลองดูการทำงานจริง

กด เล่น ด้านซ้ายเพื่อกระจายค่าจากเป้าหมายไปทั่วตาราง ด้านขวาดูเอเจนต์เรียนรู้เส้นทางเดียวกันด้วยการลองผิดลองถูก

โค้ดตัวอย่าง

รันโค้ด →
main.py
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 และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น

  1. เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
  2. พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
  3. แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
รันใน Python IDE →

ฝึกด้วยโจทย์

ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI

โจทย์ทั้งหมด