- Published on
Hiểu sâu về Q-Learning (Phần 2 - Monte Carlo)
- Authors
- Name
- SnowyField
- @SnowyField1906
Q-Learning là một thuật toán Reinforcement Learning (Học Tăng cường). Tuy không dùng đến Neural Network (Mạng Nơ-ron) nhưng thuật toán này vẫn có thể giải quyết được rất nhiều bài toán trong thực tế.
Loạt bài viết này sẽ giúp chúng ta hiểu sâu về Q-Learning cùng với cách xây dựng và triển khai hai thuật toán quan trọng là Adaptive Dynamic Programming (Quy hoạch Động Thích ứng) và Monte Carlo (Mô phỏng Monte Carlo).
Khuyến nghị đọc trước Phần 1 để sẵn sàng trước khi đi vào bài viết này.
Nhắc lại
Chúng ta đã biết cách hoạt động và các khái niệm quan trọng của Markov Decision Process trong series trước. Tuy nhiên đây chỉ là một công cụ dùng để khái quát hoá bài toán Reinforcement Learning (Học Tăng cường). Thực tế, Agent thường không có khả năng biết được các thông tin quan trọng như Reward hay Transition Model.
Để hiểu đơn giản, MDP là một bài toán giúp Agent lập kế hoạch, vì lúc này Agent đã biết được các thông tin quan trọng. Trong khi đó Q-Learning bao gồm cả quá trình học để có được các thông tin này.
Q-Learning (Học Q) là một thuật toán giúp Agent có thể học được các thông tin này thông qua việc thử nhiều lần và rút ra kinh nghiệm. Để có thể triển khai được thuật toán này, chúng ta sẽ cần tìm hiểu qua hai thuật toán quan trọng là Adaptive Dynamic Programming (Quy hoạch Động Thích ứng) và Monte Carlo (Mô phỏng Monte Carlo).
Khái niệm
Giống với ADP, Monte Carlo cũng là một thuật toán giúp Agent có thể học được các thông tin quan trọng thông qua việc thử nhiều lần và rút ra kinh nghiệm. Tuy nhiên thuật toán này sẽ không cần dùng đến Reward và Transition Model như ADP.
Do đó, ta gọi Monte Carlo là một thuật toán Model-free (Không dựa trên Model), trong khi ADP là thuật toán Model-based (Dựa trên Model).
Nguồn gốc cái tên Monte Carlo
Monte Carlo thực chất là một phương pháp được sử dụng rất nhiều trong thống kê để ước tính giá trị của một hàm số thông qua việc lấy các sample (mẫu) ngẫu nhiên lặp đi lặp lại nhiều lần.
Một ví dụ điển hình để hình dung về thuật toán Monte Carlo là việc ước tính giá trị (pi) thông qua việc tạo ra các điểm ngẫu nhiên trong một hình vuông và đếm số điểm nằm trong một hình tròn nằm trong hình vuông đó:
Cho đường tròn nội tiếp hình vuông . Giả sử chúng ta tạo ra điểm ngẫu nhiên trong hình vuông này. Khi đó, ta sẽ theo dõi số điểm nằm trong hình tròn theo thuật toán sau:
Ta có:
Khi đó ta có thể xấp xỉ giá trị thông qua việc đếm số điểm nằm trong hình tròn và hình vuông.
Xây dựng Monte Carlo
Như ta đã biết, MDP và ADP là các thuật toán xác định Policy bằng cách ước tính Value của mỗi State. Để làm được điều này, chúng ta sẽ cần tới Reward và Transition Model. Vì vậy để bỏ đi hai yếu tố này, chúng ta sẽ cần phải thiết lập một thành phần mới với mục đích tương tự. Và thành phần (rất) quan trọng này chính là Q-Value (Giá trị Q), thứ sẽ ảnh hưởng đến các bài toán Reinforcement Learning (Học Tăng cường) sau này.
Phần này giả sử người đọc đã nắm được các kí hiệu và ví dụ ở series Hiểu sâu về Markov Decision Process.
Xây dựng Q-Value
Hãy để ý rằng, Reward nhận State làm đầu vào và Transition Model nhận cặp State-Action làm đầu vào. Và cuối cùng sử dụng chúng để xác định .
Tuy nhiên chúng ta có thể gộp cả 2 thành phần này lại với nhau thành một thành phần gọi là . Thành phần này sẽ nhận cặp State-Action làm đầu vào và trả về một giá trị thể hiện mức độ "tốt" của cặp này hệt như chức năng của Value nhưng đơn giản hơn.
Hãy sử dụng lại công thức tính Value (theo Value Iteration):
Vì và có tính chất như nhau nên:
Giờ đây, chỉ cần ước tính được thì chúng ta có thể chọn ra được Action tốt nhất cho State mà không cần phải xử lí qua Reward và Transition Model.
Tương tự như trên, với công thức tính Policy (theo Policy Iteration):
Ta có thể cung cấp thêm Reward và Discount Factor vào công thức trên:
Một lần nữa, Policy có thể được xác định dựa trên duy nhất mà không cần phải xử lí qua Reward và Transition Model.
Tuy nhiên Q-Value không được tính bằng công thức đó mà sẽ dùng phương pháp Monte Carlo để ước tính.
Monte Carlo
Cho một Episode bắt đầu từ State và kết thúc tại State với một chuỗi các Action và Reward như sau:
Tại State , ta thực hiện Action và nhận được Reward và State . Tiếp tục thực hiện Action , ta sẽ nhận được Reward và State . Và cứ tiếp tục như vậy cho đến khi đạt đến State .
Ta sẽ định nghĩa lại là Cucumlative Reward của một Episode bắt đầu từ State và Action (bỏ qua Random Rate):
Ví dụ, ta có một Episode như sau:
First-visit
Chúng ta không cần quan tâm Episode này bắt đầu từ State nào, miễn là trong đó có cặp State-Action cần tính (ví dụ ). Ta sẽ ngầm giả sử Episode bắt đầu tại đây và tính Cucumlative Reward bắt đầu từ cặp State-Action này trở đi.
Vì là First-visit nên trong một Episode, Cucumlative Reward chỉ được tính một lần duy nhất cho mỗi cặp State-Action.
Every-visit
Tuy nhiên Every-visit không giống vậy, ta sẽ tính Cucumlative Reward cho mỗi lần xuất hiện của cặp State-Action trong một Episode. Với ví dụ trên, ta sẽ có:
Tuy nhiên, bài viết này sẽ chỉ tập trung vào First-visit.
C-Table và Q-Table
Ta sẽ thực hiện việc tính Cuclumative Reward cho mọi cặp State-Action xuất hiện trong một Episode và lưu lại vào một bảng gọi là C-Table (Bảng C).
Ví dụ với Episode như trên, ta sẽ có:
Khi đó, cho một C-Table sẽ có dạng như sau:
Tuy nhiên đây chỉ là Episode , chúng ta cần nhiều hơn thế nữa để lấp đầy tất cả cặp State-Action. Vì vậy, chúng ta sẽ thực hiện việc này Episode và sau đó lấy trung bình của các C-Table này. Đây chính là Q-Table (Bảng Q).
Công thức trên khá khó để có thể cập nhật lại Q-Table sau mỗi Episode vì chúng ta phải tính tổng toàn bộ C-Table từ đầu, hơn nữa, chúng ta sẽ không lưu lại các C-Table trước đó.
Vì vậy, chúng ta sẽ biến đổi một chút để có thể cập nhật Q-Table bằng Q-Table hiện tại và C-Table tính được:
Thuật toán
Chúng ta đã qua hết những thứ cần thiết để xây dựng thuật toán. Các bước thực hiện của thuật toán Monte Carlo giống với ADP, đều gồm 3 bước dưới đây:
Actute
Đây là bước Agent lựa chọn Action để thực hiện dựa trên State hiện tại và Policy .
Bước này không có thay đổi gì với ADP. Cũng dựa vào một hệ số phân rã để quyết định xem Agent sẽ thực hiện Exploration hay Exploitation. Nếu là Exploration thì Agent sẽ lựa chọn Action ngẫu nhiên, ngược lại sẽ lựa chọn Action tốt nhất, chính là từ Policy .
Percept
Đây là bước cung cấp cho Agent những thông tin cần thiết. Bao gồm State hiện tại , Action đã chọn ở bước Actuate, State mới và Reward đã nhận được.
Q-Table sẽ được cập nhật dựa trên thông tin này bằng những công thức đã xây dựng ở trên.
Thuật toán này có nghĩa là một khi cặp State-Action đã xuất hiện trong Episode hiện tại, Cumulative Reward của nó sẽ phải được cập nhật với mỗi Reward mới được thêm vào.
Policy Improvement
Với ADP, chúng ta có Reward và Transition Model nên có thể dùng một trong các thuật toán MDP để thực hiện Policy Improvement. Tuy nhiên với Monte Carlo, chúng ta sẽ phải xây dựng một thuật toán mới để thực hiện việc này.
Sau mỗi Episode, chúng ta sẽ khởi tạo lại và , chỉ giữ lại và để phục vụ Monte Carlo.
Kết luận
Lấy ví dụ từ series trước, sau khi chạy thuật toán với 100 Episode, chúng ta có tổng Reward nhận được như sau:
Còn đây là tỉ lệ thắng qua mỗi Episode:
Cuối cùng là Policy tính được:
Đây là input từ ADP và MDP, có thể thấy nó không hiệu quả lắm và Policy cũng không hợp lí. Bởi vì không như ADP hay MDP, Monte Carlo rất phụ thuộc vào Reward và nó ảnh hưởng trực tiếp đến Policy. Do đó, chúng ta hãy thử với bộ Reward mới:
Policy thu được đã khả quan hơn rất nhiều:
Triển khai code Python
Toàn bộ code có thể xem chi tiết tại: snowyfield1906/ai-general-research/reinforcement_learning.
Thuật toán chính
Xem tại MCLearning.py.
Khởi tạo
def __init__(self, n_states, blackbox_move):
self.n_states = n_states
self.transition_threshold = T.TRANSITION_THRESHOLD
self.policy = np.random.randint(A.LEN, size=n_states)
self.q_table = np.ones((n_states, A.LEN))
self.c_table = np.zeros((n_states, A.LEN))
self.visited = np.zeros((n_states, A.LEN))
self.count_table = np.zeros((n_states, A.LEN))
self.blackbox_move = blackbox_move
Percept và Actuate
- Percept:
def percept(self, state, action, reward):
if self.visited[state, action] == 0:
self.visited[state, action] = 1
visited = self.visited == 1
self.c_table[visited] += reward
- Actuate:
def actuate(self, next_state):
if np.random.uniform() <= self.transition_threshold:
return np.random.randint(A.LEN)
else:
return self.policy[next_state]
Evaluation và Improvement
- Evaluation:
def one_evaluation(self, state):
while True:
action = self.actuate(state)
next_state, reward = self.blackbox_move(state, action)
self.percept(state, action, reward)
reward_game += reward
if reward in T.TERMINAL:
break
else:
state = next_state
- Improvement:
def policy_improvement(self):
visited = self.visited == 1
self.count_table[visited] += 1
self.q_table[visited] += (self.c_table[visited] - self.q_table[visited]) / self.count_table[visited]
for state in range(self.n_states):
self.policy[state] = np.argmax(self.q_table[state])
self.c_table = np.zeros((self.n_states, A.LEN))
self.visited = np.zeros((self.n_states, A.LEN))
self.transition_threshold *= T.DECAY_FACTOR
Thuật toán Monte Carlo
def train(self, start_state):
for i in range(T.EVALUATION_LIMIT):
self.one_evaluation(start_state)
self.policy_improvement()
Các hàm phụ trợ
Xem tại Visualizer.py.
Kiểm thử
Xem tại test-MCLearning.py.
✿
Nhắc lại
✿
Khái niệm
◎
Nguồn gốc cái tên Monte Carlo
✿
Xây dựng Monte Carlo
◎
Xây dựng Q-Value
◎
Monte Carlo
▣
First-visit
▣
Every-visit
▣
C-Table và Q-Table
◎
Thuật toán
▣
Actute
▣
Percept
▣
Policy Improvement
◎
Kết luận
✿
Triển khai code Python
◎
Thuật toán chính
▣
Khởi tạo
▣
Percept và Actuate
▣
Evaluation và Improvement
▣
Thuật toán Monte Carlo
◎
Các hàm phụ trợ
◎
Kiểm thử