Метод инерции Поляка
Материал из MachineLearning.
(Новая: {{well|СТАТЬЯ В РАЗРАБОТКЕ: Этот материал сейчас находится в процессе активного редактирования и дорабо...) |
|||
| Строка 1: | Строка 1: | ||
| - | {{well| | + | {{well|Статья написана с использованием LLM '''Gemini 3.1 Pro Preview''' и проверена участником [[Участник:Polina Khadralinova|Polina Khadralinova]]}} |
Промпт приводится полностью в [[Обсуждение:Метод инерции Поляка]] | Промпт приводится полностью в [[Обсуждение:Метод инерции Поляка]] | ||
| - | == | + | == Метод инерции Поляка (Momentum) == |
| - | '''Метод инерции''' ( | + | '''Метод инерции Поляка''' (также известный как ''Heavy Ball method'' или ''Momentum'') — это популярная модификация алгоритма градиентного спуска, предложенная советским математиком Борисом Теодоровичем Поляком в 1964 году. Этот метод значительно ускоряет сходимость при обучении моделей машинного обучения (включая глубокие нейронные сети), решая фундаментальные проблемы классического градиентного спуска. |
| - | + | == Физическая интуиция: Тяжёлый шарик в овраге == | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | Чтобы понять суть метода, давайте отвлечёмся от строгой математики и представим себе физическую картину. | |
| - | + | Обычный градиентный спуск можно сравнить с человеком, который спускается с горы в густом тумане с завязанными глазами. На каждом шаге он просто нащупывает ногой, где уклон максимален, и делает шаг туда. У него нет памяти: каждый новый шаг не зависит от предыдущего. Из-за этого на сложном ландшафте его путь будет очень дёрганым. | |
| - | + | Метод Поляка меняет правила игры. Представьте себе '''тяжёлый металлический шарик''', который мы отпускаем катиться на дно оврага. | |
| - | ::<tex>v = \gamma v + (1 - \gamma) \nabla \mathcal{L}(w | + | * '''Ландшафт''' — это поверхность нашей функции потерь <tex>\mathcal{L}</tex> (или эмпирического риска <tex>Q</tex>). |
| + | * '''Уклон ландшафта''' в данной точке — это градиент <tex>\nabla \mathcal{L}</tex>, который создаёт силу, тянущую шарик вниз. | ||
| + | * '''Масса шарика''' задаёт его '''инерцию'''. Если шарик уже разогнался в определённом направлении, он продолжит двигаться по инерции, даже если локальный уклон вдруг изменится. | ||
| + | |||
| + | Благодаря этой массе шарик плавно сглаживает неровности рельефа и стремительно несётся к глобальному минимуму, накапливая скорость на затяжных спусках. | ||
| + | |||
| + | == Математическая формулировка == | ||
| + | |||
| + | В классическом градиентном спуске вектор весов <tex>w</tex> обновляется только на основе текущего антиградиента с темпом обучения (шагом) <tex>h</tex>: | ||
| + | ::<tex>w = w - h \nabla \mathcal{L}(w)</tex> | ||
| + | |||
| + | В методе Momentum мы вводим новую переменную — вектор скорости <tex>v</tex> (вектор импульса). Теперь градиент не меняет напрямую веса <tex>w</tex>, он лишь изменяет скорость <tex>v</tex>, а уже скорость двигает веса. | ||
| + | |||
| + | Математически шаг оптимизатора записывается следующей системой уравнений (в форме экспоненциального скользящего среднего): | ||
| + | ::<tex>v = \gamma v + (1 - \gamma) \nabla \mathcal{L}(w)</tex> | ||
::<tex>w = w - h v</tex> | ::<tex>w = w - h v</tex> | ||
| - | + | Где: | |
| - | * <tex> | + | * <tex>w</tex> — параметры (веса) модели. |
| - | * <tex> | + | * <tex>v</tex> — накопленная скорость (импульс). |
| + | * <tex>\nabla \mathcal{L}(w)</tex> — вектор градиента функции потерь в текущей точке. | ||
| + | * <tex>h</tex> — размер шага (learning rate). | ||
| + | * <tex>\gamma</tex> — коэффициент инерции (momentum decay, обычно берётся равным <tex>0.9</tex>). Он играет роль силы трения: если бы <tex>\gamma = 1</tex>, наш шарик катился бы вечно, никогда не останавливаясь. При <tex>\gamma < 1</tex> шарик теряет часть энергии и в итоге оседает на дне. | ||
| - | + | == Преимущества метода == | |
| - | == | + | === 1. Преодоление «оврагов» === |
| + | Функции потерь часто имеют форму узких оврагов (когда по одной оси градиент огромный, а по другой — почти нулевой). Классический градиентный спуск начинает метаться от стенки к стенке (зигзаги), продвигаясь вдоль дна оврага мучительно медленно. Метод Поляка решает эту проблему: поперечные градиенты имеют разные знаки и при сложении (в векторе <tex>v</tex>) гасят друг друга, а продольные градиенты имеют одинаковый знак и накапливаются. Шарик перестаёт биться о стены и устремляется вперёд. | ||
| - | + | === 2. Выход из седловых точек === | |
| + | В седловых точках градиент <tex>\nabla \mathcal{L} = 0</tex>. Обычный алгоритм здесь навсегда остановится. Но наш шарик, имея накопленную скорость <tex>v</tex>, просто пролетит это плоское место по инерции и покатится дальше вниз. | ||
| - | ''' | + | === 3. Важное свойство: Немонотонность === |
| - | + | Следует понимать критическое отличие инерционных методов от базовых. Из-за массы шарик может разогнаться так сильно, что '''проскочит''' дно локального минимума и начнёт закатываться на противоположный склон. Поэтому метод является '''немонотонным''': значение ошибки <tex>\mathcal{L}(w)</tex> в процессе обучения может временно возрастать. Однако именно это свойство позволяет выпрыгивать из мелких локальных минимумов и находить более оптимальные решения. | |
| - | + | == Сравнение с Ускоренным градиентом Нестерова (NAG) == | |
| - | + | ||
| - | + | В 1983 году Юрий Евгеньевич Нестеров предложил развитие метода Поляка — Nesterov Accelerated Gradient (NAG). Если метод Поляка — это просто тяжёлый шарик, то метод Нестерова — это шарик с зачатками интеллекта. | |
| - | В | + | Разница кроется в точке вычисления градиента. В методе Поляка мы: |
| + | 1. Считаем градиент <tex>\nabla \mathcal{L}</tex> в текущей точке <tex>w</tex>. | ||
| + | 2. Добавляем его к вектору скорости. | ||
| + | 3. Делаем шаг. | ||
| - | + | Но ведь благодаря инерции мы уже заранее знаем, что нас в любом случае снесёт в направлении вектора <tex>-h \gamma v</tex>! Логика Нестерова: давайте сделаем '''заглядывание вперёд''' (lookahead). Мы сначала «виртуально» прыгнем туда, куда нас несёт инерция (в точку <tex>w - h \gamma v</tex>), и посчитаем градиент уже там. | |
| - | Формулы | + | Формулы NAG: |
| - | ::<tex>v = \gamma v + (1 - \gamma) \nabla \mathcal{L}(w - h \gamma v | + | ::<tex>v = \gamma v + (1 - \gamma) \nabla \mathcal{L}(w - h \gamma v)</tex> |
::<tex>w = w - h v</tex> | ::<tex>w = w - h v</tex> | ||
| - | + | Это позволяет алгоритму «затормозить» до того, как он начнёт закатываться на крутой холм. Если в будущей точке уклон идёт вверх, градиент сменит знак и погасит скорость <tex>v</tex> превентивно, уменьшая осцилляции. | |
| - | == | + | == Реализация на Python == |
| - | Ниже | + | Ниже представлена лаконичная, но полностью рабочая реализация метода инерции Поляка с использованием библиотеки NumPy. Этот код можно интегрировать в кастомные циклы обучения. |
<source lang="python"> | <source lang="python"> | ||
import numpy as np | import numpy as np | ||
| - | class | + | class PolyakMomentum: |
| - | def __init__(self, learning_rate=0.01, gamma=0.9): | + | def __init__(self, learning_rate: float = 0.01, gamma: float = 0.9): |
| - | + | """ | |
| - | self. | + | Инициализация оптимизатора. |
| + | lr: размер шага (h). | ||
| + | gamma: коэффициент инерции. | ||
| + | """ | ||
| + | self.lr = learning_rate | ||
self.gamma = gamma | self.gamma = gamma | ||
| - | + | self.v = None # Вектор скорости инициализируется нулями при первом шаге | |
| - | self.v = None | + | |
| - | def step(self, w, grad): | + | def step(self, w: np.ndarray, grad: np.ndarray) -> np.ndarray: |
| - | # | + | """ |
| + | Делает один шаг оптимизации. | ||
| + | w: текущие веса. | ||
| + | grad: градиент функции потерь в точке w. | ||
| + | Возвращает обновленные веса w_new. | ||
| + | """ | ||
| + | # Ленивая инициализация вектора скорости | ||
if self.v is None: | if self.v is None: | ||
self.v = np.zeros_like(w) | self.v = np.zeros_like(w) | ||
| - | # | + | # Формула обновления скорости v через экспоненциальное скользящее среднее |
| - | + | ||
self.v = self.gamma * self.v + (1 - self.gamma) * grad | self.v = self.gamma * self.v + (1 - self.gamma) * grad | ||
| - | # | + | # Обновление весов w |
| - | + | w_new = w - self.lr * self.v | |
| - | + | ||
| - | return | + | return w_new |
</source> | </source> | ||
Версия 20:01, 6 июля 2026
| | Статья написана с использованием 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. — T. 4. — С. 791–803.
- Нестеров Ю. Е. Метод минимизации выпуклых функций со скоростью сходимости O(1/k^2). — М.: Доклады АН СССР, 1983. — T. 269. — С. 543–547.

