Learning Rate
Learning rate điều chỉnh quy mô của mỗi lần cập nhật trọng số trong quá trình huấn luyện. Tìm hiểu vì sao giá trị quá cao khiến quá trình phân kỳ, còn quá thấp làm đình trệ, cùng các lịch warmup, decay và cách tuning.
Learning rate là siêu tham số quy định mức dịch chuyển của trọng số model ở mỗi bước huấn luyện. Gradient descent tính gradient của hàm loss, chỉ hướng làm loss tăng nhanh nhất, rồi cập nhật từng trọng số theo công thức w ← w − η × gradient, trong đó η (eta) là learning rate. Step size là từ đồng nghĩa, và trong code thường được gọi là lr. Learning rate được chọn phù hợp giúp mạng neural hội tụ nhanh đến nghiệm tốt; nếu chọn không phù hợp, quá trình huấn luyện sẽ phân kỳ hoặc tiến triển chậm chạp. Vì vậy, bài báo về learning rate chu kỳ của Leslie Smith gọi đây là siêu tham số quan trọng nhất cần tinh chỉnh cho mạng sâu.
Quá cao, quá thấp và vừa đủ#
Learning rate là sự đánh đổi giữa tốc độ và độ ổn định:
- Quá cao: Mỗi bước vượt quá điểm cực tiểu. Loss dao động, tăng vọt hoặc tăng dần cho đến khi trở thành NaN, khiến quá trình huấn luyện phân kỳ.
- Quá thấp: Mỗi bước chỉ dịch chuyển trọng số một chút. Loss giảm chậm, quá trình huấn luyện cần nhiều epoch hơn để hội tụ, và lần chạy với ngân sách cố định sẽ kết thúc trong trạng thái underfit.
- Được chọn phù hợp: Loss giảm đều và ổn định gần điểm cực tiểu.
Đoạn script PyTorch dưới đây tối thiểu hóa loss w² từ cùng một điểm bắt đầu với bốn learning rate:
import torch
# Minimize loss = w**2 (lowest at w = 0) from the same start with four learning rates
for lr in (0.01, 0.1, 0.9, 1.1):
w = torch.tensor(5.0, requires_grad=True)
optimizer = torch.optim.SGD([w], lr=lr)
path = []
for step in range(20):
optimizer.zero_grad()
loss = w**2
loss.backward()
optimizer.step() # w = w - lr * gradient
path.append(w.item())
print(f"lr={lr}: first steps {[round(v, 2) for v in path[:3]]}, after 20 steps w={path[-1]:.3f}")Với 0.01, trọng số chỉ giảm từ 5 xuống 3.338 sau 20 bước; với 0.1, trọng số đạt 0.058. Với 0.9, dấu của trọng số đảo ở mỗi bước (−4.0, 3.2, −2.56) nhưng vẫn hội tụ về 0.058; còn với 1.1, mỗi bước vượt quá xa hơn và trọng số tăng lên 191.688. Gradient descent trên hàm bậc hai chỉ ổn định khi learning rate nhỏ hơn 2 chia cho độ cong của loss, tức đạo hàm bậc hai của loss. Độ cong của w² là 2, nên giới hạn ở đây chính xác là 1.0; learning rate 0.5 đưa trọng số đến điểm cực tiểu chỉ sau một bước. Trong mạng thực tế, hướng dốc nhất của loss đặt ra giới hạn tương tự, vì vậy learning rate phù hợp với một model hoặc batch size có thể khiến model khác phân kỳ.
Lịch learning rate#
Quá trình huấn luyện hiếm khi giữ nguyên một learning rate từ đầu đến cuối. Lịch learning rate thay đổi giá trị này theo thời gian:
- Warmup: Bắt đầu với learning rate nhỏ rồi tăng dần trong vài epoch hoặc iteration đầu tiên, giúp gradient lớn và thất thường của các iteration đầu không làm mất ổn định quá trình huấn luyện.
- Giảm theo bước: Chia learning rate cho một hệ số cố định, thường là 10, tại các epoch đã định hoặc khi loss trên tập validation chững lại.
- Giảm tuyến tính và cosine: Giảm learning rate một cách mượt mà về giá trị nhỏ ở cuối. Cosine annealing đi theo nửa chu kỳ cosine; biến thể khởi động lại ấm của phương pháp này đưa learning rate trở lại mức cao khi bắt đầu mỗi chu kỳ mới.
- Chính sách chu kỳ và một chu kỳ: Di chuyển learning rate giữa giới hạn dưới và giới hạn trên trong quá trình huấn luyện.
Các bước lớn lúc đầu nhanh chóng đưa trọng số đến vùng tốt, còn các bước nhỏ về sau giúp trọng số ổn định tại một điểm cực tiểu thay vì dao động quanh đó. YOLO26 được huấn luyện trong Ultralytics bắt đầu ở lr0, warm-up trong warmup_epochs (mặc định là 3), rồi giảm tuyến tính xuống lr0 * lrf, hoặc giảm theo cosine với cos_lr=True. Với giá trị mặc định optimizer="auto", trainer tự chọn cả optimizer lẫn learning rate ban đầu: dùng MuSGD ở mức 0.01 cho các lần chạy dài hơn 10,000 iteration, còn lại dùng AdamW với learning rate được điều chỉnh theo số lớp; vì vậy, lr0 chỉ áp dụng khi optimizer được thiết lập rõ ràng:
from ultralytics import YOLO
# Tải model YOLO26 nano đã pretrained
model = YOLO("yolo26n.pt")
# Optimizer được thiết lập rõ ràng sẽ khiến lr0 được áp dụng; learning rate giảm theo cosine xuống lr0 * lrf
results = model.train(data="coco8.yaml", epochs=10, optimizer="SGD", lr0=0.01, lrf=0.01, cos_lr=True)Chọn giá trị khởi đầu#
Các giá trị khởi đầu thường dùng là 0.01 đến 0.1 cho stochastic gradient descent (SGD) có momentum và 0.001 cho optimizer Adam, mức mặc định được đề xuất trong bài báo Adam. Fine-tuning model pretrained sử dụng learning rate nhỏ hơn so với huấn luyện từ đầu, vì các bước lớn sẽ ghi đè đặc trưng giúp transfer learning hoạt động hiệu quả.
Phép thử dải learning rate trong cùng bài báo về cyclical learning rate, được đóng gói trong fastai dưới dạng công cụ tìm learning rate, giúp tìm giá trị phù hợp chỉ trong một lần chạy ngắn. Công cụ tăng learning rate sau mỗi mini-batch đồng thời ghi lại loss; dải hữu ích là nơi loss giảm nhanh nhất, trước khi bắt đầu bùng nổ.
Learning Rate và các thuật ngữ liên quan#
- Thuật toán tối ưu hóa: Quy tắc cập nhật sử dụng learning rate. Các optimizer thích ứng như Adam điều chỉnh bước cập nhật của từng trọng số theo lịch sử gradient riêng, nhưng vẫn nhân mỗi bước với một learning rate toàn cục.
- Momentum: Một hyperparameter riêng, cộng một phần của lần cập nhật trước vào lần cập nhật hiện tại, giúp làm mượt quỹ đạo và tăng kích thước bước hiệu dụng theo các hướng nhất quán.
- Weight decay: Một thành phần regularization kéo chính các trọng số về 0 trong mỗi bước, trong khi learning rate decay giảm kích thước bước theo thời gian.
- Batch size: Số lượng mẫu được lấy trung bình để tính mỗi gradient. Batch lớn hơn tạo gradient ít nhiễu hơn và cho phép dùng learning rate lớn hơn; quy tắc scale tuyến tính nhân learning rate với k khi batch size tăng k lần.










