Momentum (Optimization)
Оптимизация с импульсом использует предыдущие градиенты, чтобы ускорить обучение модели, сгладить шумные обновления и улучшить сходимость, сохраняя баланс с шагом обучения.
Импульс — это метод оптимизации, который добавляет обучению на основе градиентов память о предыдущих обновлениях. Сочетая текущий градиент с затухающей историей предыдущих градиентов, метод ускоряет движение в устойчивых направлениях и сокращает колебания. Это помогает моделям машинного обучения эффективнее минимизировать целевую функцию обучения. Поисковая оптимизация касается видимости сайта, а импульс — численных обновлений параметров модели.
Как работает импульс#
При градиентном спуске модель изменяет свои веса в направлении, противоположном градиенту, — направлению наиболее быстрого роста функции потерь. Классический импульс, также называемый импульсом Поляка или методом тяжёлого шарика, добавляет инерцию этому движению. Борис Поляк представил этот метод в своей работе 1964 года об ускорении итерационных методов.
Оптимизатор хранит буфер скорости с накопленным значением для каждого параметра. При каждом обновлении старый буфер умножается на коэффициент импульса, к результату прибавляется текущий градиент, а затем полученный буфер умножается на шаг обучения и вычитается из весов. В нейронных сетях эти градиенты вычисляются с помощью обратного распространения ошибки; оптимизатор сохраняет буфер между обновлениями.
Импульс особенно полезен на вытянутых поверхностях функции потерь, где кривизна велика поперёк долины и мала вдоль её дна. Градиенты, которые снова и снова направлены вдоль долины, накапливаются, а чередующиеся компоненты поперёк неё частично взаимно компенсируются. При стохастическом градиентном спуске эта память также сглаживает колебания между мини-батчами. Динамика импульса для квадратичной функции потерь объясняет как ускорение, так и колебания, которые могут возникать рядом с минимумом.
Импульс, шаг обучения и связанные методы#
Коэффициент импульса, обычно обозначаемый бета или мю, чаще всего находится между нулём и единицей. При нулевом коэффициенте получается обычный градиентный спуск; чем ближе значение к единице, тем дольше сохраняются предыдущие градиенты. Часто начинают со значения 0.9. При ненормированном буфере скорости и постоянном градиенте накопленная скорость при коэффициенте 0.9 стремится к десятикратному значению градиента, а при 0.99 — к стократному. Поэтому импульс и шаг обучения сильно взаимодействуют при настройке гиперпараметров.
Слишком агрессивное сочетание приводит к перескоку минимума: обновления снова и снова пересекают его, вызывая колебания функции потерь или расходимость. Это происходит даже для гладких квадратичных целевых функций. Расписание шага обучения меняет величину обновлений в ходе обучения, а импульс определяет, насколько долго сохраняется история направления.
Два тесно связанных алгоритма оптимизации по-разному используют эту историю:
- Импульс Нестерова вычисляет градиент в позиции упреждения, полученной с учётом сохранённой скорости, позволяя градиенту скорректировать предполагаемое движение.
- Adam сочетает экспоненциально взвешенное среднее градиента со средним квадратом градиента, масштабируя обновления отдельно для каждого параметра. Параметр
beta1управляет памятью градиентов.
Минимальный пример на PyTorch#
В этом примере PyTorch сравниваются одинаковые начальные точки и шаги обучения для вытянутой квадратичной целевой функции. Официальная реализация SGD автоматически управляет буфером импульса.
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}")После 100 обновлений значение функции потерь составляет примерно 0.056531 без импульса и 0.000216 с импульсом. Накопленная история направлений ускоряет движение вдоль координаты с пологим склоном.
Применение при обучении моделей компьютерного зрения#
Импульс помогает обучать свёрточные нейронные сети для классификации изображений и обнаружения объектов. В обучении Ultralytics YOLO импульс Нестерова включается при выборе optimizer="SGD", а параметр momentum управляет историей обновлений, которая сохраняется. Реализация тренера передаёт этот коэффициент оптимизатору с помощью nesterov=True.
Знаковый пример применения — исходная процедура обучения ResNet на ImageNet. В этих моделях использовался SGD с импульсом 0.9, размером пакета 256, затуханием весов 0.0001 и начальным шагом обучения 0.1, который уменьшался в десять раз при выходе ошибки на плато.










