EssayAI
Блог
Блог
Математика и алгоритмы

Оптимизатор Adam: формула и параметры

11 июня 2026Время чтения: 7 минут
#оптимизатор adam#обучение нейросети#градиентный спуск#learning rate#машинное обучение

Оптимизатор Adam (Adaptive Moment Estimation) появился в 2014 году в статье Дидерика Кингма и Джимми Бы и быстро стал стандартом обучения нейросетей. Его ключевое преимущество перед обычным SGD состоит в том, что шаг обновления каждого параметра подстраивается автоматически: параметры с маленькими градиентами получают больший шаг, а параметры с большими - меньший. Ниже разберём формулы, смысл каждого гиперпараметра и то, где Adam выигрывает у конкурентов. Чтобы сразу увидеть, как меняется траектория при разных значениях, покрутите слайдеры в калькуляторе:

Формула Adam: четыре строки

Adam на каждом шаге tt делает четыре вычисления. Пусть gtg_t - градиент функции потерь по параметру θ\theta в момент tt:

mt=β1mt1+(1β1)gtm_t = \beta_1 m_{t-1} + (1-\beta_1)\,g_t vt=β2vt1+(1β2)gt2v_t = \beta_2 v_{t-1} + (1-\beta_2)\,g_t^2 m^t=mt1β1t,v^t=vt1β2t\hat{m}_t = \frac{m_t}{1-\beta_1^t}, \qquad \hat{v}_t = \frac{v_t}{1-\beta_2^t} θt=θt1αm^tv^t+ε\theta_t = \theta_{t-1} - \frac{\alpha\,\hat{m}_t}{\sqrt{\hat{v}_t} + \varepsilon}

Здесь mtm_t - первый момент (скользящее среднее градиента), vtv_t - второй момент (скользящее среднее квадрата градиента). Деление m^t/(v^t+ε)\hat{m}_t / (\sqrt{\hat{v}_t} + \varepsilon) нормирует обновление: там, где градиент стабильно большой, знаменатель тоже большой, и шаг уменьшается автоматически. Параметр ε108\varepsilon \approx 10^{-8} защищает от деления на нуль.

Траектория Adam (синяя) и SGD (красная) на функции-овраге f(x,y)=x^2+10y^2: Adam быстро выравнивается вдоль дна оврага, SGD осциллирует поперек

Что такое bias correction

В начале обучения m0=0m_0 = 0 и v0=0v_0 = 0. Если не корректировать, первые несколько шагов дадут сильно заниженные значения моментов, потому что накопленная «история» ещё слишком короткая. Bias correction делит на (1βt)(1 - \beta^t): при t=1t=1 и β1=0.9\beta_1 = 0.9 делитель равен 0.10.1, то есть m^1=m1/0.1=10m1\hat{m}_1 = m_1 / 0.1 = 10 m_1 - момент «раздувается» до реального масштаба. С ростом tt делитель стремится к единице, и коррекция становится незаметной. На практике без bias correction первые эпохи могут давать неадекватно маленькие обновления и медленный старт.

Bias correction в Adam: без коррекции (пунктир) момент m сильно занижен на первых шагах; с коррекцией (сплошная) моменты сразу близки к истинному значению
Bias correction в Adam: без коррекции (пунктир) момент m сильно занижен на первых шагах; с коррекцией (сплошная) моменты сразу близки к истинному значению

Гиперпараметры: что и как настраивать

Скорость обучения α\alpha управляет общим масштабом шагов. Авторы предложили дефолт α=0.001\alpha = 0.001; он работает для большинства задач без ручной настройки. Если обучение расходится - уменьшайте α\alpha на порядок; если сходится слишком медленно - пробуйте 0.0030.003 или 0.010.01.

β1=0.9\beta_1 = 0.9 контролирует «инерцию» направления: насколько прошлые градиенты влияют на текущий шаг. При β11\beta_1 \to 1 момент медленно реагирует на смену направления; при β10\beta_1 \to 0 Adam ведёт себя почти как RMSProp без первого момента.

β2=0.999\beta_2 = 0.999 управляет «памятью» масштаба: насколько быстро vtv_t забывает старые квадраты градиентов. Большое β2\beta_2 делает нормировку консервативной - эффективный шаг меняется плавно. Маленькое β2\beta_2 (например, 0.90.9) заставляет шаг быстро адаптироваться к текущему масштабу, что полезно при сильно нестационарных потерях.

ε\varepsilon - числовая стабильность, обычно не трогают. Иногда увеличивают до 10610^{-6} или 10410^{-4}, если встречается численная нестабильность на разреженных данных.

Сравнение с SGD и RMSProp

SGD обновляет все параметры с одним и тем же шагом α\alpha: θθαgt\theta \leftarrow \theta - \alpha g_t. В «оврагах» (функциях с сильно различающейся кривизной по разным направлениям) это приводит к осцилляциям: шаг вдоль крутого склона слишком большой, а вдоль пологого - слишком маленький. Adam решает эту проблему через vtv_t: крутые направления получают большой знаменатель и, значит, маленький эффективный шаг.

RMSProp делает только второй момент и не содержит bias correction. Adam добавляет к нему ещё первый момент mtm_t (аналог импульса в momentum-SGD), что дало более устойчивую сходимость на практике. В большинстве задач глубокого обучения Adam сходится быстрее SGD и сравнимо с AdaGrad, но не «замораживает» шаг к нулю на длинных обучениях, как AdaGrad.

Полезно сравнить формально. AdaGrad накапливает сумму квадратов градиентов с самого начала:

Gt=i=1tgi2,θt=θt1αGt+εgt.G_t = \sum_{i=1}^{t} g_i^2, \qquad \theta_t = \theta_{t-1} - \frac{\alpha}{\sqrt{G_t} + \varepsilon}\,g_t.

Чем дольше обучение, тем больше GtG_t - и шаг неизбежно стремится к нулю. RMSProp и Adam заменили сумму экспоненциально убывающим средним, чтобы шаг оставался конечным:

vt=β2vt1+(1β2)gt2.v_t = \beta_2 v_{t-1} + (1-\beta_2)\,g_t^2.

При β2=0.999\beta_2 = 0.999 «половина жизни» памяти составляет около 700 шагов: что было раньше, практически забывается. Это и делает Adam применимым на очень длинных обучениях.

Moment SGD (momentum-SGD) добавляет инерцию направления, но не адаптирует масштаб:

vtmom=μvt1momαgt,θt=θt1+vtmom.v_t^{\text{mom}} = \mu v_{t-1}^{\text{mom}} - \alpha g_t, \qquad \theta_t = \theta_{t-1} + v_t^{\text{mom}}.

Первый момент Adam mtm_t - это то же самое, только нормированное. Таким образом, Adam = RMSProp + momentum + bias correction.

Когда Adam хуже SGD

Несмотря на популярность, Adam не всегда лучше. На задачах классификации изображений (ImageNet, CIFAR) правильно настроенный SGD с momentum и warmup-расписанием нередко даёт более высокую финальную точность, хотя Adam сходится быстрее в начале. Причина - адаптивные методы могут переобучаться на некоторых конфигурациях из-за различной эффективной скорости обучения для разных параметров. В последние годы появились гибриды: AdamW, NAdam, RAdam - каждый из них устраняет отдельные слабости оригинального Adam.

Теоретический анализ Редди, Кейла и Кумара (2018) показал, что Adam в принципе не сходится к оптимуму на некоторых простых задачах выпуклой оптимизации. Проблема - в том, что обновление vtv_t может пересматривать давние большие градиенты «слишком быстро», и алгоритм колеблется вблизи оптимума вместо монотонного убывания потерь. RAdam (Rectified Adam) исправляет это адаптивным ректификатором, который в начале обучения отключает адаптивность, пока vtv_t ещё не набрал достаточно статистики.

AdamW добавляет правильный weight decay: вместо L2L_2-регуляризации через градиент (которая взаимодействует с адаптивным шагом) он применяет убывание весов напрямую: θ(1λ)θadam-update\theta \leftarrow (1 - \lambda)\theta - \text{adam-update}. Это особенно важно для больших языковых моделей и трансформеров. При обычном Adam с L2L_2-регуляризацией штраф за большие веса масштабируется адаптивным шагом и оказывается фактически меньше, чем задумано дизайнером. AdamW разделяет эти два механизма, что в экспериментах с BERT и GPT давало заметное улучшение качества при одинаковом числе шагов.

Частые ошибки

  • Не меняют α\alpha при переходе на новую задачу. Дефолт 0.0010.001 - хорошая отправная точка, но не универсальная; для трансформеров часто нужен warmup + cosine decay.
  • Путают β1\beta_1 и β2\beta_2. β1\beta_1 - для первого момента (направления), β2\beta_2 - для второго (масштаба). Перепутать их означает дать «инерцию» масштабу и «адаптивность» направлению - это ломает логику алгоритма.
  • Используют Adam там, где нужен SGD. Если финальная точность критична и есть ресурсы на долгое обучение (например, ImageNet с расписанием LR), SGD + momentum может дать лучший результат.
  • Забывают bias correction при самостоятельной реализации. Пропуск деления на (1βt)(1 - \beta^t) даёт медленный старт и может имитировать переобучение на первых эпохах.
  • Слишком большой ε\varepsilon. ε=1\varepsilon = 1 фактически убирает адаптивность: знаменатель vt+11\sqrt{v_t} + 1 \approx 1 при малых градиентах, и Adam деградирует до обычного momentum.

FAQ

Почему Adam называется adaptive? Потому что эффективный шаг α/(v^t+ε)\alpha / (\sqrt{\hat{v}_t} + \varepsilon) разный для каждого параметра и меняется в ходе обучения. Параметры с исторически большими градиентами получают меньший шаг, с малыми - больший. В отличие от SGD, где один α\alpha для всех.

Нужно ли тюнить beta1 и beta2? В большинстве случаев нет: дефолты β1=0.9\beta_1 = 0.9 и β2=0.999\beta_2 = 0.999 работают хорошо. Эксперименты с ними нужны при нестабильной сходимости или при работе с разреженными данными (NLP), где иногда помогает β2=0.98\beta_2 = 0.98.

Чем AdamW отличается от Adam? AdamW применяет weight decay (L2L_2-штраф) напрямую к весам, не через градиент. В Adam с L2L_2-регуляризацией штраф масштабируется адаптивным шагом и оказывается меньше, чем задумано. AdamW исправляет это и является рекомендуемой заменой Adam для большинства задач.

Коротко

Adam объединяет идею импульса (первый момент mtm_t) и адаптивного масштабирования шага (второй момент vtv_t) с bias correction для корректного старта. Дефолтные параметры α=0.001\alpha = 0.001, β1=0.9\beta_1 = 0.9, β2=0.999\beta_2 = 0.999 работают для большинства нейросетей без ручной настройки. В «оврагах» потерь Adam сходится намного быстрее SGD за счёт разного эффективного шага по разным направлениям. Для финального качества на крупных задачах компьютерного зрения стоит сравнить с SGD+momentum; для трансформеров и LLM используйте AdamW.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также