Ebook Robotics · RL–UAV
Lecture 20 — Stochastic Gradient Descent (SGD)
Chương D** · dụng cụ tối ưu thực dụng — cùng họ với gradient trong RL
Chế độ Slide · phím ← → · F toàn màn · Esc về đọc · S mở slide
Chương D** · dụng cụ tối ưu thực dụng — cùng họ với gradient trong RL
Chương D · dụng cụ tối ưu thực dụng — cùng họ với gradient trong RL
| # | Câu hỏi | Trả lời ngắn |
|---|---|---|
| 1 | Tại sao cần? | Không tối ưu nổi loss full-batch trên hàng triệu tham số / dữ liệu lớn / rollout RL. |
| 2 | So với cái khác? | Vs full-batch: rẻ, ồn hơn. Vs Adam: Adam thích nghi lr từng chiều, thường dễ tune hơn SGD thuần. Vs RL grads: cùng ý tưởng nhưng ồn hơn nhiều. |
| 3 | Giải quyết gì & thế nào? | Mini-batch ước lượng gradient; \(\theta\leftarrow\theta-\alpha\nabla\mathcal{L}\); chọn lr / lịch lr. |
| 4 | Kết quả ra sao? | Train được CNN/policy; siêu tham số lr là nút thắt số một khi debug. |
| 5 | Nên dùng khi nào? | Mọi deep learning / deep RL thực dụng. |
| 6 | Không nên khi nào? | Đổi thuật toán RL liên tục khi lr/reward scale đang vỡ; so hai method khác budget mẫu rồi kết luận; overkill khi bài giải được bằng LQR/least-squares đóng. |
🖼️ Hình nhanh: Mini-batch = nghe vài giây rồi vặn nút; lr quá lớn nổ, quá nhỏ bò.
```
Loss θ
│ full-batch ──► hướng mượt │ lr lớn: θ ↗︎↘︎↗︎↘︎ nổ
│ mini-batch ──► hướng ồn │ lr vừa: θ ──►★ hội tụ
│ │ lr nhỏ: θ ····· bò mãi
└──────────► θ★ SGD: θ ← θ − α ∇L_batch(θ) RL: ascent trên E[R] nhưng ∇ rất ồn
```🇻🇳 Chuyện thật (train policy phủ nhiều thửa): SGD giống đi xuống dốc trong sương — mỗi bước chỉ nhìn một mảng địa hình (mini-batch), không phải cả bản đồ loss.
Train policy phủ nhiều thửa chè: batch hôm nay là vài map/gió; \(\alpha\) quá lớn thì nhảy khỏi thung lũng hội tụ, quá nhỏ thì bò hết budget mẫu.
Chốt: trước khi đổ lỗi kiến trúc, hãy hỏi learning rate và scale reward — cùng một nút thắt với deep RL.../00C.
Hình gốc hoặc minh họa cho ebook — không cắt từ slide Princeton. Dùng Present: bật Slide · F toàn màn.
Chỉnh radio: không cần nghe cả album mới vặn nút. Nghe vài giây → vặn nhẹ → nghe tiếp.
SGD: mỗi bước chỉ dùng một mini-batch, cập nhật
\[ \theta \leftarrow \theta - \alpha \nabla_\theta \mathcal{L}_{\text{batch}}(\theta). \]
Full-batch giống nghe hết album rồi mới vặn một cái — chính xác theo loss toàn tập nhưng đắt và đôi khi cứng nhắc. Mini-batch ồn, nhưng ồn đó thường giúp thoát vùng xấu và thực tế chạy được.
Tìm đáy thung lũng trong sương cũng cùng hình: mỗi bước chỉ nhìn vài tảng đá gần chân (batch) thay vì khảo sát cả thung lũng.
Với RL bạn đã biết: mỗi rollout chỉ là một mẫu quỹ đạo — gradient còn ồn hơn supervised rất nhiều. Bài này nhắc lại dụng cụ chung để bạn không “đổi PPO↔SAC” khi thật ra chỉ cần giảm lr mười lần.
| Full-batch | Mini-batch / SGD | |
|---|---|---|
| Gradient | Ít ồn theo loss train | Ồn, phụ thuộc batch |
| Chi phí / bước | Quét cả tập | Quét vài mẫu / vài trajectory |
| Tổng quát | Đôi khi kẹt vùng phẳng kém generalize | Thường thoát được; cần lr hợp lý |
| RL tương ứng | “Dùng mọi episode từ trước” (hiếm) | On-policy batch / replay batch |
Dữ liệu / rollouts
│
▼
lấy batch B ──► ∇L_B(θ) ≈ ∇L(θ) + (~ nhiễu)
│
▼
θ ← θ − α · ∇L_B (hoặc +α với policy gradient)
│
▼
log loss / return ──► chỉnh α, batch size, schedule
η quá lớn: nhảy loạn /\/\/\/\ loss/reward nổ hoặc NaN
η vừa: hội tụ ~~~~★
η quá nhỏ: bò mãi _________.- tưởng “thuật toán kém”
| Biến thể | Ý tưởng một câu | Khi nào thử |
|---|---|---|
| SGD thuần | Bước cố định theo \(\alpha\) | Baseline hiểu được |
| SGD + momentum | Nhớ hướng cập nhật trước | Loss răng cưa mạnh |
| Adam | lr thích nghi từng tọa độ | Mạng sâu, ít thời gian tune |
| Schedule (warmup/decay) | \(\alpha\) đổi theo thời gian | Train dài, fine-tune encoder |
Policy gradient / actor-critic cũng là gradient trên kỳ vọng return, nhưng ước lượng ồn hơn nhiều (credit assignment, non-i.i.d., non-stationarity). Cần baseline, advantage normalization, GAE, clip (PPO), v.v. — cùng tinh thần giảm phương sai ước lượng gradient.
Lr policy quá lớn → giật giống controller \(K_p\) lớn (Lec 3). Đừng nhầm “loss” của metaheuristic path-planning với SGD trên mạng — ngôn ngữ gần nhưng cơ chế khác.
"""
Demo Lec20: tối ưu E[(θ - 3)^2]/2 bằng SGD 1-mẫu.
So sánh 3 learning rate trên cùng seed nhiễu.
Thêm: batch lớn hơn → std gradient nhỏ hơn (ít ồn).
"""
import numpy as np
def run_sgd(lr, steps=40, seed=0):
rng = np.random.default_rng(seed)
theta = 0.0
hist = [theta]
for _ in range(steps):
y = 3.0 + 0.5 * rng.normal() # một mẫu quanh mục tiêu 3
grad = (theta - y) # d/dθ của 0.5 (θ-y)^2
theta = theta - lr * grad
hist.append(theta)
return np.asarray(hist)
for lr in (0.05, 0.3, 1.5):
h = run_sgd(lr)
print(f"lr={lr:>4}: θ_cuối={h[-1]:7.3f} | max|θ|={np.max(np.abs(h)):7.3f} | "
f"đường đi [::8]={np.round(h[::8], 2)}")
# So sánh nhiễu: trung bình nhiều bước vs một bước đơn
rng = np.random.default_rng(1)
grads = []
theta = 1.0
for _ in range(32):
y = 3.0 + 0.5 * rng.normal()
grads.append(theta - y)
print("std grad 1-mẫu ≈", round(float(np.std(grads)), 3))
print("std grad mean-8 ≈", round(float(np.std(
[np.mean(grads[i:i+8]) for i in range(0, 32, 8)])), 3))
print("→ Batch lớn hơn → gradient ít ồn hơn (hướng gần full-batch).")
🧪 Kỳ vọng demo:
-lr=0.3: \(\theta\) tiến gần 3, dao động nhẹ.
-lr=0.05: tiến chậm hơn, chưa tới 3 sau 40 bước.
-lr=1.5:|θ|lớn / dao động mạnh (nổ hoặc lệch xa).
-stdcủa mean-8 nhỏ hơn 1-mẫu — đúng tinh thần mini-batch vs noise.
| Triệu chứng | Kiểm tra trước |
|---|---|
| Reward nổ / NaN | lr, clip grad, reward scale |
| Reward phẳng mãi | lr quá nhỏ; exploration; obs scale |
| Train tốt một seed gió | Không phải SGD — sang Lec 21 (overfit/gap) |
| Detector học được, policy không | Tách lr encoder vs head |
| ✅ Nên | ❌ Không nên | |
|---|---|---|
| Mini-batch SGD | Train sâu / RL thực dụng | Cứ tưởng ồn batch = bug luôn |
| Adam / momentum | Mạng sâu, ít thời gian tune | Tin “Adam = không cần nghĩ lr” |
| Full-batch | Tập cực nhỏ, phân tích lý thuyết | Ép full-batch trên mọi episode RL |
| Nghĩa năng lượng / gió / phủ | Chuẩn hóa từng term reward trước khi so method | Đổi thuật toán khi chỉ cần chỉnh lr / scale |
⚡ Nhớ một câu: Mini-batch đổi độ chính xác lấy tốc độ; lr sai thì thuật toán nào cũng ngu — sửa lr trước khi đổi tên method.
🔗 Sang bài sau mang theo: Hội tụ trên train chưa đủ — Lec 21 phân biệt overfit và domain gap (sim↔real, gió, map).
Trước: Lec19 — Deep Learning Vision · Sau: Lec21 — Overfitting