# 🧭 Từ mục tiêu phần thưởng đến công thức cập nhật policy

By Everwise Intern

Bài trước ta đã chứng minh log-derivative trick: $\nabla_\theta p = p \cdot \nabla_\theta \log p$, và thấy nó biến đạo hàm của một xác suất thành "xác suất nhân đạo hàm của log". Hôm nay ta dùng đúng công cụ đó để đi từ mục tiêu phần thưởng $J(\theta)$ đến công thức cập nhật tham số, tức là công thức mà vài bài nữa ta sẽ code thành REINFORCE.

Sau bài này, bạn sẽ:

- Viết được $J(\theta)$ dưới dạng kỳ vọng trên quỹ đạo (trajectory).
- Áp dụng log-derivative trick để đưa gradient vào bên trong kỳ vọng.
- Chỉ ra vì sao các số hạng của môi trường biến mất khi lấy đạo hàm theo $\theta$.
- Viết công thức cập nhật policy và giải thích bằng lời: tăng xác suất hành vi có phần thưởng cao.

## Mục tiêu $J(\theta)$: kỳ vọng phần thưởng trên quỹ đạo

Policy (chính sách) $\pi_\theta(a \mid s)$ là một phân phối xác suất trên hành động, được điều khiển bởi tham số $\theta$. Một episode sinh ra một quỹ đạo (trajectory):

$$
\tau = (s_0, a_0, r_0, s_1, a_1, r_1, \dots, s_T)
$$

Phần thưởng của cả quỹ đạo là $R(\tau) = \sum_{t=0}^{T} r_t$ (bản có chiết khấu chỉ khác ở hệ số $\gamma^t$, không đổi bản chất). Điều ta muốn là cực đại hóa phần thưởng trung bình:

$$
J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[R(\tau)\right] = \sum_{\tau} P(\tau \mid \theta) \, R(\tau)
$$

Đọc bằng lời: "tổng có trọng số của phần thưởng từng quỹ đạo, trọng số là xác suất policy tạo ra quỹ đạo đó". Vì $P(\tau \mid \theta)$ phụ thuộc $\theta$, đổi $\theta$ là đổi luôn phân phối quỹ đạo, và đó là chỗ gradient có việc để làm.

## Đưa gradient vào trong kỳ vọng

Lấy gradient hai vế. Phần thưởng $R(\tau)$ không phụ thuộc $\theta$, nên đạo hàm chỉ tác động lên $P(\tau \mid \theta)$:

$$
\nabla_\theta J(\theta) = \sum_{\tau} \nabla_\theta P(\tau \mid \theta) \, R(\tau)
$$

Đến đây dùng log-derivative trick của bài trước, thay $\nabla_\theta P = P \cdot \nabla_\theta \log P$:

$$
\nabla_\theta J(\theta) = \sum_{\tau} P(\tau \mid \theta) \, \nabla_\theta \log P(\tau \mid \theta) \, R(\tau) = \mathbb{E}_{\tau \sim \pi_\theta}\left[\nabla_\theta \log P(\tau \mid \theta) \, R(\tau)\right]
$$

Đây là bước ngoặt: **gradient giờ là một kỳ vọng**. Kỳ vọng thì ước lượng được bằng cách lấy mẫu, nghĩa là ta không cần biết hết mọi quỹ đạo có thể xảy ra, chỉ cần chạy policy vài lần rồi lấy trung bình. Không có trick này, biểu thức vẫn đúng nhưng vô dụng vì không tính được.

## Vì sao chỉ còn log xác suất của policy

Giờ phân rã $P(\tau \mid \theta)$ thành từng bước. Xác suất một quỹ đạo bằng xác suất trạng thái đầu, nhân xác suất policy chọn từng hành động, nhân xác suất môi trường chuyển trạng thái:

$$
P(\tau \mid \theta) = \rho_0(s_0) \prod_{t=0}^{T} \pi_\theta(a_t \mid s_t) \, P(s_{t+1} \mid s_t, a_t)
$$

Lấy log, tích biến thành tổng:

$$
\log P(\tau \mid \theta) = \log \rho_0(s_0) + \sum_{t=0}^{T} \log \pi_\theta(a_t \mid s_t) + \sum_{t=0}^{T} \log P(s_{t+1} \mid s_t, a_t)
$$

Giờ lấy $\nabla_\theta$. Số hạng $\log \rho_0(s_0)$ không chứa $\theta$, đạo hàm bằng 0. Số hạng $\log P(s_{t+1} \mid s_t, a_t)$ là quy luật của môi trường, cũng không chứa $\theta$, đạo hàm bằng 0. Chỉ còn lại:

$$
\nabla_\theta \log P(\tau \mid \theta) = \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t)
$$

Thay vào kết quả trên, ta được công thức trung tâm của cả khóa học:

$$
\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[\left(\sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t)\right) R(\tau)\right]
$$

```mermaid
flowchart TD
    A["🎯<br/>Mục tiêu J(θ)"] --> B["📉<br/>∇J = Σ ∇P · R"]
    B --> C["🔑<br/>Log-derivative trick"]
    C --> D["📊<br/>∇J = E[∇log P · R]"]
    D --> E["🌍<br/>Môi trường không chứa θ"]
    E --> F["✅<br/>∇J = E[Σ ∇log π · R]"]
    F --> G["🚀<br/>θ ← θ + α∇J"]
```

> **Important:** 
> Điểm cốt lõi: ta **không cần đạo hàm của môi trường**. Chỉ cần gradient của log xác suất mà policy tự sinh ra, cộng với con số phần thưởng quan sát được. Đó là lý do policy gradient dùng được cho môi trường coi như "hộp đen".

### Bài tập nhanh 1

Một episode dài 2 bước, policy có 2 hành động mỗi trạng thái. Bạn cần tính $\nabla_\theta J$ nhưng **không được biết** $P(s_{t+1} \mid s_t, a_t)$. Có làm được không, và tại sao?

**Xem gợi ý**

Được. Vì sau khi lấy log và đạo hàm, toàn bộ số hạng môi trường có đạo hàm bằng 0. Bạn chỉ cần: chạy 2 bước để quan sát $(s_0, a_0, r_0, s_1, a_1, r_1)$, tính $R = r_0 + r_1$, rồi cộng $\nabla_\theta \log \pi_\theta(a_0 \mid s_0) + \nabla_\theta \log \pi_\theta(a_1 \mid s_1)$ nhân với $R$. Môi trường chỉ cấp dữ liệu, không cấp đạo hàm.

## Công thức cập nhật và ý nghĩa "tăng xác suất hành vi tốt"

Ta muốn $J$ lớn lên, nên bước theo hướng gradient (gradient ascent, lên dốc), không phải ngược lại:

$$
\theta \leftarrow \theta + \alpha \, \nabla_\theta J(\theta)
$$

với $\alpha$ là tốc độ học (learning rate). Trong thực tế ta không tính được kỳ vọng chính xác, nên thay bằng ước lượng Monte Carlo trên $N$ episode:

$$
\hat{g} = \frac{1}{N} \sum_{n=1}^{N} \left(\sum_{t} \nabla_\theta \log \pi_\theta(a_t^n \mid s_t^n)\right) R(\tau^n)
$$

Ý nghĩa bằng lời, đúng như mục tiêu bài học:

- $\nabla_\theta \log \pi_\theta(a \mid s)$ là hướng trong không gian tham số làm **tăng** xác suất của hành động $a$ tại trạng thái $s$ (người ta gọi nó là score function, hàm điểm).
- Nhân với $R(\tau)$ là gắn "trọng số chất lượng" cho hướng đó.

| Dấu của $R(\tau)$ | Hướng bước | Hệ quả |
| --- | --- | --- |
| Dương, lớn | cùng chiều $\nabla_\theta \log \pi_\theta$ | xác suất các hành động trong quỹ đạo tăng mạnh |
| Gần 0 | gần như không đổi | policy ít học từ quỹ đạo tầm thường |
| Âm | ngược chiều $\nabla_\theta \log \pi_\theta$ | xác suất các hành động đó giảm |

Nói cách khác: **lặp lại những gì mang lại phần thưởng cao, bớt làm những gì bị phạt**. Toàn bộ REINFORCE chỉ là công thức này cộng với một vòng lặp lấy mẫu.

### Bài tập nhanh 2

Trong PyTorch, optimizer mặc định **giảm** loss. Vậy nếu bạn có `logp` (log xác suất hành động đã chọn) và `R`, dòng code nào đúng, và tại sao?

```python
loss = (logp * R).mean()
loss = -(logp * R).mean()
```

**Xem gợi ý**

Dòng thứ hai. Ta cần cực đại $\log p \cdot R$, tức là cực tiểu $-\log p \cdot R$. Nếu quên dấu trừ, policy sẽ học cách **giảm** xác suất hành vi tốt. Đây là lỗi phổ biến nhất khi chuyển công thức sang code, và nó thường biểu hiện thành đường cong phần thưởng đi xuống một cách "ổn định" đáng ngờ.

## Ba cái bẫy khi viết công thức cập nhật

- **Nhầm dấu:** $J$ là thứ cần cực đại, nên là ascent. Khi code, dấu trừ chỉ xuất hiện một lần, ở chỗ biến thành loss.
- **Dùng sai phần thưởng cho từng bước:** Công thức sạch nhất gán $R(\tau)$ cho mọi bước, nhưng về mặt nhân quả thì bước ở thời điểm $t$ không thể chịu trách nhiệm cho phần thưởng xảy ra trước nó. Bản cải tiến dùng phần thưởng còn lại (reward-to-go) sẽ được xử lý ở bài giảm variance; giờ chỉ cần biết công thức gốc là điểm khởi đầu.
- **Quên chuẩn hóa:** $R$ quá lớn làm bước cập nhật nổ, $R$ luôn dương làm policy trôi dần. Bài sau, baseline và advantage sẽ giải quyết đúng chỗ này.

## Ghi nhớ và bước tiếp theo

Tự kiểm tra nhanh bằng các câu điền khuyết:

- Mục tiêu của policy gradient là cực đại hóa kỳ vọng phần thưởng _____.
- Nhờ log-derivative trick, ta có $\nabla_\theta P(\tau \mid \theta) = P(\tau \mid \theta) \cdot$ _____.
- Khi lấy gradient theo $\theta$, xác suất chuyển trạng thái của môi trường _____ vì nó không phụ thuộc $\theta$.
- Công thức cập nhật là $\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)$, trong đó $\alpha$ là _____.
- Vì ta cực đại hóa phần thưởng, ta dùng _____ chứ không phải gradient descent.

Tóm lại: $J(\theta)$ là kỳ vọng phần thưởng, log-derivative trick biến gradient của nó thành một kỳ vọng ước lượng được bằng mẫu, môi trường rơi khỏi biểu thức, và bước cập nhật chỉ là "đẩy xác suất của hành vi có phần thưởng cao lên". Bài tiếp theo là checkpoint: bạn sẽ tự tay chứng minh lại log-derivative trick và viết trọn biểu thức gradient mà không nhìn tài liệu.

Front: Mục tiêu J(θ) trong policy gradient được định nghĩa thế nào?
Back: Kỳ vọng phần thưởng của quỹ đạo dưới policy: J(θ) = E[ R(τ) ] với τ ~ π_θ.

Front: Quỹ đạo (trajectory) τ gồm những gì?
Back: Chuỗi trạng thái, hành động, phần thưởng: s_0, a_0, r_0, ..., s_T.

Front: Log-derivative trick được phát biểu ra sao?
Back: ∇_θ P(τ|θ) = P(τ|θ) · ∇_θ log P(τ|θ).

Front: Sau khi áp dụng log-derivative trick, gradient của J có dạng kỳ vọng nào?
Back: ∇J(θ) = E[ ∇_θ log P(τ|θ) · R(τ) ].

Front: Vì sao gradient của J ước lượng được bằng cách lấy mẫu?
Back: Vì nó là kỳ vọng trên các quỹ đạo sinh ra từ chính policy đang học.

Front: Số hạng nào trong log P(τ|θ) thực sự phụ thuộc θ?
Back: Chỉ tổng log π_θ(a_t|s_t); log xác suất trạng thái đầu và xác suất chuyển của môi trường không phụ thuộc θ.

Front: Công thức gradient cuối cùng của policy gradient là gì?
Back: ∇J(θ) = E[ (Σ_t ∇_θ log π_θ(a_t|s_t)) · R(τ) ].

Front: ∇_θ log π_θ(a|s) còn được gọi là gì?
Back: Score function, hướng làm tăng log xác suất của hành động a tại trạng thái s.

Front: Nếu R(τ) dương và lớn, bước cập nhật làm gì?
Back: Tăng xác suất của các hành động đã xuất hiện trong quỹ đạo đó.

Front: Nếu R(τ) âm thì sao?
Back: Bước cập nhật đi ngược chiều, giảm xác suất các hành động đó.

Front: Công thức cập nhật tham số của policy gradient?
Back: θ ← θ + α ∇_θ J(θ), tức gradient ascent với tốc độ học α.

Front: Ước lượng Monte Carlo của gradient với N episode?
Back: ĝ = (1/N) Σ_n (Σ_t ∇_θ log π_θ(a_t^n|s_t^n)) · R(τ^n).

Front: Vì sao trong code phải viết loss = -(logp * R).mean()?
Back: Vì optimizer giảm loss, còn ta cần cực đại log xác suất nhân phần thưởng.

---

## Contents

Part of [🎯 Policy Gradient cho người mới: từ toán nền tảng đến đồ án REINFORCE](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce.md)

- **🧮 Nền tảng toán cho Policy Gradient**
  - [📐 Ôn nhanh: kỳ vọng, gradient và quy tắc chuỗi](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce/quick-review-expectation-gradient-chain-rule.md)
  - [🔑 Log-derivative trick: vì sao đạo hàm của log xác suất lại hữu ích](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce/log-derivative-trick-explained.md) (sign-in required)
  - [🧭 Từ mục tiêu phần thưởng đến công thức cập nhật policy](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce/policy-gradient-theorem-intuition.md) — this lesson
  - [✅ Checkpoint: nền tảng toán của Policy Gradient](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce/checkpoint-policy-gradient-math.md)
- **🛠️ Đồ án: cài đặt REINFORCE và giảm variance**
  - [📉 Giảm variance với baseline và advantage](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce/variance-reduction-baseline-advantage-project.md)
  - [📊 Huấn luyện, vẽ biểu đồ và đánh giá kết quả đồ án](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce/train-plot-evaluate-capstone-project.md)
  - [✅ Checkpoint: cài đặt REINFORCE và giảm variance](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce/checkpoint-reinforce-and-variance-reduction.md)
- [Course cheatsheet](https://everwise.study/courses/policy-gradient-cho-nguoi-moi-tu-toan-nen-tang-den-do-an-reinforce/cheatsheet.md) (premium content)
