Ôn nhanh: kỳ vọng, gradient và quy tắc chuỗi
Chào bạn, đây là bài đầu tiên của khóa. Trước khi viết dòng code REINFORCE nào, chúng ta cần ba công cụ toán nhỏ nhưng xuất hiện trong mọi công thức của Policy Gradient (PG): kỳ vọng (expectation), gradient (gradient vector), và quy tắc chuỗi (chain rule). Bạn chưa cần biết gì về RL cả, mình sẽ đi chậm từng bước.
Sau bài này, bạn sẽ:
- Tính được kỳ vọng của một biến ngẫu nhiên (random variable) rời rạc bằng tổng có trọng số.
- Đọc được ký hiệu $\nabla_\theta J(\theta)$ và biết nó là vector các đạo hàm riêng (partial derivative).
- Áp dụng quy tắc chuỗi cho một biểu thức có log xác suất.
- Ghép ba thứ trên để thấy vì sao gradient của kỳ vọng phần thưởng lại "chỉ chạm" vào xác suất.
Kỳ vọng: trung bình có trọng số theo xác suất
Kỳ vọng của biến rời rạc $X$ nhận giá trị $x$ với xác suất $p(x)$ là:
$$ \mathbb{E}_{x \sim p}[X] = \sum_x p(x), x $$
Nó chỉ là trung bình cộng, nhưng mỗi giá trị được "cân" theo xác suất xuất hiện. Hai tính chất bạn sẽ dùng hoài:
- Tuyến tính: $\mathbb{E}[aX + b] = a,\mathbb{E}[X] + b$ và $\mathbb{E}[X + Y] = \mathbb{E}[X] + \mathbb{E}[Y]$.
- Xác suất luôn cộng lại bằng 1, nên $\sum_x p(x) = 1$.
Trong đồ án của chúng ta, policy (chính sách) là một bảng xác suất: ở mỗi trạng thái $s$, nó chọn hành động $a$ với xác suất $\pi_\theta(a \mid s)$. Kỳ vọng phần thưởng (reward) chính là trung bình có trọng số của phần thưởng theo các xác suất đó.
Note: Xác suất là "trọng số", không phải "số lần đếm". Nếu policy chọn hành động A với xác suất 0.9 thì trong kỳ vọng, A chiếm 90% trọng lượng, dù bạn chỉ chạy thử một lần.
Bài tập nhỏ 1. Policy có 3 hành động với xác suất $0.5,\ 0.3,\ 0.2$ và phần thưởng tương ứng $1,\ 2,\ 10$. Kỳ vọng phần thưởng bằng bao nhiêu?
Đáp án
$0.5 \cdot 1 + 0.3 \cdot 2 + 0.2 \cdot 10 = 0.5 + 0.6 + 2 = 3.1$.
Lưu ý hành động thứ ba chỉ được chọn 20% số lần nhưng đóng góp 2/3 kỳ vọng. Đây chính là lý do phần thưởng hiếm nhưng lớn vẫn kéo được policy.
Bài tập nhỏ 2 (gắn với đồ án). Bạn chạy 4 episode và được return $10,\ 12,\ 8,\ 10$. Con số nào xấp xỉ kỳ vọng return của policy hiện tại?
Đáp án
Trung bình mẫu: $(10 + 12 + 8 + 10) / 4 = 10$. Trung bình mẫu là ước lượng của kỳ vọng. Về sau, đường cong học (learning curve) trong đồ án chính là dãy các ước lượng này.
Gradient và đạo hàm riêng: mũi tên chỉ hướng tăng
Với hàm nhiều biến $J(\theta)$ (ở đây $\theta$ là vector tham số của mạng hoặc bảng policy), đạo hàm riêng theo $\theta_i$ là đạo hàm khi giữ mọi biến khác cố định. Gom tất cả lại ta được gradient:
$$ \nabla_\theta J(\theta) = \left( \frac{\partial J}{\partial \theta_1}, \frac{\partial J}{\partial \theta_2}, \dots \right) $$
Gradient là vector chỉ về hướng làm $J$ tăng nhanh nhất. Vì mục tiêu của RL là tối đa hóa phần thưởng, ta đi theo gradient, gọi là gradient ascent (tăng dần theo gradient):
$$ \theta \leftarrow \theta + \alpha , \nabla_\theta J(\theta) $$
trong đó $\alpha$ là tốc độ học (learning rate). Dấu cộng là điểm khác biệt so với gradient descent quen thuộc khi huấn luyện mạng neural bằng hàm mất mát.
Bài tập nhỏ 3. Cho $f(\theta_1, \theta_2) = \theta_1^2 \theta_2 + 3\theta_1$. Tính gradient tại $(\theta_1, \theta_2) = (1, 2)$.
Đáp án
$\partial f / \partial \theta_1 = 2\theta_1\theta_2 + 3 = 7$; $\partial f / \partial \theta_2 = \theta_1^2 = 1$. Vậy $\nabla f = (7, 1)$.
Bài tập nhỏ 4. Với $J(\theta) = -(\theta - 3)^2$, $\alpha = 0.1$, khởi đầu $\theta = 0$. Sau một bước gradient ascent, $\theta$ bằng bao nhiêu?
Đáp án
$\nabla J = -2(\theta - 3) = 6$ tại $\theta = 0$. Cập nhật: $\theta = 0 + 0.1 \cdot 6 = 0.6$. $\theta$ nhích về phía 3, đúng là hướng làm $J$ tăng.
Quy tắc chuỗi: mắt xích nối tham số với xác suất
Quy tắc chuỗi nói rằng nếu $y$ phụ thuộc trung gian vào $u$, và $u$ phụ thuộc vào $x$, thì:
$$ \frac{d}{dx} f(g(x)) = f'(g(x)) \cdot g'(x) $$
Nói cách thực dụng: nhân các mắt xích lại. Trong PG, chuỗi mắt xích luôn có dạng: tham số $\theta$ tạo ra logits, logits tạo ra xác suất $\pi_\theta(a \mid s)$, xác suất tạo ra log xác suất, và cuối cùng là mục tiêu $J(\theta)$.
flowchart TD
A["🎯<br/>Tham số θ"] --> B["📊<br/>Logits z = θ·φ(s)"]
B --> C["🎲<br/>Xác suất π_θ(a|s)"]
C --> D["📈<br/>Mục tiêu J(θ)"]
D --> E["🧭<br/>Gradient ∇J"]
Ví dụ cụ thể, lấy một hành động nhị phân với $\pi = \sigma(z)$ (hàm sigmoid), $z = \theta x$, và mục tiêu là $J = \log \pi$:
$$ \frac{\partial \log \pi}{\partial \theta} = \frac{1}{\pi} \cdot \pi(1 - \pi) \cdot x = (1 - \pi), x $$
Ba mắt xích: đạo hàm của $\log$ là $1/\pi$; đạo hàm của sigmoid là $\pi(1-\pi)$; đạo hàm của $z = \theta x$ theo $\theta$ là $x$. Với $\theta = 0.5$, $x = 2$: $z = 1$, $\pi = \sigma(1) \approx 0.731$, gradient $\approx (1 - 0.731) \cdot 2 \approx 0.538$.
Bài tập nhỏ 5. Vì sao trong đồ án, khi viết log_prob = dist.log_prob(action), ta không thể lấy đạo hàm "trực tiếp theo phần thưởng"?
Đáp án
Vì phần thưởng không phụ thuộc $\theta$. Chuỗi phụ thuộc thật sự là $\theta \to$ logits $\to \pi_\theta \to \log \pi_\theta$. Đó là lý do ta cần quy tắc chuỗi và (ở bài sau) cần log-derivative trick.
Bài tập nhỏ 6. Nếu $J(\theta) = \mathbb{E}{\tau \sim \pi\theta}[R(\tau)] = \sum_\tau p_\theta(\tau) R(\tau)$, gradient $\nabla_\theta J$ tác động lên $p_\theta(\tau)$ hay lên $R(\tau)$? Vì sao?
Đáp án
Chỉ lên $p_\theta(\tau)$: đạo hàm của một tổng là tổng các đạo hàm, và $R(\tau)$ là hằng số theo $\theta$. Ta có $\nabla_\theta J = \sum_\tau \nabla_\theta p_\theta(\tau), R(\tau)$. gradient chỉ tác động lên xác suất, không lên phần thưởng. Đây là hạt giống của toàn bộ công thức PG.
Vài lỗi thường gặp khi ôn lại ba công cụ này
- Quên dấu của gradient ascent. Mục tiêu là tối đa hóa, nên cập nhật là $\theta + \alpha\nabla J$, không phải trừ. Nếu loss của bạn giảm mà return cũng giảm, hãy kiểm tra dấu ở đây trước.
- Nhầm vector với số vô hướng. $\nabla_\theta J$ có cùng số chiều với $\theta$. Với policy dạng bảng, đó là một gradient cho mỗi cặp (trạng thái, hành động).
- Nhảy mắt xích. Khi thấy $\partial \log \pi_\theta(a \mid s)$, hãy viết rõ chuỗi $\theta \to z \to \pi \to \log \pi$ ra giấy rồi mới lấy đạo hàm. Viết ra giấy nhanh hơn sửa lỗi.
- Quy tắc thực dụng: gặp kỳ vọng thì nghĩ "trung bình có trọng số", gặp gradient thì nghĩ "hướng tăng", gặp hàm hợp thì nghĩ "nhân các mắt xích".
Gói lại và mang sang bài log-derivative trick
Bạn vừa có đủ ba viên gạch: kỳ vọng là trung bình có trọng số, gradient là vector chỉ hướng tăng nhanh nhất và được dùng với dấu cộng, quy tắc chuỗi cho phép bóc đạo hàm qua nhiều lớp phụ thuộc.
Tự kiểm tra nhanh:
Kỳ vọng của biến rời rạc X bằng tổng của _____ trên mọi giá trị. Tính tuyến tính cho ta E[aX + b] = _____. Gradient của hàm nhiều biến là vector gồm các _____ theo từng biến. Quy tắc chuỗi: đạo hàm của f(g(x)) bằng _____. Công thức cập nhật gradient ascent là theta bằng theta cộng _____.
Bộ thẻ để bạn ôn lại vào ngày mai:
Front: Kỳ vọng của biến ngẫu nhiên rời rạc được tính thế nào? Back: Tổng của giá trị nhân xác suất: E[X] = tổng p(x)·x.
Front: Tính chất tuyến tính của kỳ vọng? Back: E[aX + b] = a·E[X] + b và E[X + Y] = E[X] + E[Y].
Front: Kỳ vọng phần thưởng của một policy nghĩa là gì? Back: Trung bình có trọng số của phần thưởng theo xác suất policy chọn hành động.
Front: Trung bình mẫu của return qua nhiều episode ước lượng cái gì? Back: Kỳ vọng return của policy hiện tại.
Front: Gradient của hàm nhiều biến là gì? Back: Vector gồm các đạo hàm riêng theo từng biến.
Front: Gradient chỉ điều gì? Back: Hướng làm hàm tăng nhanh nhất.
Front: Đạo hàm riêng là gì? Back: Đạo hàm theo một biến khi giữ mọi biến còn lại cố định.
Front: Công thức cập nhật gradient ascent? Back: theta ← theta + alpha · gradient của J theo theta.
Front: alpha trong công thức cập nhật là gì? Back: Tốc độ học (learning rate).
Front: Quy tắc chuỗi phát biểu thế nào? Back: Đạo hàm của f(g(x)) = f'(g(x)) · g'(x).
Front: Với pi = sigmoid(z), z = theta·x, đạo hàm của log pi theo theta là gì? Back: (1 − pi)·x.
Front: Vì sao cần quy tắc chuỗi trong Policy Gradient? Back: Vì mục tiêu phụ thuộc xác suất, mà xác suất lại phụ thuộc tham số theta.
Front: Trong gradient của kỳ vọng return, gradient tác động lên đại lượng nào? Back: Chỉ lên xác suất; phần thưởng là hằng số theo theta.
Front: Ký hiệu gradient của J theo theta đọc là gì? Back: Vector đạo hàm riêng của J theo từng thành phần của theta.
Bài tiếp theo sẽ lấy chính quan sát cuối cùng ở bài tập 6, rằng gradient chỉ chạm vào xác suất, rồi dùng một mẹo nhỏ với log để biến nó thành công thức cập nhật mà bạn có thể code được: log-derivative trick.