Как методы спускаются с горы: GD, momentum, Adam
Обучить нейросеть — значит спуститься в минимум функции потерь, у которой миллионы измерений. Но геометрия спуска видна уже в двух. Простой градиентный спуск вязнет в оврагах; импульс разгоняется вдоль дна; Adam подстраивает шаг под каждую координату. Возьмите точку старта и отпустите — посмотрите, кто доберётся до дна первым.
Один шаг вниз
Все три метода читают в текущей точке w один и тот же градиент \nabla L(w) — направление наискорейшего роста. Спуск идёт против него. Разница лишь в том, как превратить градиент в шаг.
Градиентный спуск (GD). Самое прямое правило: шагнуть против градиента на величину, заданную скоростью обучения \eta. w_{t+1} = w_t - \eta\, \nabla L(w_t). Просто — но в вытянутом «овраге» (когда вдоль одной оси кривизна большая, а вдоль другой малая) шаг приходится делать крошечным, иначе по крутой оси начинаются осцилляции. Спуск ползёт зигзагом и почти не движется вдоль дна.
Импульс (momentum). Накопим скорость, как у скатывающегося шарика: каждый шаг чуть «помнит» предыдущие.
v_{t+1} = \beta\, v_t - \eta\, \nabla L(w_t), \qquad w_{t+1} = w_t + v_{t+1}.
Колебания поперёк оврага гасятся (градиенты разнонаправлены и взаимно сокращаются), а вдоль дна скорость накапливается. Коэффициент \beta — это «память» о прошлых шагах; при \beta=0 это снова обычный GD.
Adam. Хранит две скользящие средние: первого момента градиента (как momentum) и второго (квадрата градиента). Делит шаг на корень из второго — получается свой масштаб для каждой координаты.
m_t = \beta_1 m_{t-1} + (1-\beta_1)\,g_t, \quad v_t = \beta_2 v_{t-1} + (1-\beta_2)\,g_t^2, \quad w_{t+1} = w_t - \eta\,\frac{\hat m_t}{\sqrt{\hat v_t}+\varepsilon}.
Здесь \hat m_t = m_t/(1-\beta_1^{t}) и \hat v_t = v_t/(1-\beta_2^{t}) — оценки моментов, скорректированные на смещение: на первых шагах m_t, v_t занижены (стартуют с нуля), и деление на 1-\beta^{t} это компенсирует.
По крутым осям шаг автоматически уменьшается, по пологим — растёт. Поэтому Adam устойчив даже там, где для GD пришлось бы подбирать \eta вручную.
Потрогайте спуск
Перетащите точку старта по карте высот — тёмное это дно. Три метода побегут вниз из неё одновременно. Покрутите скорость обучения и импульс \beta, переключите ландшафт — и увидите, где GD застрянет в зигзаге, как momentum проскакивает овраг по инерции, а Adam ровно идёт к минимуму.
Вытянутость оврага измеряется числом обусловленности \kappa — отношением наибольшей кривизны к наименьшей. Скорость сходимости GD падает как \frac{\kappa-1}{\kappa+1}: при \kappa=100 каждый шаг сокращает ошибку лишь на \sim 2\%. Momentum улучшает зависимость до \sqrt{\kappa} — отсюда его разгон вдоль дна.
Все три метода видят один и тот же градиент — отличается лишь обработка истории шагов. GD живёт настоящим; momentum помнит, куда катился; Adam ещё и помнит, насколько резко менялась каждая координата. В миллионах измерений эта память и есть разница между «обучилось за час» и «не сошлось никогда».
За пределами картинки
В реальном обучении L считается не по всему датасету, а по случайному мини-батчу — отсюда «стохастический» в SGD. Градиент становится шумным, и импульс/адаптивность помогают ещё сильнее: усреднение гасит шум, а покоординатный масштаб не даёт редким, но крупным градиентам сбить шаг. Во многих современных задачах — особенно при обучении трансформеров и больших языковых моделей — часто используют варианты Adam (AdamW) ровно по причинам, которые видны на этой карте: устойчивость к плохой обусловленности без ручного подбора скорости обучения.
Связи
- Ландшафт потерь (§ Ландшафт потерь): почему в высокой размерности оврагов и седловин больше, чем локальных минимумов.
- Глобальная оптимизация (§ Коммивояжёр и отжиг): когда градиента нет или минимумов много — эвристики вроде отжига.
- Двойной спуск (§ Двойной спуск): что происходит с ошибкой, когда модель доходит до точного интерполяционного минимума.