Какие оптимизаторы есть в TensorFlow (SGD, Adam, RMSprop) и когда выбирать каждый из них?
SGD с momentum дает наилучшую точность при правильном schedule (CV-задачи); Adam работает "из коробки" для NLP и прототипов; RMSprop оптимален для RNN и RL.
Оптимизаторы в TensorFlow: SGD, Adam, RMSprop
TensorFlow предоставляет богатый набор оптимизаторов через модуль tf.keras.optimizers. Выбор оптимизатора напрямую влияет на скорость сходимости и качество итоговой модели.
SGD (Stochastic Gradient Descent)
Классический градиентный спуск. Обновляет веса по формуле: w = w - lr * grad. Версия с импульсом (momentum) ускоряет движение вдоль направлений с устойчивым градиентом.
- Подходит для задач с большими датасетами и хорошо подобранным learning rate schedule.
- С правильным расписанием (cosine annealing, warmup) дает наилучшую итоговую точность в задачах компьютерного зрения (ImageNet-benchmark).
- Требует тщательной настройки lr и momentum; чувствителен к масштабу признаков.
import tensorflow as tf
sgd = tf.keras.optimizers.SGD(
learning_rate=0.01,
momentum=0.9,
nesterov=True
)
RMSprop
Адаптирует learning rate для каждого параметра, деля градиент на скользящее среднее квадратов градиентов. Хорошо работает с рекуррентными сетями и нестационарными целевыми функциями.
- Оптимален для RNN/LSTM, где градиенты сильно варьируются во времени.
- Стандартный выбор при обучении с подкреплением (RL-агенты, Atari).
- Параметр
rho(decay) управляет памятью скользящего среднего.
rmsprop = tf.keras.optimizers.RMSprop(
learning_rate=0.001,
rho=0.9,
epsilon=1e-07
)
Adam (Adaptive Moment Estimation)
Объединяет идеи Momentum и RMSprop: хранит экспоненциально скользящие средние градиентов (m) и их квадратов (v), применяя bias correction в первые шаги.
- Хорошо работает «из коробки» без тонкой настройки lr.
- Стандартный выбор для NLP, трансформеров, GAN, большинства задач с нуля.
- Варианты: AdamW (декуплированная L2-регуляризация), Nadam (с Nesterov).
adam = tf.keras.optimizers.Adam(
learning_rate=3e-4,
beta_1=0.9,
beta_2=0.999,
epsilon=1e-07,
weight_decay=0.01 # AdamW-стиль, TF 2.11+
)
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(
optimizer=adam,
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
Практические рекомендации выбора
- Прототип / новая архитектура — начинайте с Adam(lr=3e-4); он прощает ошибки в архитектуре.
- Fine-tuning предобученных моделей — Adam или AdamW с малым lr (1e-5 — 5e-5).
- Production CV-модели — SGD+momentum+cosine schedule, если важна максимальная точность.
- RNN / временные ряды — RMSprop с rho=0.9.
- Трансформеры (BERT, GPT) — AdamW + linear warmup + decay.
Подводные камни
- Adam может не сходиться к глобальному минимуму на некоторых задачах — явление известно как "Adam non-convergence"; SGD находит более плоские минимумы.
- Значение epsilon в Adam критично: слишком маленькое вызывает нестабильность на float16; используйте epsilon=1e-3 при mixed precision.
- RMSprop без epsilon может делить на ноль при очень маленьких градиентах.
- SGD без momentum и lr schedule почти всегда проигрывает адаптивным оптимизаторам по скорости.
- Не используйте один lr для всех слоёв при fine-tuning: нижние слои нуждаются в lr в 10–100 раз меньшем.
- AdamW и Adam в Keras 3 ведут себя по-разному: weight_decay в AdamW применяется к весам, а не к градиентам.
- При gradient clipping важно обрезать до применения оптимизатора, а не после — иначе обновление некорректно.
- Смена оптимизатора в середине обучения (например, с Adam на SGD для дообучения) обнуляет накопленные моменты — модель может временно деградировать.
Common mistakes
- Объяснять
optimizersтолько синтаксисом без shape, dtype, состояния или режима выполнения. - Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
- Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.
What the interviewer is testing
- Может ли связать
optimizersс реальным контрактом входов и выходов. - Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
- Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.