You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/vi/8-Reinforcement/1-QLearning/README.md

256 lines
19 KiB

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "911efd5e595089000cb3c16fce1beab8",
"translation_date": "2025-09-05T20:13:42+00:00",
"source_file": "8-Reinforcement/1-QLearning/README.md",
"language_code": "vi"
}
-->
# Giới thiệu về Học Tăng Cường và Q-Learning
![Tóm tắt về học tăng cường trong học máy qua sketchnote](../../../../sketchnotes/ml-reinforcement.png)
> Sketchnote bởi [Tomomi Imura](https://www.twitter.com/girlie_mac)
Học tăng cường liên quan đến ba khái niệm quan trọng: tác nhân, các trạng thái, và một tập hợp các hành động cho mỗi trạng thái. Bằng cách thực hiện một hành động trong một trạng thái cụ thể, tác nhân sẽ nhận được phần thưởng. Hãy tưởng tượng trò chơi điện tử Super Mario. Bạn là Mario, bạn đang ở một cấp độ trong trò chơi, đứng cạnh mép vực. Phía trên bạn là một đồng xu. Bạn là Mario, ở một cấp độ trò chơi, tại một vị trí cụ thể... đó là trạng thái của bạn. Di chuyển một bước sang phải (một hành động) sẽ khiến bạn rơi xuống vực, và điều đó sẽ cho bạn một điểm số thấp. Tuy nhiên, nhấn nút nhảy sẽ giúp bạn ghi điểm và bạn sẽ sống sót. Đó là một kết quả tích cực và điều đó sẽ thưởng cho bạn một điểm số cao.
Bằng cách sử dụng học tăng cường và một trình mô phỏng (trò chơi), bạn có thể học cách chơi trò chơi để tối đa hóa phần thưởng, đó là sống sót và ghi được càng nhiều điểm càng tốt.
[![Giới thiệu về Học Tăng Cường](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
> 🎥 Nhấn vào hình ảnh trên để nghe Dmitry thảo luận về Học Tăng Cường
## [Câu hỏi trước bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## Yêu cầu và Cài đặt
Trong bài học này, chúng ta sẽ thử nghiệm một số đoạn mã trong Python. Bạn cần có khả năng chạy mã Jupyter Notebook từ bài học này, trên máy tính của bạn hoặc trên đám mây.
Bạn có thể mở [notebook bài học](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) và đi qua bài học này để xây dựng.
> **Lưu ý:** Nếu bạn mở mã này từ đám mây, bạn cũng cần lấy tệp [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), được sử dụng trong mã notebook. Thêm nó vào cùng thư mục với notebook.
## Giới thiệu
Trong bài học này, chúng ta sẽ khám phá thế giới của **[Peter và con sói](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, lấy cảm hứng từ câu chuyện cổ tích âm nhạc của nhà soạn nhạc người Nga, [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Chúng ta sẽ sử dụng **Học Tăng Cường** để giúp Peter khám phá môi trường của mình, thu thập những quả táo ngon và tránh gặp con sói.
**Học Tăng Cường** (RL) là một kỹ thuật học cho phép chúng ta học hành vi tối ưu của một **tác nhân** trong một **môi trường** bằng cách thực hiện nhiều thử nghiệm. Một tác nhân trong môi trường này cần có một **mục tiêu**, được định nghĩa bởi một **hàm phần thưởng**.
## Môi trường
Để đơn giản, hãy xem thế giới của Peter là một bảng vuông có kích thước `width` x `height`, như sau:
![Môi trường của Peter](../../../../8-Reinforcement/1-QLearning/images/environment.png)
Mỗi ô trong bảng này có thể là:
* **mặt đất**, nơi Peter và các sinh vật khác có thể đi lại.
* **nước**, nơi bạn rõ ràng không thể đi lại.
* một **cây** hoặc **cỏ**, nơi bạn có thể nghỉ ngơi.
* một **quả táo**, thứ mà Peter sẽ rất vui khi tìm thấy để ăn.
* một **con sói**, thứ nguy hiểm và cần tránh.
Có một module Python riêng biệt, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), chứa mã để làm việc với môi trường này. Vì mã này không quan trọng để hiểu các khái niệm của chúng ta, chúng ta sẽ nhập module và sử dụng nó để tạo bảng mẫu (code block 1):
```python
from rlboard import *
width, height = 8,8
m = Board(width,height)
m.randomize(seed=13)
m.plot()
```
Mã này sẽ in ra hình ảnh của môi trường tương tự như hình trên.
## Hành động và chính sách
Trong ví dụ của chúng ta, mục tiêu của Peter là tìm được quả táo, đồng thời tránh con sói và các chướng ngại vật khác. Để làm điều này, anh ta có thể đi lại cho đến khi tìm thấy quả táo.
Do đó, tại bất kỳ vị trí nào, anh ta có thể chọn một trong các hành động sau: lên, xuống, trái và phải.
Chúng ta sẽ định nghĩa các hành động đó dưới dạng một từ điển và ánh xạ chúng tới các cặp thay đổi tọa độ tương ứng. Ví dụ, di chuyển sang phải (`R`) sẽ tương ứng với cặp `(1,0)`. (code block 2):
```python
actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
action_idx = { a : i for i,a in enumerate(actions.keys()) }
```
Tóm lại, chiến lược và mục tiêu của kịch bản này như sau:
- **Chiến lược**, của tác nhân (Peter) được định nghĩa bởi một cái gọi là **chính sách**. Chính sách là một hàm trả về hành động tại bất kỳ trạng thái nào. Trong trường hợp của chúng ta, trạng thái của vấn đề được biểu diễn bởi bảng, bao gồm vị trí hiện tại của người chơi.
- **Mục tiêu**, của học tăng cường là cuối cùng học được một chính sách tốt cho phép chúng ta giải quyết vấn đề một cách hiệu quả. Tuy nhiên, như một cơ sở, hãy xem xét chính sách đơn giản nhất gọi là **đi bộ ngẫu nhiên**.
## Đi bộ ngẫu nhiên
Hãy giải quyết vấn đề của chúng ta bằng cách triển khai chiến lược đi bộ ngẫu nhiên. Với đi bộ ngẫu nhiên, chúng ta sẽ chọn ngẫu nhiên hành động tiếp theo từ các hành động được phép, cho đến khi chúng ta đạt được quả táo (code block 3).
1. Triển khai đi bộ ngẫu nhiên với mã dưới đây:
```python
def random_policy(m):
return random.choice(list(actions))
def walk(m,policy,start_position=None):
n = 0 # number of steps
# set initial position
if start_position:
m.human = start_position
else:
m.random_start()
while True:
if m.at() == Board.Cell.apple:
return n # success!
if m.at() in [Board.Cell.wolf, Board.Cell.water]:
return -1 # eaten by wolf or drowned
while True:
a = actions[policy(m)]
new_pos = m.move_pos(m.human,a)
if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water:
m.move(a) # do the actual move
break
n+=1
walk(m,random_policy)
```
Lệnh gọi `walk` sẽ trả về độ dài của đường đi tương ứng, có thể thay đổi từ lần chạy này sang lần chạy khác.
1. Thực hiện thử nghiệm đi bộ một số lần (ví dụ, 100 lần), và in ra thống kê kết quả (code block 4):
```python
def print_statistics(policy):
s,w,n = 0,0,0
for _ in range(100):
z = walk(m,policy)
if z<0:
w+=1
else:
s += z
n += 1
print(f"Average path length = {s/n}, eaten by wolf: {w} times")
print_statistics(random_policy)
```
Lưu ý rng độ dài trung bình ca mt đường đi là khong 30-40 bước, khá nhiu, trong khi khong cách trung bình đến qu táo gn nht là khong 5-6 bước.
Bn cũng có th xem chuyn động ca Peter trong quá trình đi b ngu nhiên:
![Đi bộ ngẫu nhiên của Peter](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif)
## Hàm phần thưởng
Để làm cho chính sách ca chúng ta thông minh hơn, chúng ta cn hiu hành động nào "tt hơn" hành động khác. Để làm điu này, chúng ta cn định nghĩa mc tiêu ca mình.
Mc tiêu có th được định nghĩa dưới dng mt **hàm phần thưởng**, hàm này s tr v mt giá tr đim cho mi trng thái. S càng cao, hàm phn thưởng càng tt. (code block 5)
```python
move_reward = -0.1
goal_reward = 10
end_reward = -10
def reward(m,pos=None):
pos = pos or m.human
if not m.is_valid(pos):
return end_reward
x = m.at(pos)
if x==Board.Cell.water or x == Board.Cell.wolf:
return end_reward
if x==Board.Cell.apple:
return goal_reward
return move_reward
```
Mt điu thú v v các hàm phn thưởng là trong hu hết các trường hp, *chúng ta chỉ nhận được phần thưởng đáng kể vào cuối trò chơi*. Điu này có nghĩa là thut toán ca chúng ta cn phi nh các bước "tt" dn đến phn thưởng tích cc cui, và tăng tm quan trng ca chúng. Tương tự, tt c các bước dn đến kết qu xu cn b gim giá trị.
## Q-Learning
Thut toán mà chúng ta s tho lun đây được gi là **Q-Learning**. Trong thut toán này, chính sách được định nghĩa bi mt hàm (hoc cu trúc d liu) gi là **Q-Table**. Nó ghi li "mc độ tt" ca mi hành động trong mt trng thái nht định.
Nó được gi là Q-Table vì thường tin li để biu din nó dưới dng mt bng, hoc mng đa chiu. Vì bng ca chúng ta có kích thước `width` x `height`, chúng ta có th biu din Q-Table bng mt mng numpy vi hình dng `width` x `height` x `len(actions)`: (code block 6)
```python
Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
```
Lưu ý rng chúng ta khi to tt c các giá tr ca Q-Table vi mt giá tr bng nhau, trong trường hp ca chúng ta là 0.25. Điu này tương ng vi chính sách i b ngu nhiên", vì tt c các hành động trong mi trng thái đều tt như nhau. Chúng ta có th truyn Q-Table vào hàm `plot` để trc quan hóa bng trên bng: `m.plot(Q)`.
![Môi trường của Peter](../../../../8-Reinforcement/1-QLearning/images/env_init.png)
trung tâm ca mi ô có mt "mũi tên" ch hướng di chuyn ưu tiên. Vì tt c các hướng đều bng nhau, mt du chm được hin thị.
Bây gi chúng ta cn chy mô phng, khám phá môi trường ca mình, và hc mt phân phi giá tr Q-Table tt hơn, điu này s cho phép chúng ta tìm đường đến qu táo nhanh hơn nhiu.
## Bản chất của Q-Learning: Phương trình Bellman
Khi chúng ta bt đầu di chuyn, mi hành động s có mt phn thưởng tương ng, tc là chúng ta có th lý thuyết chn hành động tiếp theo da trên phn thưởng ngay lp tc cao nht. Tuy nhiên, trong hu hết các trng thái, hành động s không đạt được mc tiêu ca chúng ta là đến qu táo, và do đó chúng ta không th ngay lp tc quyết định hướng nào tt hơn.
> Hãy nhớ rằng điều quan trọng không phải là kết quả ngay lập tức, mà là kết quả cuối cùng, mà chúng ta sẽ đạt được vào cuối mô phỏng.
Để tính đến phn thưởng b trì hoãn này, chúng ta cn s dng các nguyên tc ca **[lập trình động](https://en.wikipedia.org/wiki/Dynamic_programming)**, cho phép chúng ta suy nghĩ v vn đề ca mình mt cách đệ quy.
Gi s chúng ta đang trng thái *s*, và chúng ta mun di chuyn đến trng thái tiếp theo *s'*. Bng cách làm như vy, chúng ta s nhn được phn thưởng ngay lp tc *r(s,a)*, được định nghĩa bi hàm phn thưởng, cng vi mt phn thưởng tương lai. Nếu chúng ta gi s rng Q-Table ca chúng ta phn ánh chính xác "s hp dn" ca mi hành động, thì ti trng thái *s'* chúng ta s chn mt hành động *a* tương ng vi giá tr ti đa ca *Q(s',a')*. Do đó, phn thưởng tương lai tt nht có th mà chúng ta có th nhn được ti trng thái *s* s được định nghĩa là `max`
## Kiểm tra chính sách
Vì Q-Table lit kê "mc độ hp dn" ca mi hành động ti mi trng thái, nên rt d s dng nó để xác định cách điu hướng hiu qu trong thế gii ca chúng ta. Trong trường hp đơn gin nht, chúng ta có th chn hành động tương ng vi giá tr Q-Table cao nht: (code block 9)
```python
def qpolicy_strict(m):
x,y = m.human
v = probs(Q[x,y])
a = list(actions)[np.argmax(v)]
return a
walk(m,qpolicy_strict)
```
> Nếu bạn thử đoạn mã trên nhiều lần, bạn có thể nhận thấy rằng đôi khi nó "bị treo", và bạn cần nhấn nút STOP trong notebook để dừng lại. Điều này xảy ra vì có thể có những tình huống khi hai trạng thái "chỉ" vào nhau về mặt giá trị Q tối ưu, dẫn đến việc agent di chuyển qua lại giữa các trạng thái đó vô thời hạn.
## 🚀Thử thách
> **Nhiệm vụ 1:** Sửa đổi hàm `walk` để giới hạn độ dài tối đa của đường đi bằng một số bước nhất định (ví dụ, 100), và xem đoạn mã trên trả về giá trị này theo thời gian.
> **Nhiệm vụ 2:** Sửa đổi hàm `walk` để không quay lại những nơi mà nó đã từng đi qua trước đó. Điều này sẽ ngăn `walk` lặp lại, tuy nhiên, agent vẫn có thể bị "mắc kẹt" ở một vị trí mà nó không thể thoát ra.
## Điều hướng
Mt chính sách điu hướng tt hơn s là chính sách mà chúng ta đã s dng trong quá trình hun luyn, kết hp gia khai thác và khám phá. Trong chính sách này, chúng ta s chn mi hành động vi mt xác sut nht định, t l thun vi các giá tr trong Q-Table. Chiến lược này vn có th dn đến vic agent quay li mt v trí mà nó đã khám phá, nhưng như bn có th thy t đon mã dưới đây, nó dn đến mt đường đi trung bình rt ngn đến v trí mong mun (hãy nh rng `print_statistics` chy mô phng 100 ln): (code block 10)
```python
def qpolicy(m):
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
return a
print_statistics(qpolicy)
```
Sau khi chy đon mã này, bn s nhn được độ dài đường đi trung bình nh hơn nhiu so vi trước, trong khong t 3-6.
## Khám phá quá trình học
Như chúng ta đã đề cp, quá trình hc là s cân bng gia vic khám phá và khai thác kiến thc đã thu được v cu trúc không gian vn đề. Chúng ta đã thy rng kết qu ca vic hc (kh năng giúp agent tìm đường ngn đến mc tiêu) đã được ci thin, nhưng cũng rt thú v khi quan sát cách độ dài đường đi trung bình thay đổi trong quá trình hc:
## Tóm tắt bài học:
- **Độ dài đường đi trung bình tăng lên**. Điu chúng ta thy đây là ban đầu, độ dài đường đi trung bình tăng lên. Điu này có th là do khi chúng ta chưa biết gì v môi trường, chúng ta có kh năng b mc kt các trng thái xu, như nước hoc sói. Khi chúng ta hc được nhiu hơn và bt đầu s dng kiến thc này, chúng ta có th khám phá môi trường lâu hơn, nhưng vn chưa biết rõ v trí ca nhng qu táo.
- **Độ dài đường đi gim khi hc được nhiu hơn**. Khi chúng ta hc đủ, vic đạt được mc tiêu tr nên d dàng hơn đối vi agent, và độ dài đường đi bt đầu gim. Tuy nhiên, chúng ta vn m rng khám phá, vì vy chúng ta thường đi lch khi đường đi tt nht và khám phá các la chn mi, làm cho đường đi dài hơn mc ti ưu.
- **Độ dài tăng đột ngt**. Điu chúng ta cũng quan sát được trên biu đồ này là ti mt s thi đim, độ dài tăng đột ngt. Điu này cho thy tính ngu nhiên ca quá trình, và rng chúng ta có th "làm hng" các h s Q-Table bng cách ghi đè chúng vi các giá tr mi. Điu này lý tưởng nên được gim thiu bng cách gim tc độ hc (ví dụ, v cui quá trình hun luyn, chúng ta ch điu chnh các giá tr Q-Table bng mt giá tr nhỏ).
Nhìn chung, điu quan trng cn nh là s thành công và cht lượng ca quá trình hc ph thuc đáng k vào các tham số, như tc độ hc, s gim tc độ hc, và h s chiết khu. Nhng tham s này thường được gi là **siêu tham số**, để phân bit vi **tham số**, mà chúng ta ti ưu trong quá trình hun luyn (ví dụ, các h s Q-Table). Quá trình tìm giá tr siêu tham s tt nht được gi là **tối ưu hóa siêu tham số**, và nó xng đáng là mt ch đề riêng.
## [Câu hỏi sau bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## Bài tập
[Một thế giới thực tế hơn](assignment.md)
---
**Tuyên bố miễn trừ trách nhiệm**:
Tài liu này đã được dch bng dch v dch thut AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mc dù chúng tôi c gng đảm bo độ chính xác, xin lưu ý rng các bn dch t động có th cha li hoc không chính xác. Tài liu gc bng ngôn ng bn địa nên được coi là ngun thông tin chính thc. Đối vi các thông tin quan trng, khuyến ngh s dng dch v dch thut chuyên nghip bi con người. Chúng tôi không chu trách nhim cho bt k s hiu lm hoc din gii sai nào phát sinh t vic s dng bn dch này.