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ụ
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ả.
- Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
- In các giá trị trung gian để theo dõi từng bước tính toán.
- Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
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.
- Lặp giá trị (Value Iteration) Tính giá trị của từng trạng thái trong một quá trình quyết định Markov bằng cách lặp lại phép cập nhật tối ưu Bellman. Trung bình
- Cập nhật Q-learning Áp dụng phép cập nhật Q-learning cho một chuỗi trải nghiệm và xem phần thưởng lan ngược về các trạng thái trước. Trung bình