W3 · Training / inference workflow
AdamW: cập nhật tham số từ gradient
AdamW cập nhật trọng số từ gradient bằng trung bình trượt của gradient và của gradient bình phương, hiệu chỉnh ở các bước đầu, kèm suy giảm trọng số tách riêng.
1Định nghĩa
Bước cập nhật tham số (optimizer step) là bước thực sự sửa các ma trận trọng số sau khi đã có gradient từ lượt backward. Trong huấn luyện LLM, bộ tối ưu tiêu chuẩn là AdamW: thay vì trừ thẳng gradient thô vốn dao động mạnh, AdamW giữ cho mỗi tham số hai số nhớ, m (trung bình trượt của gradient, thể hiện hướng đi trung bình) và v (trung bình trượt của gradient bình phương, thể hiện độ biến thiên), để tự co giãn bước nhảy cho từng phần tử.
Song song, AdamW áp dụng suy giảm trọng số tách rời (decoupled weight decay) kéo nhẹ trọng số về gần 0, rồi nhân với tốc độ học (learning rate) theo lịch của vòng lặp huấn luyện. Vì phải giữ thêm m và v cho mọi tham số được huấn luyện, trạng thái AdamW chiếm một phần lớn ngân sách bộ nhớ lúc huấn luyện, và được bỏ đi khi xuất mô hình để phục vụ suy luận.
Ví dụ đời thường: AdamW giống một người lái tàu kinh nghiệm chỉnh bánh lái theo quán tính thay vì giật cục theo từng cơn gió lẻ: người đó giữ đà hướng đi của các nhịp trước (m), vừa tự giảm tay lái ở những khúc đường đang rung lắc mạnh (v) để tàu tiến về đích êm. Khác người lái, bộ tối ưu làm điều đó riêng cho từng tham số, hàng tỉ ‘bánh lái’ cùng lúc.
2Luồng
Đây là ô 3D. Mũi tên vào mang gradient (cùng shape trọng số); mũi tên ra mang trọng số mới và hai tensor m, v được giữ lại cho bước sau. Vòng lặp đóng lại ở ô 3E: trọng số mới đi ngược lên cột 2 cho lô kế tiếp.
- Gradient hợp lệ
Từ ô 3B/3C; có thể đã cộng dồn, cắt chuẩn (clipping) và kết hợp giữa thiết bị.
- Cập nhật m và v
m = β₁m + (1 − β₁)g; v = β₂v + (1 − β₂)g².
- Hiệu chỉnh và tính bước
Bias correction, chia m̂ cho căn v̂ cộng ε, nhân lr.
- Áp weight decay và ghi trọng số
Trừ bước cập nhật, đồng thời thu nhẹ trọng số; trọng số mới dùng cho forward kế tiếp.
Mã Mermaid
flowchart TD
step1["Gradient hợp lệ"]
step2["Cập nhật m và v"]
step3["Hiệu chỉnh và tính bước"]
step4["Áp weight decay và ghi trọng số"]
step1 --> step2
step2 --> step3
step3 --> step4 3Giải pháp
Vị trí trên sơ đồ: ô 3D "AdamW" trong cột 3 · Học từ sai số, ngay sau backward (ô 3B và 3C) và trước ô 3E (vòng lặp). Đây là nơi duy nhất trong sơ đồ mà trọng số thực sự thay đổi.
Vấn đề cần giải. Backward cho biết hướng giảm loss tại điểm hiện tại. Cách đơn giản nhất là trọng số mới = trọng số cũ − lr × gradient (SGD). Cách này có hai nhược điểm: gradient của từng batch dao động mạnh vì mỗi batch khác nhau; và các tham số có độ lớn gradient rất khác nhau nhưng bị bước nhảy cùng hệ số lr. AdamW giải quyết cả hai bằng cách làm mượt và chuẩn hóa bước theo từng tham số.
Khái niệm tối thiểu. Với mỗi tham số θ ở bước t, gradient g. Bộ tối ưu giữ m và v, khởi đầu 0. m = β₁ × m + (1 − β₁) × g (trung bình trượt của g), v = β₂ × v + (1 − β₂) × g² (trung bình trượt của g bình phương). Hiệu chỉnh: m̂ = m / (1 − β₁^t), v̂ = v / (1 − β₂^t). Cập nhật: θ ← θ × (1 − lr × λ) − lr × m̂ / (căn v̂ + ε), trong đó λ là hệ số suy giảm trọng số.
Ví dụ có số, bước đầu tiên (minh họa, tính tay). Dùng gradient của bài backward cho ma trận LM head U. Chọn lr = 0,01, β₁ = 0,9, β₂ = 0,999, ε = 1e-8, λ = 0,01. Phần tử U[0, cá] = 0,4 có g = −0,8265. Bước 1: m = 0,1 × g = −0,08265; v = 0,001 × g² = 0,000683. Hiệu chỉnh: m̂ = m / 0,1 = −0,8265; v̂ = v / 0,001 = 0,6831 nên căn v̂ = 0,8265. Tỉ số m̂ / căn v̂ = −1. Cập nhật: θ = 0,4 × (1 − 0,0001) − 0,01 × (−1) = 0,39996 + 0,01 = 0,40996.
Phần tử khác: U[1, pad] = 0 có g = +0,2326, nhỏ hơn khoảng 3,6 lần. Hiệu chỉnh cho tỉ số m̂ / căn v̂ = +1 nên θ = 0 − 0,01 = −0,01. Hai tham số có gradient khác nhau khoảng 3,6 lần nhưng bước đầu đều dịch khoảng 0,01 theo hướng ngược dấu gradient (phần suy giảm trọng số rất nhỏ nên chỉ làm lệch ở chữ số thập phân thứ tư). Trong khi đó SGD với cùng lr = 0,01 sẽ dịch 0,0083 và 0,0023, tỉ lệ theo gradient. Ở những bước sau, độ lớn bước phụ thuộc cả lịch sử gradient, nên sẽ không còn luôn bằng lr.
Tác dụng của bias correction. Nếu bỏ hiệu chỉnh, tỉ số ở bước đầu là m / căn v = −0,08265 / 0,02613 ≈ −3,16, tức là bước lớn gấp 3,16 lần lr. Hiệu chỉnh bù việc m, v bắt đầu từ 0 nên thấp hơn giá trị thực, và dần biến mất khi t lớn.
Cách đọc kết quả. Nếu cập nhật cả 14 phần tử của U theo cách trên với h giữ nguyên, logit của cá tăng và xác suất của cá từ 0,1735 lên khoảng 0,1823; loss từ 1,752 xuống khoảng 1,702. Đây là số minh họa của một bước trên một vị trí, không phải đường cong học của một mô hình thật. Điều có thể kết luận: một bước đúng hướng làm loss tại điểm này giảm. Điều không thể kết luận: nhiều bước sẽ luôn giảm, hay lr = 0,01 là phù hợp cho mô hình thật.
Thực thi và chi phí bộ nhớ. Dùng cài đặt AdamW của framework với nhóm tham số rõ ràng (ví dụ không áp weight decay lên norm và bias nếu recipe yêu cầu); bản fused giảm overhead. Mỗi tham số cần thêm hai tensor m và v cùng shape, thường lưu bằng kiểu số 32 bit: với một tỉ tham số là 8 GB cho riêng m và v, chưa tính trọng số và gradient (xem ZeRO để chia nhỏ phần này). Lịch learning rate đổi theo bước (warmup rồi suy giảm) theo recipe. Không đổi siêu tham số chỉ để rút ngắn thời gian bước mà bỏ qua hội tụ; với mixed precision cần kiểm tra kiểu số của m, v và bản sao trọng số chính.
Để chạy một bước AdamW trên gradient thật và quan sát m, v, mở giai đoạn 6 · AdamW của Bài Lab tổng hợp. Hãy dự đoán trước độ lớn bước đầu của một tham số (gần lr?) rồi đối chiếu.
4Profiling
- Độ lớn cập nhật và chuẩn gradient
Kiểm tra trước một bước trên vài tham số bằng tay như ví dụ, rồi theo dõi trọng số thay đổi bao nhiêu mỗi bước (tỉ lệ độ lớn cập nhật so với độ lớn trọng số) và chuẩn gradient theo thời gian. Quan sát tràn số, NaN hoặc phân kỳ (loss tăng liên tục). Các chỉ báo này cho biết huấn luyện có ổn định không, không cho biết mô hình tốt đến đâu.
- Bộ nhớ và thời gian của bộ tối ưu
Đo kích thước m, v, bản sao trọng số chính (nếu dùng mixed precision) và thời gian chạy bước cập nhật trong tổng thời gian một bước. So fused với không fused trên cùng recipe, cùng phần cứng, và đừng kết luận về tốc độ trên mô hình lớn từ một mô hình nhỏ.
- Tiếp tục huấn luyện có đúng không
Lưu và nạp lại cả trọng số lẫn m, v và bước t, rồi so các bước kế tiếp với một lần chạy liền mạch. Hai chuỗi giá trị phải trùng nhau trong sai số số học, nếu các nguồn ngẫu nhiên khác (thứ tự dữ liệu, dropout) cũng được khôi phục.
Mẹo đo lường: ghim số liệu trên workload thật, ghi cả p50/p95/p99 thay vì chỉ trung bình, và luôn ghi lại điều kiện chạy (batch, cache, đồng thời, phần cứng) trước và sau khi tối ưu. Số đo thiếu điều kiện chạy thì không so sánh được.
5Ví dụ
Hai tham số, gradient khác nhau
Một tham số có g = −0,8265 và một tham số khác g = +0,2326. Dự đoán bước đầu của AdamW với lr = 0,01. Đáp án: cả hai dịch khoảng 0,01, theo chiều ngược dấu gradient; với SGD thì lần lượt khoảng 0,0083 và 0,0023. Đây là tính chất ‘chuẩn hóa bước theo từng tham số’ của Adam ở đầu quá trình.
Tiếp tục huấn luyện
Nếu chỉ nạp trọng số mà bỏ m, v, bộ tối ưu bắt đầu như bước đầu tiên: hiệu chỉnh bù với t = 1 lại cho bước dài khoảng lr dù mô hình đã huấn luyện lâu, nên quá trình không tương đương với việc tiếp tục liền mạch. Bản lưu để tiếp tục huấn luyện phải gồm cả m, v và bước.
Tự kiểm tra: weight decay tách rời
Với θ = 0,4, lr = 0,01, λ = 0,01, phần suy giảm trọng số trong một bước là bao nhiêu và có phụ thuộc gradient không? Bằng θ × lr × λ = 0,4 × 0,01 × 0,01 = 0,00004; không phụ thuộc gradient, đó là ý nghĩa của ‘tách rời’. Trong Adam gốc, phần phạt đó được cộng vào gradient và bị chuẩn hóa chung với nó.
6Thuật ngữ
- First và second moments (m, v)
- m là trung bình trượt của gradient (hướng đi), v là trung bình trượt của gradient bình phương (độ biến thiên); mỗi tham số có một cặp m, v riêng.
- Bias correction
- Chia m cho (1 − β₁^t) và v cho (1 − β₂^t) để bù việc m, v khởi đầu bằng 0 làm chúng thấp ở những bước đầu.
- Learning rate (lr)
- Hệ số điều khiển độ dài bước cập nhật; đổi theo lịch (warmup rồi giảm dần) trong vòng huấn luyện.
- Decoupled weight decay
- Kéo trọng số về 0 bằng một bước riêng θ ← θ(1 − lr × λ), không trộn vào gradient hay moment như Adam gốc.
- β₁, β₂, ε
- β₁ (thường 0,9) và β₂ (thường 0,999) là hệ số nhớ của m và v; ε (thường 1e-8) tránh chia cho 0.
Glossary (6)
- Checkpoint
- Bản lưu trạng thái; để tiếp tục huấn luyện phải lưu cả m, v và bước, không chỉ trọng số.
- Overhead
- Chi phí phụ ngoài phép tính chính, ví dụ thời gian chạy bộ tối ưu trên mọi tham số.
- Warmup
- Giai đoạn đầu tăng dần learning rate từ nhỏ lên giá trị đích, để các bước đầu chưa quá lớn.
- Forward pass
- Lượt tính xuôi dùng trọng số vừa cập nhật.
- Backward pass
- Lượt tính gradient cung cấp g cho AdamW.
- Hyperparameter
- Tham số do người huấn luyện chọn (lr, β₁, β₂, λ), không được học từ dữ liệu.
