Giải thích q-learning trong học – tăng – cường (reinforcement learning)

Giới thiệu

Một trong những thuật toán yêu thích mà tôi đã được học khi tham gia khóa học tăng cường (reinforcement learning) là q-learning. Lý do có lẽ là do nó khá dễ hiểu và có thể coding được. Bài viết này sẽ thảo luận về q-learning và thuật toán đằng sau nó.

q-learning là gì?

Q-learning là một thuật toán học-tăng-cường off policy ( off policy reinforcement learning algorithm - *** bài viết có khá nhiều thuật ngữ chuyên ngành, mình sẽ ưu tiên dùng tiếng Anh để giữ đúng ý tưởng nguyên bản của các thuật ngữ này, tránh bị hiểu sai đi khi dịch qua tiếng Việt. Chẳng hạn từ off policy có liên quan đến thuật toán tối ưu Markov, nếu dịch sang tiếng việt thì không có từ nào ngắn gọn mà có ý nghĩa tương đương cả). Nó được gọi là off policy vì thuật toán q learning học từ các hành động được thực hiện ngẫu nhiên, tức là không có trước một policy (*** policy hiểu theo thuật toán Markov thì có thể dịch là chính sách hoặc chiến lược) nào cả. Cụ thể, q-learning học để tìm ra được một chiến lược (policy) có thể tối đa hoá được tổng phần thưởng (maximizes the total reward).

Q có nghĩa là gì?

Chữ Q đại diện cho chất lượng (Quality). Chất lượng trong trường hợp này là sự biểu thị của độ tốt của việc thực hiện một hành động (action) tới việc làm tăng phần thưởng trong dài hạn.

Tạo một bảng q (q – table)

Để thực hiện thuật toán q-learning, việc đầu tiên ta cần làm là tạo một bảng q (q - table). Q- table là một ma trận có chiều là [trạng thái, hành động] ([state, action]). Chúng ta khởi tạo giá trị 0 cho ma trận này. Sau đó, chúng ta cập nhật và lưu trữ các giá trị q vào q-table sau từng tập (episode - bao gồm tất cả các trạng thái được tính từ lúc tác nhân - agent (trong thuật toán Markov) bắt đầu học cho đến khi agent gặp điểm terminate). Bảng q này trở thành bảng tham chiếu để tác nhân (agent) chọn hành động tốt nhất  (best action) dựa trên giá trị q (q value).

###
import numpy as np
# Initialize q-table values to 0
Q = np.zeros((state_size, action_size))
###

 

Q-learning và thực hiện cập nhập

Bước tiếp theo chỉ đơn giản là để tác nhân tương tác với môi trường và cập nhật các cặp hành động - trạng thái trong bảng q của chúng ta Q [trạng thái, hành động].

Thực hiện hành động: thăm dò (explore) hay khai thác (exploit)

Một tác nhân tương tác với môi trường (environment) theo 1 trong 2 cách. Đầu tiên là sử dụng q-table làm tham chiếu và xem tất cả các hành động có thể xảy ra cho một trạng thái nhất định. Sau đó, tác nhân sẽ chọn hành động dựa trên giá trị tối đa của những hành động đó. Đây được gọi là khai thác (exploit) vì chúng ta sử dụng thông tin có sẵn để đưa ra một quyết định (make a decision).

Cách thứ hai để hành động là hành động ngẫu nhiên. Đây được gọi là thăm dò (explore). Thay vì chọn các hành động dựa trên phần thưởng tối đa trong tương lai, chúng ta chọn một hành động một cách ngẫu nhiên. Hành động ngẫu nhiên rất quan trọng vì nó cho phép tác nhân thăm dò và khám phá các trạng thái mới mà không được chọn trong quá trình khai thác. Bạn có thể cân bằng việc thăm dò / khai thác bằng cách sử dụng epsilon  \epsilon và đặt giá trị của tần suất thăm dò/khai thác. Đoạn code thô dưới đây minh hoạ cho cách dùng này.

###
import random
# Set the percent you want to explore
epsilon = 0.2
if random.uniform(0, 1) < epsilon:
    """
    Explore: select a random action
    """
else:
    """
    Exploit: select the action with max value (future reward)
    """
###
Cập nhập q-table

Các cập nhật xảy ra sau mỗi bước hoặc hành động và kết thúc khi một tập (episode) được hoàn thành. Kết thúc trong trường hợp này có nghĩa là tác nhân (agent) đã tới được một số điểm cuối (terminate). Trạng thái cuối (terminate state) có thể là bất kỳ điều gì như truy cập trang thanh toán, đến cuối trò chơi, hoàn thành một số mục tiêu mong muốn, v.v. Tác nhân sẽ không học được nhiều chỉ sau một tập, nhưng với đủ sự khám phá (qua nhiều bước (steps) và tập (episode)) nó sẽ hội tụ và tìm được các giá trị q tối ưu hay còn gọi là q-sao (Q_{\ast}).

Dưới đây là 3 bước cập nhập cơ bản:

  1. Tác nhân bắt đầu ở một trạng thái (s1) và thực hiện một hành động (a1) và nhận được một phần thưởng là (r1)
  2. Tác nhận lựa chọn một hành động có giá trị phần thưởng lớn nhất tham chiếu từ Q-table hoặc thực hiện một hành động ngẫu nhiên (epsilon, \epsilon)
  3. Cập nhập giá trị q

Đoạn code ở dưới trình bày cho việc cập nhập này:

# Update q values

Q[state, action] = Q[state, action] + lr * (reward + gamma * np.max(Q[new_state, :]) — Q[state, action])

Trong đoạn code ở trên, có một số biến mà chúng ta chưa đề cập đến. Cái chúng ta đang làm là điều chỉnh giá trị q dựa trên sự khác biệt giữa giá trị mới được chiết khấu (discounted new values) và giá trị cũ (old values). Chúng ta chiết khấu các giá trị mới bằng gamma và điều chỉnh kích thước bước bằng cách sử dụng tỷ lệ học (lr - learning rate). Dưới đây là một số giải thích.

Tỉ lệ học (learning rate) lr: còn được gọi là alpha hay \alpha, có thể đơn giản được định nghĩa là mức độ bạn chấp nhận giá trị mới so với giá trị cũ. Ở trên, chúng ta đang lấy sự khác biệt giữa mới và cũ và sau đó nhân giá trị đó với tỷ lệ học. Giá trị này sau đó được thêm vào giá trị q trước đó của chúng ta, về cơ bản sẽ đưa nó theo hướng cập nhật mới nhất.

Gamma: gamma hoặc \gamma là hệ số chiết khấu. Nó được sử dụng để cân bằng phần thưởng trước mắt và trong tương lai (hay trong dài hạn). Từ quy tắc cập nhật ở trên, có thể thấy rằng chúng ta đang áp dụng chiết khấu cho phần thưởng trong tương lai. Thông thường, giá trị này có thể nằm trong khoảng từ 0,8 đến 0,99.

Phần thưởng: reward là giá trị nhận được sau khi hoàn thành một hành động nhất định tại một trạng thái nhất định. Phần thưởng có thể xảy ra ở bất kỳ bước nào (time steps) hoặc chỉ ở bước thời cuối cùng (terminate step).

Max: np.max () sử dụng thư viện numpy để lấy giá trị cực đại của phần thưởng trong tương lai và áp dụng cho phần thưởng ở trạng thái hiện tại. Điều này tác động đến hành động hiện tại bằng phần thưởng có thể có trong tương lai. Đây là vẻ đẹp của q-learning. Chúng ta sẽ phân bổ phần thưởng tương lai cho các hành động hiện tại để giúp tác nhân chọn hành động mang lại lợi nhuận cao nhất ở bất kỳ trạng thái nhất định nào.

Kết luận

Vậy là xong, ngắn gọn và (hy vọng) ngọt ngào. Chúng ta đã thảo luận rằng q-learning là một thuật toán học-tăng-cường off policy. Chúng ta đã đi qua các quy tắc cập nhật cơ bản cho q-learning bằng cách sử dụng một số cú pháp python cơ bản và xem xét các đầu vào bắt buộc cho thuật toán. Chúng ta biết rằng q-learning sử dụng các phần thưởng trong tương lai để tác động đến hành động hiện tại với một trạng thái cho trước và do đó giúp tác nhân chọn các hành động tốt nhất để tối đa hóa tổng phần thưởng.

Các bạn có thể tham khảo bài viết gốc tại đây. Học-tăng-cường (reinforcement learning) là một nhánh rất khó (và hot) của machine learning, nên bài viết sẽ không đặc biệt dễ hiểu (đặc biệt là các thuật ngữ chuyên ngành). Hy vọng bài viết có thể giúp ích được cho các bạn.

Happy learning!

 

About Author

Chia sẻ bài viết

Leave a Comment

Your email address will not be published. Required fields are marked *