Полный градиент по всему датасету дорог. Поэтому модели учат на мини-батчах и с умными оптимизаторами. На собесе просят объяснить разницу между SGD, momentum и Adam, записать формулы и рассказать про расписания learning rate.
Батч, итерация, эпоха
- Батч: порция объектов для одного вычисления градиента.
- Итерация (шаг): одно обновление весов.
- Эпоха: проход по всем данным, N / B итераций.
10 000 объектов и батч 100 дают 100 шагов в эпохе.
SGD
Градиент по случайному мини-батчу это несмещённая, но шумная оценка полного градиента. Шаг стоит в N/B раз дешевле, за то же время делается много шагов, а шум помогает выходить из седел.
w ← w - η · g
Momentum
v ← β v + g
w ← w - η v
v копит экспоненциальное среднее градиентов (β обычно 0.9). Если градиент стабильно указывает в одну сторону, скорость растёт до ~1/(1 - β) от одного шага. Если знак скачет (зигзаг в овраге), вклады гасятся.
Пример с β = 0.9, η = 0.1 и градиентом 1 на двух шагах: v = 1, w = -0.1; затем v = 1.9, w = -0.29.
RMSProp и Adam
RMSProp делит шаг каждого параметра на корень из скользящего среднего квадратов его градиента. Параметры с большими градиентами получают меньший шаг.
Adam объединяет momentum и RMSProp:
m ← β₁ m + (1 - β₁) g
v ← β₂ v + (1 - β₂) g²
m̂ = m / (1 - β₁ᵗ), v̂ = v / (1 - β₂ᵗ)
w ← w - η · m̂ / (√v̂ + ε)
По умолчанию β₁ = 0.9, β₂ = 0.999, ε = 1e-8.
Поправка смещения нужна, потому что m и v стартуют с нуля и в первые шаги занижены. С поправкой первый шаг Adam по модулю равен η, какой бы ни была величина градиента.
AdamW
Если добавить L2 в loss, слагаемое λw пройдёт через деление на √v, и у параметров с большими градиентами регуляризация почти исчезнет. AdamW применяет weight decay к весам напрямую: w ← w - ηλw. Это стандарт для трансформеров.
Память
Adam хранит два дополнительных тензора на каждый параметр (m и v), SGD с momentum один. Для больших моделей состояние оптимизатора весит больше самих весов, отсюда 8-битные оптимизаторы и шардирование состояния.
Что выбрать
- По умолчанию AdamW: быстро сходится без тонкой настройки, хорошо работает с разреженными градиентами.
- SGD с momentum часто выбирают для свёрточных сетей с BatchNorm: при хорошем расписании он обобщает не хуже, а иногда лучше.
Расписания learning rate
Adam адаптирует шаг между параметрами, но общий масштаб всё равно задаёт η.
- Warmup: первые сотни или тысячи шагов линейно растим lr. На старте статистики оптимизатора ненадёжны, а градиенты у случайной модели бывают большими.
- Затухание: ступенчатое, косинусное, линейное до нуля. Большой шаг быстро приводит в хорошую область, маленький позволяет осесть.
- One-cycle и косинус с перезапусками.
Расписание привязано к запланированному числу шагов: если обучение удлинили, его пересчитывают.
Батч и learning rate
При увеличении батча в k раз шагов за эпоху в k раз меньше. Для SGD работает линейное правило: lr умножают на k и добавляют warmup. Для Adam растят мягче. Это эвристика, её проверяют.
Частые ошибки
- Путать эпоху и итерацию.
- Считать, что Adam не нуждается в подборе lr и расписании.
- Добавлять L2 в loss при Adam и думать, что это то же самое, что weight decay.
Что спросят на собесе
- Почему мини-батчи, а не полный градиент.
- Формулы momentum и Adam, зачем поправка смещения.
- Чем AdamW отличается от Adam с L2.
- Зачем warmup и какие бывают расписания.
- Когда SGD с momentum лучше Adam.