Back to Home

Reinforcement Learning - Học theo Chính Sách (Policy Gradient)

Review lại bài trước

Để bắt đầu bài viết này, chúng ta cần xem lại một số khái niệm cơ bản của Reinforcement Learning (RL) mà bạn đã làm quen ở bài trước.

Mô hình chuẩn của RL

Mọi bài toán RL, từ việc huấn luyện robot bước đi đến việc xây dựng một AI chơi cờ, đều dựa trên một mô hình tương tác vòng lặp không hồi kết:

  • Agent (Tác tử): Là "bộ não", thực thể đưa ra các quyết định dựa trên những gì nó quan sát được.

  • Environment (Môi trường): Là thế giới xung quanh Agent, phản hồi lại các hành động của nó.

  • State (sts_t): Trạng thái hiện tại của Agent trong môi trường tại thời điểm tt.

  • Action (ata_t): Hành động mà Agent thực hiện tại thời điểm tt.

  • Reward (rtr_t): Phần thưởng (hoặc hình phạt) mà Agent nhận được ngay sau khi thực hiện hành động ata_t và chuyển sang trạng thái mới st+1s_{t+1}.

Mục tiêu tối thượng của Agent không phải là ăn tối đa hóa rtr_t ngay lập tức, mà là tối đa hóa tổng phần thưởng tích lũy (total reward) trong suốt quá trình tương tác.

Hai hướng tiếp cận chính: Value-based vs. Policy-based

Có hai tư duy chủ đạo để giúp Agent đạt được mục tiêu tối thượng đó:

  • Value-based (Tiếp cận dựa trên giá trị): Ở lộ trình này, Agent cố gắng học giá trị (Value) của các trạng thái hoặc các cặp trạng thái-hành động.

    • Ví dụ: Q-learning hay DQN.

    • Tư duy: "Nếu tôi ở trạng thái này và làm hành động kia, tôi sẽ thu được bao nhiêu lợi ích về lâu dài?". Sau khi biết giá trị của mọi hành động, Agent chỉ việc chọn cái nào có giá trị lớn nhất (argmax).

    • Hạn chế: Gặp khó khăn khi không gian hành động quá lớn hoặc là không gian liên tục (continuous), vì việc tìm hành động tốt nhất qua hàm argmax lúc này trở nên cực kỳ đắt đỏ về mặt tính toán và không khả vi.

  • Policy-based (Tiếp cận dựa trên chính sách): Đây chính là trọng tâm của bài viết này. Thay vì học hàm giá trị để suy ra hành động, chúng ta học trực tiếp Chính sách πθ\pi_{\theta}

    • Ví dụ: Thuật toán REINFORCE, PPO, A2C.

    • Tư duy: "Tôi sẽ học một hàm số πθ(as)\pi_{\theta}(a|s) để trả về trực tiếp xác suất chọn hành động aa khi đang ở trạng thái ss".

    • Ưu điểm: Phương pháp này cực kỳ linh hoạt, có thể hoạt động hiệu quả với mọi không gian hành động (rời rạc hoặc liên tục) và đặc biệt là chính sách có tính khả vi, cho phép chúng ta sử dụng các kỹ thuật tối ưu hóa mạnh mẽ như Gradient Ascent.

Bài toán Grid-World

Đây là bài toán làm ví dụ xuyên suốt cả bài viết. Hãy tưởng tượng một Agent đang ở trong một mê cung ô lưới 4×44 \times 4 (GridWorld) như hình dưới đây:

Mục tiêu của Agent là tìm đường đến G mà có thể tối đa hóa phần thưởng nhận được với các thông tin sau:

  • S (Start): Điểm bắt đầu.

  • G (Goal): Đích đến - nơi Agent nhận được phần thưởng hậu hĩnh (+100+100). Khi đến đích thì giả lập kết thúc.

  • Ô đỏ: Đi vào sẽ bị phạt nặng (phần thưởng =10=-10)

  • Ô trắng: Đi vào sẽ bị phạt nhẹ (phần thưởng =1=-1)

Luật chơi: Agent tại một ô bất kỳ có thể đi 1 trong 4 hướng: Lên, Xuống, Trái, Phải để sang ô mới.

Định nghĩa Policy

Trong RL, Policy (π\pi) chính là thực thể đóng vai trò quyết định hành động dựa trên những gì Agent quan sát được từ môi trường. Để máy tính có thể học và cải thiện được chính sách này, chúng ta cần cụ thể hóa nó dưới dạng các hàm toán học. Có hai cách cơ bản để mô tả một chính sách:

  • Deterministic Policy (Chính sách định mệnh): Đây là dạng đơn giản nhất, trong đó Agent luôn chọn một hành động cố định cho mỗi trạng thái cụ thể: a=π(s)a = \pi(s). Giống như một quy tắc cứng nhắc: "Nếu thấy đèn đỏ, chắc chắn phải dừng lại".

  • Stochastic Policy (Chính sách ngẫu nhiên): Ở dạng này, chính sách không trả về một hành động duy nhất mà trả về một phân phối xác suất trên tập hợp các hành động: aπ(as)a \sim \pi(a|s). Nghĩa là tại trạng thái ss, Agent có thể chọn hành động aa với xác suất PP nào đó.

Để có thể dùng các thuật toán tối ưu hóa (như Gradient Ascent), chúng ta cần biến Policy thành một hàm số phụ thuộc vào một bộ tham số θ\theta (ví dụ: các trọng số trong mạng Neural). Lúc này, policy được ký hiệu là πθ(as)\pi_\theta(a|s). Lúc đó, khi chúng ta thay đổi giá trị của θ\theta, xác suất chọn các hành động tại các trạng thái sẽ thay đổi theo. Như vậy, công việc của chúng ta bây giờ là đi tìm bộ tham số θ\theta sao cho chính sách πθ\pi_\theta tạo ra những hành động mang lại tổng phần thưởng lớn nhất. Đây chính là nền tảng của họ thuật toán Policy Gradient: Thay vì đi tìm giá trị của trạng thái, chúng ta đi tính toán gradient của hàm mục tiêu theo tham số θ\theta để trực tiếp nâng cấp chính sách của mình. Ví dụ chúng ta có thể chọn hàm softmax thông qua mạng neural để tính: πθ(as)=softmax(fθ(s))\pi_\theta(a|s) = \text{softmax}(f_\theta(s)), sau đó qua qua trình huấn luyện, chúng ta điều chỉnh θ\theta dần để tối ưu dần hàm πθ\pi_\theta.

Hàm mục tiêu J(θ)J(\theta)

Trong RL, mục tiêu của chúng ta không phải là tối ưu một hành động đơn lẻ, mà là tối ưu cả một quá trình tương tác. Ta định nghĩa Hàm mục tiêu J(θ)J(\theta), đại diện cho kỳ vọng về tổng phần thưởng mà Agent nhận được khi tuân theo chính sách πθ\pi_\theta:

J(θ)=Eτπθ[R(τ)]=Eτπθ[t=0Tγtrt]J(\theta) = \mathbb{E}_{\tau \sim \pi_{\theta}} [R(\tau)] = \mathbb{E}_{\tau \sim \pi_{\theta}} \left[ \sum_{t=0}^{T} \gamma^{t} r_t \right]

Trong đó:

  • τ=(s0,a0,r0,s1,a1,r1,...)\tau = (s_0, a_0, r_0, s_1, a_1, r_1, ...): Được gọi là một quỹ đạo (trajectory) hoặc một Episode. Nó là chuỗi các trạng thái, hành động và phần thưởng mà Agent trải qua từ đầu đến cuối. Đối với bài toán grid world thì trajectory có thể là tập hợp các bước đã đi cùng với phần thưởng kèm theo mỗi bước kể từ lúc agent bắt đầu đến lúc kết thúc.

  • R(τ)R(\tau): Tổng phần thưởng tích lũy (Return) của quỹ đạo τ\tau.

  • γ[0,1)\gamma \in [0, 1): Hệ số chiết khấu (discount factor), giúp cân bằng giữa giá trị tức thời và giá trị tương lai. Lý do ta đưa hệ số chiết khấu là để giá trị J(θ)J(\theta) hội tụ (chuỗi hình học)

  • Eτπθ\mathbb{E}_{\tau \sim \pi_{\theta}}: Ký hiệu Kỳ vọng (Expectation). Vì môi trường và chính sách có tính ngẫu nhiên, Agent có thể đi theo nhiều quỹ đạo khác nhau. Ở đây, τπθ\tau \sim \pi_\theta có ý nghĩa là τ\tau được lấy mẫu từ phân phối do policy πθ\pi_\theta (và môi trường) sinh ra. J(θ)J(\theta) là giá trị trung bình mà Agent mong đợi nhận được nếu thực hiện nhiệm vụ vô số lần với cùng một θ\theta.

Để tối ưu hóa, chúng ta sử dụng phương pháp Gradient Ascent nhằm cập nhật θ\theta theo hướng tăng tiến của hàm mục tiêu:

θθ+αθJ(θ)\theta \leftarrow \theta + \alpha \nabla_{\theta} J(\theta)

Trajectory (quỹ đạo)

Mình đã nhắc đến điều này ở bên trên và nhắc lại ở đây vì muốn các bạn phải hiểu thật rõ ràng trajectory là gì. Một Trajectory τ\tau, hay còn gọi là quỹ đạo, là một chuỗi các diễn biến từ lúc Agent bắt đầu cho đến khi kết thúc. Đối với bài toán grid world thì trajectory có thể là tập hợp các bước đã đi kể từ lúc agent bắt đầu đến lúc kết thúc (đi đến mục tiêu). Tuy nhiên, đối với một số trường hợp, ví dụ như trò chơi vô hạn như giữ gậy thăng bằng, chúng ta có thể xác định một độ dài nhất định cho trajectory mà không nhất thiết phải chờ tới trạng thái kết thúc mới tạo nên một trajectory:

τ=(s0,a0,s1,a1,s2,a2,,sT1,aT1)\tau = (s_0, a_0, s_1, a_1, s_2, a_2, \dots, s_{T-1}, a_{T-1})

Đi kèm với mỗi bước đi là một phần thưởng rtr_t, tạo nên tổng lợi nhuận R(τ)=t=0T1γtrtR(\tau) = \sum_{t=0}^{T-1} \gamma^t r_t. Dựa trên tính chất Markov (trạng thái tiếp theo chỉ phụ thuộc vào trạng thái và hành động hiện tại):

P(st+1s0,a0,...,st,at)=P(st+1st,at)P(s_{t+1} | s_0, a_0, ..., s_t, a_t) = P(s_{t+1} | s_t, a_t)

Xác suất để quỹ đạo τ\tau xảy ra khi Agent tuân theo chính sách πθ\pi_\theta là tích của các xác suất thành phần:

P(τθ)=P(s0)t=0T1πθ(atst)PolicyP(st+1st,at)DynamicsP(\tau|\theta) = P(s_0) \prod_{t=0}^{T-1} \underbrace{\pi_{\theta}(a_t|s_t)}_{\text{Policy}} \underbrace{P(s_{t+1}|s_t, a_t)}_{\text{Dynamics}}

Khi nhìn vào công thức này, ta thấy một chi tiết cực kỳ thú vị:

  • P(s0)P(s_0)P(st+1st,at)P(s_{t+1}|s_t, a_t) là các thành phần thuộc về môi trường (Environment Dynamics). Agent hoàn toàn không biết và không thể điều khiển được quy luật vật lý hay logic này của môi trường.

  • Chỉ có πθ(atst)\pi_{\theta}(a_t|s_t) là thành phần duy nhất phụ thuộc vào tham số θ\theta của Agent.

Mục tiêu của chúng ta là tính đạo hàm của hàm mục tiêu:

θJ(θ)=θEτπθ[R(τ)]=θτP(τθ)R(τ)=τθP(τθ)R(τ)\begin{align*} \nabla_{\theta} J(\theta) &= \nabla_{\theta} \mathbb{E}_{\tau \sim \pi_{\theta}} [R(\tau)] \\ & = \nabla_{\theta} \sum_{\tau} P(\tau|\theta) R(\tau) \\ & = \sum_{\tau} \nabla_{\theta} P(\tau|\theta) R(\tau) \end{align*}

Trong đó, τ\displaystyle \sum_\tau là tổng trên tất cả các quỹ đạo có thể xảy ra dưới phần phối được sinh ra bởi policy πθ\pi_\theta và môi trường. Để ý là sở dĩ ta có đẳng thức trên là vì:

  • Reward bị chặn do γ<1\gamma < 1

  • Policy là hàm được chọn sao cho là hàm trơn (softmax, ...)

Vấn đề nan giải ở đây là chúng ta không thể tính trực tiếp đạo hàm này vì chúng ta không biết P(τθ)P(\tau|\theta). Cụ thể hơn, ta không biết các xác suất chuyển trạng thái P(st+1st,at)P(s_{t+1}|s_t, a_t) của môi trường. Trong thực tế, môi trường thường là một "hộp đen" (Black-box), ta chỉ có thể tương tác và lấy mẫu chứ không có công thức cụ thể. Tuy nhiên chúng ta lại tìm ra được một giải pháp rất thú vị cho vấn đề này thông qua Log-Derivative trick.

Log-Derivative trick

Dựa trên quy tắc đạo hàm hàm hợp: ddxlogf(x)=f(x)f(x)\displaystyle \frac{d}{dx} \log f(x) = \frac{f'(x)}{f(x)}, ta có thể viết lại:

θP(τθ)=P(τθ)θP(τθ)P(τθ)=P(τθ)θlogP(τθ)\nabla_{\theta} P(\tau|\theta) = P(\tau|\theta) \frac{\nabla_{\theta} P(\tau|\theta)}{P(\tau|\theta)} = P(\tau|\theta) \nabla_{\theta} \log P(\tau|\theta)

Áp dụng vào đạo hàm của hàm mục tiêu J(θ)J(\theta):

θJ(θ)=τθP(τθ)R(τ)=τP(τθ)θlogP(τθ)R(τ)=Eτπθ[θlogP(τθ)R(τ)]\begin{align*} \nabla_{\theta} J(\theta) &= \sum_{\tau} \nabla_{\theta} P(\tau|\theta) R(\tau) \\ &= \sum_{\tau} P(\tau|\theta) \nabla_{\theta} \log P(\tau|\theta) R(\tau) \\ &= \mathbb{E}_{\tau \sim \pi_{\theta}} [\nabla_{\theta} \log P(\tau|\theta) R(\tau)] \end{align*}

Khi ta khai triển θlogP(τθ)\nabla_{\theta} \log P(\tau|\theta) từ công thức trên:

θlogP(τθ)=θ[logP(s0)+t=0T1logπθ(atst)+t=0T1logP(st+1st,at)]\nabla_\theta\log P(\tau|\theta) = \nabla_\theta\left[ \log P(s_0) + \sum_{t=0}^{T-1} \log \pi_{\theta}(a_t|s_t) + \sum_{t=0}^{T-1} \log P(s_{t+1}|s_t, a_t) \right ]

Do ta lấy đạo hàm theo θ\theta nên:

  • θlogP(s0)=0\nabla_{\theta} \log P(s_0) = 0 (vì không phụ thuộc θ\theta).

  • θlogP(st+1st,at)=0\nabla_{\theta} \log P(s_{t+1}|s_t, a_t) = 0 (vì không phụ thuộc θ\theta).

Cuối cùng ta có:

θlogP(τθ)=t=0T1θlogπθ(atst)\nabla_{\theta} \log P(\tau|\theta) = \sum_{t=0}^{T-1} \nabla_{\theta} \log \pi_{\theta}(a_t|s_t)

Tuyệt vời! Sau khi đưa về dạng log\log, thành phần không biết P(τθ)P(\tau|\theta) đã trở thành tính đạo hàm của log-policy θlogπθ(atst)\nabla_\theta \log \pi_\theta(a_t|s_t) tại mỗi bước thời gian, mà πθ\pi_\theta là thứ mà ta có thể biết được vì chính chúng ta là người thiết kế ra nó.

Định lý Policy Gradient (Policy Gradient Theorem)

Kết hợp tất cả những mảnh ghép từ đầu bài viết, chúng ta đi đến công thức tổng quát của Định lý Policy Gradient ở dạng quỹ đạo (Trajectory form):

θJ(θ)=Eτπθ[t=0T1θlogπθ(atst)R(τ)]\nabla_{\theta} J(\theta) = \mathbb{E}_{\tau \sim \pi_{\theta}} \left[ \sum_{t=0}^{T-1} \nabla_{\theta} \log \pi_{\theta}(a_t|s_t) \cdot R(\tau) \right]

Về bản chất, công thức này đang thực hiện một quy tắc "thưởng - phạt" rất logic:

  • θlogπθ(atst)\nabla_{\theta} \log \pi_{\theta}(a_t|s_t): Đây là hướng để tăng xác suất chọn hành động ata_t tại trạng thái sts_t.

  • R(τ)R(\tau): Đây là trọng số (vừa là độ lớn, vừa là chiều).

    • Nếu quỹ đạo τ\tau có tổng phần thưởng R(τ)R(\tau) dương và rất lớn, ta sẽ đẩy mạnh xác suất của tất cả các hành động trong quỹ đạo đó lên.

    • Nếu R(τ)R(\tau) âm hoặc rất nhỏ, ta sẽ giảm xác suất của các hành động này xuống.

Nói cách khác: "Nếu hành trình này mang lại kết quả tốt, hãy ghi nhớ và thực hiện các hành động này thường xuyên hơn trong tương lai".

Reward-To-Go

Mặc dù công thức trên đúng về mặt toán học, nhưng nó lại gặp một vấn đề nghiêm trọng về mặt logic thực tế và hiệu suất huấn luyện, đó là Tính nhân quả (Causality). Hãy nhìn vào một hành động ata_t tại thời điểm tt. Trong công thức trên, hành động ata_t đang bị nhân với toàn bộ tổng phần thưởng R(τ)R(\tau) của cả hành trình.

  • R(τ)R(\tau) bao gồm cả những phần thưởng từ quá khứ (từ thời điểm 00 đến t1t-1).

  • Ở đây, có một điều phi lý là một hành động thực hiện ở hiện tại không thể nào thay đổi được những gì đã xảy ra trong quá khứ. Việc bắt hành động ata_t "chịu trách nhiệm" cho những phần thưởng quá khứ sẽ tạo ra rất nhiều nhiễu (noise) và làm tăng phương sai (variance) cho quá trình học.

Để sửa lỗi này, chúng ta thay thế R(τ)R(\tau) bằng Reward-to-go GtG_t — chỉ tính tổng phần thưởng từ thời điểm hành động được thực hiện cho đến khi kết thúc:

Gt=k=tT1γktrkG_t = \sum_{k=t}^{T-1} \gamma^{k-t} r_k

Để dễ hình dung hãy xem hình minh họa dưới đây theo trục thời gian để thây Reward-to-Go chỉ được tính kể từ thời điểm tt trở đi

Lúc này, công thức Policy Gradient được tinh chỉnh lại thành:

θJ(θ)=Eτπθ[t=0T1θlogπθ(atst)Gt]\nabla_{\theta} J(\theta) = \mathbb{E}_{\tau \sim \pi_{\theta}} \left[ \sum_{t=0}^{T-1} \nabla_{\theta} \log \pi_{\theta}(a_t|s_t) \cdot G_t \right]

Ở đây, chỉ còn một nút thắt, đó là ta không thể tính được kỳ vọng chính xác (vì không thể duyện được mọi τ\tau - không gian có thể quá lớn). Vì thế ta thay kỳ vọng bằng trung bình mẫu (Monte Carlo). Lấy NN quỹ đạo độc lập:

τ(2),,τ(N)πθ\tau^{(2)}, \dots, \tau^{(N)} \sim \pi_\theta

Sau đó, ta xấp xỉ gradient:

θJ(θ)1Ni=1Nt=0T1θlogπθ(at(i)st(i))Gt(i)\nabla_\theta J(\theta) \approx \frac{1}{N}\sum_{i=1}^{N}\sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta\big(a_t^{(i)}\mid s_t^{(i)}\big)\, G_t^{(i)}

Đây chính là REINFORCE estimator, đó chính là tư tưởng của thuật toán REINFORCE tiếp theo dưới đây.

Thuật toán REINFORCE (Williams, 1992)

Dưới đây là chi tiết thuật toán, mình sẽ dùng tiếng Anh, để cho các bạn quen mắt với các từ khóa for, do, ...

Input: Policy πθ\pi_\theta, learning rate α\alpha
for each episode do:
Collect trajectory τ=(s0,a0,r0,,sT1,aT1,rT1)\tau = (s_0,a_0,r_0,\dots, s_{T-1}, a_{T-1}, r_{T-1}) using πθ\pi_\theta
for t=0,1,,T1t=0,1,\dots,T-1 do:
Compute Reward-to-Go: Gt=k=tT1γktrk\displaystyle G_t=\sum_{k=t}^{T-1} \gamma^{k-t}r_k
end for
Update: θθ+αt=0T1θlogπθ(atst).Gt\displaystyle \theta \leftarrow \theta + \alpha\sum{t=0}^{T-1} \nabla_\theta\log \pi_\theta(a_t|s_t). G_t
end for

Để dễ hình dung việc tính toán của thuật toán, hãy xem một ví dụ tính toán cụ thể cho bài toán Gridworld bên trên như sau:

Bước 1: Thiết lập

Để máy tính hiểu được chính sách, ta thường dùng một mạng neural đơn giản hoặc một hàm tuyến tính để đại diện cho πθ(as)\pi_\theta(a|s).

  • Hàm Chính sách: πθ(as)=softmax(fθ(s,a))\pi_\theta(a|s) = \text{softmax}(f_\theta(s, a)).

    • Hàm softmax đảm bảo tổng xác suất của 4 hướng (Lên, Xuống, Trái, Phải) luôn bằng 11.

  • Learning Rate (α\alpha): Thường chọn một giá trị nhỏ, ví dụ 0.010.01 hoặc 0.0010.001, để các bước cập nhật tham số diễn ra ổn định, không làm chính sách bị thay đổi quá đột ngột dẫn đến mất dấu đường đi tốt.

  • Hệ số chiết khấu (γ\gamma): Chọn γ=0.9\gamma = 0.9 để Agent ưu tiên những phần thưởng sớm.

  • Trajectory Length (T=3T = 3) : chiều dài của một trajectory.

Bước 2: Kịch bản trajectory 3 bước

Giả sử Agent bắt đầu từ điểm S:

  • t=0t=0: Từ s0s_0, chọn đi Phải (a0a_0). Nhận thưởng r0=1r_0 = -1.

  • t=1t=1: Từ s1s_1 (vị trí A), chọn đi Lên (a1a_1). Đây là hành động sai lầm dẫn vào ô đỏ. Nhận thưởng r1=10r_1 = -10.

  • t=2t=2: Từ s2s_2 (trong ô đỏ), chọn đi Trái (a2a_2) để quay lại ô an toàn. Nhận thưởng r2=1r_2 = -1.

Bước 3: Tính Reward-to-go (GtG_t)

Chúng ta tính lùi từ bước cuối cùng:

  • Tại t=2t=2: G2=r2=1G_2 = r_2 = \mathbf{-1}.

  • Tại t=1t=1: G1=r1+γr2=10+0.9(1)=10.9G_1 = r_1 + \gamma r_2 = -10 + 0.9(-1) = \mathbf{-10.9}.

  • Tại t=0t=0: G0=r0+γr1+γ2r2=1+0.9(10)+0.81(1)=10.81G_0 = r_0 + \gamma r_1 + \gamma^2 r_2 = -1 + 0.9(-10) + 0.81(-1) = \mathbf{-10.81}.

Bước 4: Cập nhật θ\theta

Cuối cùng thuật toán REINFORCE sẽ điều chỉnh bộ tham số θ\theta qua công thức:

θθ+αt=02θlogπθ(atst)Gt\theta \leftarrow \theta + \alpha \sum_{t=0}^{2} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t

Nhận xét:

Dù cả 3 hành động đều nhận GtG_t âm, nhưng mức độ "phạt" là khác nhau. Hành động trực tiếp dẫn vào ô đỏ (t=1t=1) bị phạt nặng nhất (G1=10.9G_1 = -10.9). Qua nhiều lần thử (Episodes), nếu Agent tìm được một quỹ đạo khác (ví dụ: đi Phải -> đi Phải) để tới đích nhận +100+100, lúc đó GtG_t sẽ trở nên dương rất lớn. Khi đó, Gradient sẽ đảo chiều và "củng cố" (reinforce) những tham số giúp tăng xác suất của những hành động đúng đắn đó lên.

Thuật toán REINFORCE với baseline

Vấn đề của thuật toán REINFORCE

Từ phần trước, theo công thức ta có:

θJ(θ)1Ni=1Nt=0T1θlogπθ(at(i)st(i))Gt(i)\nabla_\theta J(\theta) \approx \frac{1}{N}\sum_{i=1}^{N}\sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta\big(a_t^{(i)}\mid s_t^{(i)}\big)\, G_t^{(i)}

Đây là một Monte Carlo estimator của gradient. Điều đó có nghĩa là ta đang lấy mẫu một số trajectory từ phân phối sinh ra từ πθ\pi_\theta và chúng dùng để xấp xỉ một kỳ vọng trên toàn bộ không gian quỹ đạo. Tuy nhiên, mỗi trajectory có thể rất khác nhau làm cho GtG_t dao động mạnh, từ đó gradient cũng bị dao động mạnh. hay nói cách khác, là estimator bị variance cao do:

  • Ta chỉ lấy hữu hạn mẫu

  • Mỗi trajectory là một “lịch sử ngẫu nhiên” khác nhau

  • Một hành động tại thời điểm tt bị nhân với toàn bộ GtG_tGtG_t lại chứa nhiều phần thưởng không liên quan trực tiếp đến hành động đó.

Khi variance cao, các giá trị GtG_t​ dao động rất mạnh — có trajectory cho giá trị rất lớn, có trajectory lại rất nhỏ hoặc âm. Điều này khiến gradient update trở nên “hỗn loạn”, lúc thì nhảy rất mạnh, lúc thì gần như không đáng kể. Để ổn định hơn, ta chuẩn hóa tương đối bằng cách trừ đi một mốc tham chiếu baseline b(st)b(s_t):

GtGtb(st)G_t \longrightarrow G_t - b(s_t)

Ý nghĩa của việc này là thay vì dùng giá trị GtG_t trực tiếp, ta chỉ quan tâm: "kết quả này tốt hơn hay kém hơn mức bình thường?". Ta cải tiến estimator:

θJ(θ)=Eτπθ[t=0T1θlogπθ(atst)(Gtb(st))]\nabla_\theta J(\theta) = \mathbb E_{\tau \sim \pi_\theta}\left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)(G_t - b(s_t)) \right]

Hình dưới cho thấy phân phối của gradient trước và sau khi dùng baseline.

  • Khi không có baseline, gradient có độ phân tán lớn, với nhiều giá trị cực đoan

  • Khi trừ baseline, phân phối co lại rõ rệt quanh 0

Điều này cho thấy Baseline không làm thay đổi dữ liệu đầu vào, mà làm ổn định tín hiệu học (gradient).

Liệu việc trừ b(st)b(s_t) có làm sai lệch (bias) gradient không? \RightarrowKHÔNG (unbiased).

Bắt đầu từ công thức Policy Gradient với baseline:

θJ(θ)=Eτπθ[t=0T1θlogπθ(atst)(Gtb(st))]\nabla_\theta J(\theta) = \mathbb E_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)(G_t - b(s_t)) \right]

Dựa trên tính chất tuyến tính của kỳ vọng (E[XY]=E[X]E[Y]\mathbb{E}[X - Y] = \mathbb{E}[X] - \mathbb{E}[Y]), ta tách biểu thức thành hai phần:

θJ(θ)=Eτπθ[t=0T1θlogπθ(atst)Gt]Gradient goˆˊcEτπθ[t=0T1θlogπθ(atst)b(st)]Thaˋnh phaˆˋn Baseline\nabla_\theta J(\theta) = \underbrace{\mathbb E_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)G_t \right]}_{\text{Gradient gốc}} - \underbrace{\mathbb E_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \right]}_{\text{Thành phần Baseline}}

Để chứng minh θJ(θ)\nabla_\theta J(\theta) không bị chệch, ta phải chứng minh Thành phần Baseline bằng 0.

Xét thành phần Baseline. Ta đưa dấu tổng ra ngoài kỳ vọng và áp dụng Luật kỳ vọng lặp (Law of Iterated Expectations) để tách biệt trạng thái sts_t và hành động ata_t:

Eτπθ[t=0T1θlogπθ(atst)b(st)]=t=0T1EstP[Eatπθ[θlogπθ(atst)b(st)st]]\mathbb E_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \right] = \sum_{t=0}^{T-1} \mathbb E_{s_t \sim P} \left[ \mathbb E_{a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \big| s_t \right] \right]

Xét biểu thức bên trong tại một trạng thái sts_t cố định Eatπθ[θlogπθ(atst)b(st)st]\mathbb E_{a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \big| s_t \right] , vì b(st)b(s_t) hoàn toàn không phụ thuộc vào hành động ata_t, nó được coi là một hằng số đối với phép lấy kỳ vọng theo ata_t. Ta đưa b(st)b(s_t) ra ngoài:

Eatπθ[θlogπθ(atst)b(st)st]=b(st)Eatπθ[θlogπθ(atst)st]\mathbb E_{a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \big| s_t \right] = b(s_t) \cdot \mathbb E_{a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t) \big| s_t \right]

Khai triển kỳ vọng theo định nghĩa tổng xác suất:

Eatπθ[θlogπθ(atst)b(st)st]=b(st)aAπθ(ast)θlogπθ(ast)\mathbb E_{a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \big| s_t \right] = b(s_t) \cdot \sum_{a \in A} \pi_\theta(a|s_t) \nabla_\theta \log \pi_\theta(a|s_t)

Thay θlogπθ(ast)=θπθ(ast)πθ(ast)\nabla_\theta \log \pi_\theta(a|s_t) = \frac{\nabla_\theta \pi_\theta(a|s_t)}{\pi_\theta(a|s_t)} vào biểu thức:

Eatπθ[θlogπθ(atst)b(st)st]=b(st)aAπθ(ast)θπθ(ast)πθ(ast)=b(st)aAθπθ(ast)\begin{align*} \mathbb E_{a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \big| s_t \right] &= b(s_t) \cdot \sum_{a \in A} \pi_\theta(a|s_t) \frac{\nabla_\theta \pi_\theta(a|s_t)}{\pi_\theta(a|s_t)} \\ &= b(s_t) \cdot \sum_{a \in A} \nabla_\theta \pi_\theta(a|s_t) \end{align*}

πθ(ast)\pi_\theta(a|s_t) là một phân phối xác suất hợp lệ trên không gian hành động AA, tổng xác suất của nó luôn luôn bằng 1 với mọi θ\theta:

aAπθ(ast)=1\sum_{a \in A} \pi_\theta(a|s_t) = 1

Thay vào ta có:

Eatπθ[θlogπθ(atst)b(st)st]=b(st)θ(1)\mathbb E_{a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \big| s_t \right]= b(s_t) \cdot \nabla_\theta (1)

Vì đạo hàm của hằng số 1 theo θ\theta bằng 0, ta thu được:

Eatπθ[θlogπθ(atst)b(st)st]=b(st)0=0\mathbb E_{a_t \sim \pi_\theta} \left[ \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \big| s_t \right]= b(s_t) \cdot 0 = 0

Do mọi thành phần trong dấu tổng đều bằng 0, ta có:

Eτπθ[t=0T1θlogπθ(atst)b(st)]=0\mathbb E_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)b(s_t) \right] = 0

Vậy:

θJ(θ)=Eτπθ[t=0T1θlogπθ(atst)(Gtb(st))]=Eτπθ[t=0T1θlogπθ(atst)Gt]\nabla_\theta J(\theta) = \mathbb E_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)(G_t - b(s_t)) \right]= \mathbb E_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)G_t \right]

Chứng minh hoàn tất. Việc thêm baseline không hề làm thay đổi giá trị kỳ vọng của Gradient.

Vậy chọn baseline thế nào?

Sau khi đã chứng minh được rằng việc trừ đi một baseline b(st)b(s_t) không làm chệch (bias) gradient, câu hỏi quan trọng nhất là:

Nên chọn b(st)b(s_t) như thế nào để tối ưu nhất?

Mục tiêu cốt lõi của baseline là giảm phương sai (variance). Một baseline tốt sẽ giúp Agent phân biệt được đâu là một hành động "thực sự tốt" so với mặt bằng chung, thay vì chỉ dựa vào những con số phần thưởng tuyệt đối đôi khi rất nhiễu.

Trong thực tế, lựa chọn phổ biến và hiệu quả nhất cho baseline chính là Hàm giá trị trạng thái (State-Value Function) đại diện cho kỳ vọng về tổng phần thưởng mà Agent sẽ nhận được nếu bắt đầu từ trạng thái ss tại thời điểm tt và tuân thủ theo chính sách π\pi cho đến khi kết thúc Episode.Trong thuật toán Policy Gradient, baseline tốt nhất là giá trị kỳ vọng của tổng phần thưởng tính từ trạng thái hiện tại:

b(st)=Vπθ(s)=Eπθ[k=tT1γktrkst=s]b(s_t) = V^{\pi_\theta}(s) = \mathbb{E}_{\pi_\theta} \left[ \sum_{k=t}^{T-1} \gamma^{k-t} r_{k} \big| s_t = s \right]

Trong đó:

  • Vπθ(s)V^{\pi_\theta}(s): Hàm tính giá trị trung bình của trạng thái ss khi Agent hành động dựa trên policy tham số θ\theta

  • Eπθ[st=s]\mathbb{E}_{\pi_\theta}[\dots|s_t=s]: Giá trị kỳ vọng khi Agent hành động theo chính sách πθ\pi_\theta, với điều kiện là Agent đang đứng tại trạng thái cụ thể ss vào thời điểm tt.

  • γ\gamma: Hệ số chiết khấu (0γ10 \le \gamma \le 1), giúp cân bằng giữa phần thưởng tức thời và phần thưởng trong tương lai.

  • rkr_k: Phần thưởng nhận được tại bước thứ kk.

Vấn đề là chúng ta không thể tính toán giá trị b(st)b(s_t) (hay Vπθ(s)V^{\pi_\theta}(s)) một cách trực tiếp được, vì chúng ta không biết giá trị kỳ vọng Eπθ\mathbb{E}_{\pi_\theta} thực sự của môi trường là bao nhiêu vì Agent không biết trước xác suất chuyển trạng thái hay toàn bộ các kịch bản phần thưởng có thể xảy ra. Do đó, chúng ta xem VV như một hàm số xấp xỉ có tham số ϕ\phi ký hiệu là Vϕ(s)V_\phi(s). Thay vì tính toán kỳ vọng trên lý thuyết, ta bắt hàm Vϕ(s)V_\phi(s) phải "học" từ chính những kết quả thực tế (GtG_t) mà Agent thu thập được.

Lúc này, trong mỗi bước lặp của thuật toán REINFORCE, chúng ta thực hiện hai nhiệm vụ song song:

  • Cập nhật Chính sách θ\theta: Dùng hiệu số (GtVϕ(st))(G_t - V_\phi(s_t)) để điều chỉnh hành động. Hiệu số này cho biết hành động này mang lại "lợi thế" bao nhiêu so với mức trung bình.

    θθ+αθθlogπθ(atst)(GtVϕ(st)δt)\theta \leftarrow \theta + \alpha_\theta \nabla_\theta \log \pi_\theta(a_t|s_t) (\underbrace{G_t - V_\phi(s_t)}_{\delta_t})
  • Cập nhật Hàm giá trị ϕ\phi: Điều chỉnh hàm VϕV_\phi sao cho dự đoán của nó ngày càng gần với phần thưởng thực tế GtG_t hơn (thường bằng cách giảm thiểu sai số bình phương):

    Minimize: (GtVϕ(st))2\text{Minimize: } (G_t - V_\phi(s_t))^2

Thuật toán updated với baseline

Input: Policy πθ\pi_\theta, value funtion VϕV_\phi, learning rates αθ,αϕ\alpha_\theta,\alpha_\phi
for each episode do:
Collect trajectory τ=(s0,a0,r0,,sT1,aT1,rT1)\tau = (s_0,a_0,r_0,\dots, s_{T-1}, a_{T-1}, r_{T-1}) using πθ\pi_\theta
for t=0,1,,T1t=0,1,\dots,T-1 do:
Compute Reward-to-Go: Gt=k=tT1γktrk\displaystyle G_t=\sum_{k=t}^{T-1} \gamma^{k-t}r_k
δt=GtVϕ(st)\delta_t = G_t - V_\phi(s_t)
θθ+αθ.γt.δt.θlogπθ(atst)\theta \leftarrow \theta + \alpha_\theta .\gamma^t.\delta_t.\nabla_\theta \log \pi_\theta(a_t|s_t)
ϕϕαϕϕ(GtVϕ(st))2\phi \leftarrow \phi - \alpha_\phi \nabla_\phi(G_t - V_\phi(s_t))^2
end for
end for

Demo

Cuối cùng là Demo cho trò chơi Gridworld ở trên. Bạn sẽ trải nghiệm cả 3 phương pháp tính toán: Rt,Gt,Gt with baselineR_t, G_t, G_t \text{ with baseline}. Trong demo, bạn sẽ có thể train theo từng phương pháp, chọn vào từng item, bạn sẽ nhìn thấy chi tiết toán cụ thể và simulation Agent di chuyển thế nào.

Comments

0/300

Leave name/email blank to comment anonymously

No comments yet. Be the first to comment!