Adam Optimizer
Adam kết hợp momentum với kích thước bước theo từng tham số, được điều chỉnh theo độ lớn gradient gần đây. Nội dung đề cập quy tắc cập nhật, giá trị mặc định, AdamW và Adam so với SGD.
Bộ tối ưu Adam, tên đầy đủ là Adaptive Moment Estimation, là một thuật toán tối ưu hóa dùng để huấn luyện mạng nơ-ron, cấp cho mỗi tham số một kích thước bước thích ứng riêng. Được Kingma và Ba giới thiệu trong bài báo Adam: Phương pháp tối ưu hóa ngẫu nhiên, thuật toán này mở rộng stochastic gradient descent (SGD) bằng cách duy trì các giá trị trung bình trượt của gradient trước đó và bình phương của chúng. Khả năng tiến bộ nhanh lúc đầu cùng các thiết lập mặc định dễ sử dụng khiến Adam trở thành bộ tối ưu khởi đầu phổ biến nhất trong deep learning; biến thể AdamW là lựa chọn tiêu chuẩn để huấn luyện Transformer và mô hình ngôn ngữ lớn.
Cách thức hoạt động của Adam#
Quá trình huấn luyện giảm thiểu hàm mất mát bằng cách liên tục cập nhật từng trọng số theo gradient của nó. SGD thông thường nhân mỗi gradient với cùng một learning rate. Adam duy trì hai giá trị bổ sung cho mỗi tham số và cập nhật chúng ở mỗi bước t dựa trên gradient hiện tại g:
- Moment thứ nhất (động lượng):
m = β1·m + (1 − β1)·g, giá trị trung bình giảm theo hàm mũ của các gradient, giúp bước cập nhật tiếp tục đi theo một hướng nhất quán. - Moment thứ hai:
v = β2·v + (1 − β2)·g², giá trị trung bình giảm dần của bình phương gradient, theo dõi độ lớn thường thấy của gradient đối với từng tham số. - Hiệu chỉnh độ chệch:
m̂ = m / (1 − β1^t)vàv̂ = v / (1 − β2^t), điều chỉnh sai lệch do cả hai giá trị trung bình khởi đầu bằng 0. - Cập nhật:
θ = θ − lr · m̂ / (√v̂ + ε).
Các giá trị mặc định trong bài báo, cũng được PyTorch dùng trong torch.optim.Adam, là lr = 0.001, β1 = 0.9, β2 = 0.999 và ε = 1e-8. Chia cho √v̂ giúp chuẩn hóa mỗi bước theo độ lớn gradient điển hình của tham số, nhờ đó các bước luôn gần với learning rate dù gradient rất nhỏ hay rất lớn; đồng thời, bước cập nhật giảm theo những hướng nhiễu, nơi gradient dương và âm triệt tiêu lẫn nhau bên trong m̂. Đoạn mã dưới đây so sánh bước đầu tiên của SGD và Adam trên hai tham số có gradient chênh lệch nhau 1.000 lần về độ lớn:
import torch
# Two parameters whose gradients differ in scale by 1,000x
scale = torch.tensor([1000.0, 1.0])
for name, optimizer_cls in [("SGD", torch.optim.SGD), ("Adam", torch.optim.Adam)]:
w = torch.zeros(2, requires_grad=True)
optimizer = optimizer_cls([w], lr=0.001)
loss = (scale * w).sum() # gradient is [1000, 1]
loss.backward()
optimizer.step()
print(f"{name} first step: {[round(v, 4) for v in w.tolist()]}")SGD đưa tham số thứ nhất đến -1.0 và tham số thứ hai đến -0.001, chênh lệch 1.000 lần theo đúng độ lớn gradient. Adam cập nhật cả hai một khoảng bằng chính learning rate, -0.001, vì bước cập nhật đã chuẩn hóa phụ thuộc vào hướng và tính nhất quán của gradient, thay vì độ lớn thô của gradient.
Adam và AdamW#
Theo cách triển khai phổ biến, Adam áp dụng weight decay, một dạng regularization, dưới dạng số hạng phạt L2 cộng vào gradient; sau đó, số hạng phạt này cũng bị chia cho √v̂ như mọi thành phần khác, khiến các trọng số có gradient lớn hầu như không được regularization. Weight decay tách rời của Loshchilov và Hutter khắc phục vấn đề này bằng cách trực tiếp thu nhỏ trọng số ở mỗi bước, tách biệt với cập nhật thích ứng. Trong các thử nghiệm của bài báo, AdamW cải thiện khả năng khái quát hóa của Adam trên phân loại ảnh và có thể dùng qua torch.optim.AdamW.
Adam và SGD#
SGD có momentum sử dụng một learning rate chung và lưu một buffer cho mỗi tham số, còn Adam lưu hai buffer — 8 byte mỗi tham số ở độ chính xác 32-bit — tương đương 56 GB trạng thái bộ tối ưu cho model 7 tỷ tham số. Adam thường tiến bộ nhanh hơn lúc đầu, ít nhạy với learning rate hơn và huấn luyện Transformer đáng tin cậy hơn nhiều so với SGD. SGD được tinh chỉnh tốt thường đạt độ chính xác cuối cùng tương đương hoặc cao hơn trên model ảnh tích chập; Wilson và cộng sự nhận thấy các phương pháp thích ứng thường khái quát hóa kém hơn SGD trên những tác vụ phân loại ảnh và tác vụ ngôn ngữ mà họ thử nghiệm.
Quá trình huấn luyện YOLO của Ultralytics phản ánh sự đánh đổi này: mặc định, optimizer="auto" chọn AdamW với learning rate ban đầu được điều chỉnh theo số lớp cho các lượt chạy tối đa 10.000 iteration, sau đó chuyển sang MuSGD, phương pháp kết hợp SGD và Muon, cho các lịch trình dài hơn. Thiết lập rõ bộ tối ưu cũng yêu cầu đặt learning rate, vì mặc định lr0=0.01 phù hợp với SGD và cao gấp mười lần learning rate thường dùng cho Adam.
from ultralytics import YOLO
# Tải model YOLO26n đã tiền huấn luyện
model = YOLO("yolo26n.pt")
# Huấn luyện bằng AdamW với learning rate ban đầu phù hợp với Adam
results = model.train(data="coco8.yaml", epochs=5, optimizer="AdamW", lr0=0.001)Khi YOLO26 huấn luyện bằng bộ tối ưu thuộc họ Adam, tham số momentum (mặc định là 0.937) thiết lập β1, còn β2 giữ nguyên ở mức 0.999.
Adam và các bộ tối ưu liên quan#
- AdaGrad: Chia mỗi bước cho căn bậc hai của tổng bình phương gradient trong quá khứ, khiến kích thước bước chỉ có thể giảm. Phương pháp này phù hợp với đặc trưng thưa nhưng làm chậm các lượt huấn luyện dài.
- RMSProp: Thay tổng tích lũy của AdaGrad bằng giá trị trung bình giảm theo hàm mũ của bình phương gradient. Về cơ bản, Adam là RMSProp cộng thêm momentum và hiệu chỉnh độ chệch.
- Muon: Bộ tối ưu dành cho các ma trận trọng số 2D của lớp ẩn, trực giao hóa mỗi cập nhật momentum bằng các vòng lặp Newton–Schulz và chỉ lưu một buffer trạng thái cho mỗi tham số — bằng một nửa trạng thái bộ tối ưu của Adam.










