Momentum (Optimization)
Tối ưu hóa động lượng sử dụng các gradient trước đó để tăng tốc quá trình huấn luyện model, làm mượt các lần cập nhật nhiễu và cải thiện khả năng hội tụ, đồng thời cân bằng tốc độ học.
Động lượng là một kỹ thuật tối ưu hóa giúp quá trình huấn luyện dựa trên gradient ghi nhớ các lần cập nhật trước đó. Bằng cách kết hợp gradient hiện tại với lịch sử suy giảm của các gradient trước, kỹ thuật này tăng tốc theo những hướng nhất quán và giảm chuyển động qua lại. Điều này giúp các model học máy tối thiểu hóa hàm mục tiêu huấn luyện hiệu quả hơn. Tối ưu hóa công cụ tìm kiếm liên quan đến khả năng hiển thị của website; động lượng liên quan đến các lần cập nhật số học đối với tham số model.
Cách thức hoạt động của động lượng#
Trong quá trình gradient descent, model điều chỉnh trọng số theo hướng ngược với gradient—hướng mà hàm mất mát tăng nhanh nhất. Động lượng cổ điển, còn gọi là động lượng Polyak hoặc phương pháp quả cầu nặng, bổ sung quán tính cho chuyển động này. Boris Polyak giới thiệu phương pháp này trong công trình năm 1964 về tăng tốc các phương pháp lặp.
Optimizer duy trì một bộ đệm vận tốc, với một giá trị tích lũy cho mỗi tham số. Mỗi lần cập nhật nhân bộ đệm cũ với hệ số động lượng, cộng thêm gradient hiện tại, rồi trừ bộ đệm thu được sau khi nhân với tốc độ học khỏi các trọng số. Trong mạng nơ-ron, lan truyền ngược cung cấp các gradient đó; optimizer giữ lại bộ đệm giữa các lần cập nhật.
Động lượng đặc biệt hữu ích trên các bề mặt mất mát kéo dài, nơi độ cong dốc theo chiều ngang qua thung lũng và thoải theo chiều dọc đáy thung lũng. Các gradient liên tục hướng dọc theo thung lũng sẽ tích lũy, trong khi những thành phần đổi hướng qua lại theo chiều ngang sẽ triệt tiêu một phần lẫn nhau. Khi sử dụng stochastic gradient descent, bộ nhớ này cũng làm mượt các dao động giữa các mini-batch. Động lực học của động lượng trên hàm mất mát bậc hai giải thích cả khả năng tăng tốc lẫn các dao động mà phương pháp này có thể gây ra gần điểm cực tiểu.
Động lượng, tốc độ học và các phương pháp liên quan#
Hệ số động lượng, thường được ký hiệu là beta hoặc mu, thường nằm trong khoảng từ không đến một. Giá trị không tương đương với gradient descent thông thường; các giá trị gần một hơn giữ lại gradient cũ lâu hơn. 0.9 là giá trị khởi đầu phổ biến. Với bộ đệm vận tốc chưa chuẩn hóa và gradient không đổi, vận tốc tích lũy tiến tới mức gấp mười lần gradient đó ở 0.9, so với gấp 100 lần ở 0.99. Do đó, động lượng và tốc độ học tương tác mạnh trong quá trình tinh chỉnh siêu tham số.
Sự kết hợp quá mạnh sẽ gây ra hiện tượng vượt quá: các lần cập nhật liên tục vượt qua điểm cực tiểu, khiến giá trị mất mát dao động hoặc phân kỳ. Hiện tượng này xảy ra ngay cả với các hàm mục tiêu bậc hai trơn. Lịch trình tốc độ học thay đổi độ lớn của lần cập nhật trong quá trình huấn luyện, còn động lượng quyết định lịch sử hướng được duy trì ở mức nào.
Hai thuật toán tối ưu hóa có liên quan mật thiết sử dụng lịch sử này theo những cách khác nhau:
- Động lượng Nesterov tính gradient tại vị trí dự đoán trước dựa trên vận tốc được giữ lại, cho phép gradient điều chỉnh chuyển động dự kiến.
- Adam kết hợp trung bình gradient có trọng số hàm mũ với trung bình bình phương gradient, giúp điều chỉnh tỷ lệ cập nhật riêng cho từng tham số.
beta1của Adam kiểm soát bộ nhớ gradient.
Ví dụ PyTorch tối giản#
Ví dụ PyTorch này so sánh các điểm bắt đầu và tốc độ học giống nhau trên một hàm mục tiêu bậc hai kéo dài. Triển khai SGD chính thức tự động quản lý bộ đệm động lượng.
import torch
# Curvature is 50 times greater along the second coordinate.
scale = torch.tensor([1.0, 50.0])
for momentum in (0.0, 0.9):
weights = torch.tensor([5.0, 1.0], requires_grad=True)
optimizer = torch.optim.SGD([weights], lr=0.015, momentum=momentum)
for step in range(100):
optimizer.zero_grad()
loss = (scale * weights.square()).sum()
loss.backward()
optimizer.step()
final_loss = (scale * weights.square()).sum().item()
print(f"Momentum {momentum}: loss = {final_loss:.6f}")Sau 100 lần cập nhật, giá trị mất mát xấp xỉ 0.056531 khi không dùng động lượng và 0.000216 khi dùng động lượng. Lịch sử hướng tích lũy giúp tăng tốc tiến trình theo tọa độ thoải.
Ứng dụng trong huấn luyện thị giác máy tính#
Động lượng hỗ trợ huấn luyện mạng nơ-ron tích chập cho các tác vụ phân loại ảnh và phát hiện đối tượng. Tính năng huấn luyện Ultralytics YOLO bật động lượng Nesterov khi chọn optimizer="SGD", còn thiết lập momentum kiểm soát lịch sử cập nhật được giữ lại. Phần triển khai trainer truyền hệ số đó cho optimizer bằng nesterov=True.
Một ứng dụng tiêu biểu là quy trình huấn luyện ResNet ban đầu trên ImageNet. Các model đó sử dụng SGD với động lượng 0.9, kích thước batch là 256, weight decay 0.0001 và tốc độ học ban đầu 0.1; tốc độ học giảm mười lần khi lỗi chững lại.










