Метод инерции Поляка
Материал из MachineLearning.
| | Статья написана с использованием LLM Gemini 3.1 Pro Preview и проверена участником Polina Khadralinova |
Промпт приводится полностью в Обсуждение:Метод инерции Поляка
Содержание |
Метод инерции Поляка (Momentum)
Метод инерции Поляка (также известный как Heavy Ball method или Momentum) — это популярная модификация алгоритма градиентного спуска, предложенная советским математиком Борисом Теодоровичем Поляком в 1964 году. Этот метод значительно ускоряет сходимость при обучении моделей машинного обучения (включая глубокие нейронные сети), решая фундаментальные проблемы классического градиентного спуска.
Физическая интуиция: Тяжёлый шарик в овраге
Чтобы понять суть метода, давайте отвлечёмся от строгой математики и представим себе физическую картину.
Обычный градиентный спуск можно сравнить с человеком, который спускается с горы в густом тумане с завязанными глазами. На каждом шаге он просто нащупывает ногой, где уклон максимален, и делает шаг туда. У него нет памяти: каждый новый шаг не зависит от предыдущего. Из-за этого на сложном ландшафте его путь будет очень дёрганым.
Метод Поляка меняет правила игры. Представьте себе тяжёлый металлический шарик, который мы отпускаем катиться на дно оврага.
- Ландшафт — это поверхность нашей функции потерь
(или эмпирического риска
).
- Уклон ландшафта в данной точке — это градиент
, который создаёт силу, тянущую шарик вниз.
- Масса шарика задаёт его инерцию. Если шарик уже разогнался в определённом направлении, он продолжит двигаться по инерции, даже если локальный уклон вдруг изменится.
Благодаря этой массе шарик плавно сглаживает неровности рельефа и стремительно несётся к глобальному минимуму, накапливая скорость на затяжных спусках.
Математическая формулировка
В классическом градиентном спуске вектор весов обновляется только на основе текущего антиградиента с темпом обучения (шагом)
:
В методе Momentum мы вводим новую переменную — вектор скорости (вектор импульса). Теперь градиент не меняет напрямую веса
, он лишь изменяет скорость
, а уже скорость двигает веса.
Математически шаг оптимизатора записывается следующей системой уравнений (в форме экспоненциального скользящего среднего):
Где:
-
— параметры (веса) модели.
-
— накопленная скорость (импульс).
-
— вектор градиента функции потерь в текущей точке.
-
— размер шага (learning rate).
-
— коэффициент инерции (momentum decay, обычно берётся равным
). Он играет роль силы трения: если бы
, наш шарик катился бы вечно, никогда не останавливаясь. При
шарик теряет часть энергии и в итоге оседает на дне.
Преимущества метода
1. Преодоление «оврагов»
Функции потерь часто имеют форму узких оврагов (когда по одной оси градиент огромный, а по другой — почти нулевой). Классический градиентный спуск начинает метаться от стенки к стенке (зигзаги), продвигаясь вдоль дна оврага мучительно медленно. Метод Поляка решает эту проблему: поперечные градиенты имеют разные знаки и при сложении (в векторе ) гасят друг друга, а продольные градиенты имеют одинаковый знак и накапливаются. Шарик перестаёт биться о стены и устремляется вперёд.
2. Выход из седловых точек
В седловых точках градиент . Обычный алгоритм здесь навсегда остановится. Но наш шарик, имея накопленную скорость
, просто пролетит это плоское место по инерции и покатится дальше вниз.
3. Важное свойство: Немонотонность
Следует понимать критическое отличие инерционных методов от базовых. Из-за массы шарик может разогнаться так сильно, что проскочит дно локального минимума и начнёт закатываться на противоположный склон. Поэтому метод является немонотонным: значение ошибки в процессе обучения может временно возрастать. Однако именно это свойство позволяет выпрыгивать из мелких локальных минимумов и находить более оптимальные решения.
Сравнение с Ускоренным градиентом Нестерова (NAG)
В 1983 году Юрий Евгеньевич Нестеров предложил развитие метода Поляка — Nesterov Accelerated Gradient (NAG). Если метод Поляка — это просто тяжёлый шарик, то метод Нестерова — это шарик с зачатками интеллекта.
Разница кроется в точке вычисления градиента. В методе Поляка мы:
1. Считаем градиент в текущей точке
.
2. Добавляем его к вектору скорости.
3. Делаем шаг.
Но ведь благодаря инерции мы уже заранее знаем, что нас в любом случае снесёт в направлении вектора ! Логика Нестерова: давайте сделаем заглядывание вперёд (lookahead). Мы сначала «виртуально» прыгнем туда, куда нас несёт инерция (в точку
), и посчитаем градиент уже там.
Формулы NAG:
Это позволяет алгоритму «затормозить» до того, как он начнёт закатываться на крутой холм. Если в будущей точке уклон идёт вверх, градиент сменит знак и погасит скорость превентивно, уменьшая осцилляции.
Реализация на Python
Ниже представлена лаконичная, но полностью рабочая реализация метода инерции Поляка с использованием библиотеки NumPy. Этот код можно интегрировать в кастомные циклы обучения.
import numpy as np class PolyakMomentum: def __init__(self, learning_rate: float = 0.01, gamma: float = 0.9): # Инициализация оптимизатора. # lr: размер шага (h). # gamma: коэффициент инерции. self.lr = learning_rate self.gamma = gamma self.v = None # Вектор скорости инициализируется нулями при первом шаге def step(self, w: np.ndarray, grad: np.ndarray) -> np.ndarray: # Делает один шаг оптимизации. # w: текущие веса. # grad: градиент функции потерь в точке w. # Возвращает обновленные веса w_new. # Ленивая инициализация вектора скорости if self.v is None: self.v = np.zeros_like(w) # Формула обновления скорости v через экспоненциальное скользящее среднее self.v = self.gamma * self.v + (1 - self.gamma) * grad # Обновление весов w w_new = w - self.lr * self.v return w_new
См. также
Литература
- Поляк Б. Т. Некоторые способы ускорения сходимости итерационных методов // Журнал вычислительной математики и математической физики. — 1964. — Т. 4. — № 5. — С. 791–803.
- Нестеров Ю. Е. Метод минимизации выпуклых функций со скоростью сходимости
// Доклады АН СССР. — 1983. — Т. 269. — № 3. — С. 543–547.

