Gradient Descent
Gradient descent: xoay weight để loss giảm dần
Bạn đã hiểu gradient là gì. Giờ áp vào bài toán huấn luyện thật.
Ở bài gradient, mũi tên chỉ đường xuống dốc, bạn đã thấy một viên bi lăn trên đồi sương mù. Bi là vị trí, đồi là loss, ngón tay chỉ hướng là gradient.
Giờ đến phần thật sự áp dụng. Trong huấn luyện, “tọa độ” không phải (x, y) mà là các weight của mạng nơ-ron. Mỗi bước gradient descent sẽ xoay các weight này để loss giảm.
Bài này tập trung vào thuật toán, tức cách máy thực sự đi từng bước. Bạn sẽ gặp ba biến thể bước: Vanilla, Momentum, Adam. Cùng một địa hình, ba tính cách đi khác nhau.
Vị trí
Vector weight θ = (w₁, w₂, ..., wₙ) của mạng.
Ngón tay
Gradient ∇L. Mỗi thành phần tương ứng một weight.
Bước
θ ← θ − η·∇L. Cập nhật tất cả weight cùng lúc.
Mặt loss có dạng thung lũng hẹp (một trục dốc, một trục thoải). Bạn bật Vanilla GD với learning rate vừa phải. Đường đi của weight sẽ như thế nào?
Hình minh họa
Mặt loss L(w₁, w₂) = 0.5·(w₁ − 1)² + 2·(w₂ + 0.5)². Đáy tại (1, −0.5), thung lũng hẹp theo trục w₂. Bấm vào bản đồ để đổi điểm xuất phát, chỉnh learning rate, rồi bấm “Tự chạy” để xem bi lăn.
Bước cơ bản nhất: weight ← weight − η · gradient. Trên thung lũng hẹp sẽ zigzag vì trục dốc bị nhảy lố.
Gợi ý: bấm vào bản đồ để đổi điểm xuất phát. Nền xanh = loss thấp, nền đỏ = loss cao.
Điều chỉnh learning rate
Cùng điểm xuất phát, cùng learning rate, 60 bước. Ba optimizer vẽ ba đường đi rất khác nhau trên mặt loss.
Giờ mổ xẻ CHÍNH XÁC một bước Vanilla GD ở điểm cụ thể: (w₁, w₂) = (−1.2, 1.5), η = 0.2. Bấm “Tiếp tục” để xem ba pha của một bước.
1. Tính loss tại weight hiện tại
Với cặp weight hiện tại, loss cho biết ta đang sai bao nhiêu.
“Càng cao = càng sai. Ta muốn đẩy con số này xuống càng gần 0 càng tốt.”
Một quyết định kỹ thuật quan trọng: mỗi bước gradient descent, ta dùng bao nhiêu dữ liệu để tính gradient? Ba lựa chọn, ba đánh đổi.
Bạn huấn luyện ResNet trên ImageNet (1,2 triệu ảnh). Dùng BATCH GD (toàn bộ dataset mỗi bước) thì điều gì xảy ra?
Khi nào bạn NÊN ưu tiên SGD thuần (batch size = 1) thay vì Mini-batch?
Giải thích
Ba công thức đóng gói toàn bộ thuật toán. Mỗi công thức đi kèm một visual nhỏ và một câu giải thích bằng tiếng Việt đời thường, để bạn đọc được chứ không chỉ nhìn mà sợ.
Vanilla Gradient Descent: công thức gốc
θ là vector toàn bộ weight. η là learning rate. ∇L(θ) là gradient của loss theo θ.
“Lấy weight cũ, trừ đi một bước theo hướng gradient, ra được weight mới sát đáy hơn. Đúng một dòng. Nhưng lặp nó hàng triệu lần thì huấn luyện được GPT.”
Mini-batch SGD: dùng một lô nhỏ dữ liệu thay vì cả tập
B là tập 32–256 mẫu random từ dataset. Gradient được tính trung bình trên B, không phải toàn bộ N mẫu.
“Thay vì đọc toàn bộ sách trước khi bước, ta đọc nhanh vài trang ngẫu nhiên, đủ để biết nên đi hướng nào. Gradient có ồn hơn một chút, nhưng 1000× nhanh hơn.”
Momentum: thêm “quán tính” vào bước
v là velocity, tức tổng luỹ kế có chiết khấu của gradient cũ cộng gradient mới. β thường là 0.9, giữ lại 90 % đà cũ mỗi bước (bước hiệu quả ổn định ≈ η / (1 − β)).
“Vanilla GD giống người đi bộ, mỗi bước chỉ nhìn ngay dưới chân. Momentum giống quả bóng có đà. Khi gradient chỉ cùng hướng nhiều bước liền, bóng tăng tốc. Khi gradient đổi chiều nhẹ, đà cũ lấn át → triệt tiêu zigzag.”
Để thật sự áp dụng ba công thức này, ta cần thêm hai mảnh ghép: (1) cách tính ∇L cho mạng sâu hàng tỉ tham số, và (2) cách chia tập dữ liệu thành các epoch/batch. Đó là nội dung của hai bài tiếp theo trong lộ trình.
- Gradient descent là vòng lặp ba dòng: tính loss → tính gradient → cập nhật weight theo θ ← θ − η·∇L. Toàn bộ huấn luyện là lặp vòng này hàng triệu lần.
- Vanilla GD hay zigzag trên thung lũng hẹp. Momentum thêm quán tính → đi mượt hơn. Adam tự thích nghi learning rate cho từng weight → mặc định trong deep learning hiện đại.
- Mỗi bước ta dùng một MINI-BATCH (32–256 mẫu) thay vì toàn bộ dataset. Đó là cân bằng vàng giữa độ chính xác và tốc độ, tận dụng song song hoá GPU.
Kiểm tra hiểu biết
Khi huấn luyện mạng nơ-ron, gradient descent làm gì ở mỗi bước?