Khái niệm AI với Python

Học tăng cường: value iteration và Q-learning trong Python

Trong học tăng cường, một tác tử hành động trong môi trường và nhận phần thưởng. Nó học xem mỗi trạng thái hoặc hành động tốt đến đâu để chọn những hành động mang lại nhiều phần thưởng nhất theo thời gian.

Khái niệm bằng lời đơn giản

Trong học tăng cường, một tác tử hành động trong môi trường và nhận phần thưởng. Nó học xem mỗi trạng thái hoặc hành động tốt đến đâu để chọn những hành động mang lại nhiều phần thưởng nhất theo thời gian.

Dạy một tác tử đi tới đích: tính giá trị trạng thái bằng value iteration, rồi học chúng qua thử và sai với Q-learning.

Ý chính

  • Hệ số chiết khấu γ làm phần thưởng đến sớm có giá trị hơn.
  • Value iteration cần mô hình của môi trường; Q-learning học từ kinh nghiệm.
  • Q(s, a) là tổng phần thưởng kỳ vọng khi thực hiện hành động a ở trạng thái s.
  • Cần khám phá (ở đây là 20% nước đi ngẫu nhiên) để tác tử phát hiện ra đích.

Khi nào nên sử dụng?

  • Hiểu điều gì diễn ra bên trong mạng nơ-ron và các thư viện AI.
  • Nắm ý tưởng trước khi tự cài đặt nó trong các thử thách tương ứng.
  • Chuẩn bị cho khóa học machine learning, phỏng vấn và dự án.

Xem trực quan

Nhấn Phát bên trái để lan giá trị từ đích ra khắp lưới. Bên phải, xem tác tử học cùng lộ trình đó qua thử và sai.

Code ví dụ

Chạy code →
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))

Kết quả dự kiến

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

Cách hoạt động

Value iteration lặp lại phép cập nhật Bellman, trong đó giá trị của một ô là phần thưởng tốt nhất cộng giá trị đã chiết khấu của ô kế tiếp; kết quả là 10, 9, 8.1 và 7.29 khi đi xa dần đích. Q-learning không biết luật chơi. Sau mỗi bước, nó dời ước lượng về phía reward + γ·max Q(next), và học được rằng luôn nên đi sang phải.

Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.

Bài tập mở rộng

Hãy sửa code theo các bài tập dưới đây để hiểu rõ cách hoạt động thay vì chỉ sao chép kết quả.

  1. Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
  2. In các giá trị trung gian để theo dõi từng bước tính toán.
  3. Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
Chạy trong Python IDE →

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách