Стохастический градиентный спуск SGD: формула и шум

Стохастический градиентный спуск, или SGD (Stochastic Gradient Descent), - это способ минимизировать функцию потерь, при котором на каждом шаге градиент считают не по всей обучающей выборке, а по одному примеру или маленькой случайной подвыборке (мини-батчу). Из-за этого направление шага постоянно немного «дрожит» вокруг истинного градиента, и вместо гладкой линии спуска получается зашумлённая ломаная траектория. Именно это отличает SGD от полного (батч-)градиентного спуска, где на каждом шаге считают точный градиент по всем данным сразу. Ниже разберём формулу обновления, откуда берётся шум и как он связан с размером батча, почему SGD в принципе не останавливается точно в минимуме, а «блуждает» рядом с ним, и как всё это выглядит в числах. Чтобы увидеть шум и сходимость сразу на одной картинке, покрути калькулятор ниже - он держит рядом гладкую траекторию обычного градиентного спуска и зашумлённую траекторию SGD на одной и той же чаше потерь.
Формула обновления SGD
Пусть - функция потерь, зависящая от параметров модели (веса нейросети, коэффициенты регрессии и т.п.), а - вклад в неё одного обучающего примера . Полный градиент по всей выборке из примеров - это среднее:
Считать эту сумму на каждом шаге для больших дорого, поэтому SGD заменяет её оценкой по случайно выбранному мини-батчу размера :
где - скорость обучения (learning rate). Оценку удобно записать как истинный градиент плюс шум: . Матожидание шума равно нулю (оценка несмещённая - в среднем по всем возможным батчам совпадает с полным градиентом), но его дисперсия убывает с ростом размера батча примерно как , то есть стандартное отклонение шума падает как . Отсюда и главный компромисс SGD: батч побольше даёт более точную оценку градиента и более гладкий спуск, но каждый шаг обходится дороже; батч поменьше (вплоть до одного примера) даёт дешёвые, но шумные шаги.
Почему SGD не сходится точно в минимум
У полного градиентного спуска с постоянным шагом на квадратичной функции траектория гладко сходится к минимуму, и гасит и сам шаг. У SGD шум от градиента не зависит от того, насколько параметры близки к минимуму, - он не исчезает, когда уже рядом с оптимумом. Из-за этого при постоянной скорости обучения траектория не останавливается в точке минимума, а входит в небольшую область вокруг него и дальше блуждает внутри неё - размер этой области растёт с и с дисперсией шума и падает с размером батча.

Именно поэтому на практике скорость обучения часто не держат постоянной, а уменьшают по ходу обучения (расписание, например или ступенчатое снижение) - тогда шаги становятся мельче, шар блуждания сжимается, и в пределе SGD может сходиться точно к минимуму. Без такого расписания метод даёт быстрый прогресс на старте, но выходит на «шумное плато» и перестаёт заметно улучшать функцию потерь.
Роль размера батча и скорости обучения
Размер мини-батча - не только вопрос вычислительной цены, но и прямой рычаг управления шумом. Если обозначить базовый уровень шума на одном примере как , то эффективное стандартное отклонение шума градиента по батчу размера составляет:
Увеличение батча в 4 раза уменьшает шум ровно вдвое - не пропорционально, а по корню, поэтому отдача от увеличения батча быстро падает: чтобы вчетверо снизить шум, батч нужно увеличить в 16 раз. Скорость обучения действует иначе: она одинаково масштабирует и полезный сигнал (движение к минимуму), и шум, поэтому просто уменьшать ради борьбы с шумом - не бесплатно, это же замедляет и сходимость по сигналу. Разумный компромисс - умеренный батч (не обязательно весь датасет) вместе с расписанием, которое снижает по мере приближения к минимуму. В калькуляторе выше это видно напрямую: переключи размер батча и посмотри, как меняется толщина «облака» вокруг конечной траектории SGD на графике сходимости.
Похожий, но принципиально другой рычаг управления шагом - метод наискорейшего спуска, где длина шага на каждой итерации не фиксируется заранее, а вычисляется точной одномерной минимизацией; там источник зигзага - не шум оценки градиента, а форма (обусловленность) самой функции потерь.
Пример решения типовой задачи
Возьмём ту же модельную чашу потерь , старт из точки , скорость обучения и батч размера 1 (максимальный шум, ). Полный градиент в старте: . Оценка по батчу добавляет к нему шум первого шага , умноженный на :
Шаг обновления даёт новую точку и новое значение потерь:
За 30 таких шагов итоговое значение функции потерь и его зависимость от размера батча (при том же ) выглядят так:
| Размер батча | после 30 шагов | |
|---|---|---|
| 1 | 1,50 | ≈ 0,27 |
| 4 | 0,75 | ≈ 0,10 |
| 16 | 0,375 | ≈ 0,05 |
| 64 | 0,188 | ≈ 0,03 |
| полный градиент (GD) | 0 | ≈ 0,015 |
Видно закономерность из предыдущего раздела: чем больше батч, тем ближе итоговое значение к результату полного градиентного спуска, но даже батч 64 не даёт точно такого же , как GD, - небольшой шум остаётся всегда, пока постоянна.
Частые ошибки
- Путать SGD с обычным градиентным спуском. В классическом (батч-) градиентном спуске градиент на каждом шаге точный - по всей выборке; в SGD это всегда оценка по мини-батчу или одному примеру, отсюда и шум.
- Ждать, что итоговое значение функции потерь дойдёт до нуля. При постоянной скорости обучения SGD в общем случае сходится не к точке минимума, а к небольшой окрестности вокруг неё - это не баг, а свойство метода.
- Считать, что увеличение батча вдвое вдвое же снижает шум. Зависимость идёт через корень: , а не . Чтобы снизить шум в 2 раза, батч нужно увеличить в 4 раза.
- Игнорировать взаимосвязь батча и скорости обучения. Один и тот же при маленьком батче может расходиться, хотя при полном градиенте с тем же спуск был устойчив, - шум увеличивает эффективный разброс шага.
- Забывать про несмещённость оценки. Хотя каждый отдельный шаг SGD зашумлён, в среднем по батчам оценка градиента совпадает с истинным - это и есть формальная причина, почему метод вообще работает.
FAQ
Чем SGD отличается от градиентного спуска (GD)? В GD градиент считается точно по всей обучающей выборке на каждом шаге; в SGD - по одному примеру или мини-батчу, из-за чего оценка градиента шумная, а траектория - зигзагообразная и не гладкая.
Почему SGD не сходится точно к минимуму при постоянной скорости обучения? Потому что шум оценки градиента не зависит от расстояния до минимума и не исчезает, когда параметры уже рядом с оптимумом. Точка входит в небольшую область вокруг минимума и продолжает в ней блуждать.
Как размер батча влияет на шум градиента? Эффективное стандартное отклонение шума убывает как , где - размер батча. Увеличение батча в 4 раза снижает шум только вдвое - отдача от роста батча ограничена.
Нужно ли уменьшать скорость обучения по ходу обучения SGD? Да, если нужна сходимость точно к минимуму: убывающее расписание (например ) сжимает область блуждания к нулю. При постоянной метод быстро прогрессирует на старте, но выходит на шумное плато.
Коротко
Стохастический градиентный спуск обновляет параметры по формуле , где - несмещённая, но зашумлённая оценка полного градиента по мини-батчу размера . Дисперсия шума убывает как , поэтому эффективный разброс шага падает как : батч побольше сглаживает траекторию, но не бесплатно по вычислениям. При постоянной скорости обучения метод не сходится точно в минимум, а входит в небольшую область блуждания вокруг него, - избавиться от этого можно только убывающим расписанием . Это ровно то же ядро правила обновления, которое лежит в основе обучения нейросетей через обратное распространение ошибки: backpropagation считает градиент функции потерь по весам, а SGD (или его модификации вроде Adam) решает, как именно этим градиентом обновлять веса на каждом шаге.
Читайте также

Оптимизатор RMSprop: формула и параметры
Как работает RMSprop: формула скользящего среднего квадратов градиента, роль rho и learning rate, отличия от AdaGrad и Adam. Разбор с интерактивным калькулятором траектории.

Оптимизатор Adam: формула и параметры
Как работает Adam: формула обновления весов, bias correction, роль beta1 и beta2, сравнение с SGD и RMSProp. Разбор с интерактивным калькулятором траектории.

Алгоритм AdaBoost: как слабые классификаторы дают сильный
Алгоритм AdaBoost простыми словами: адаптивный бустинг, перевзвешивание объектов, формула веса классификатора, итоговый ансамбль и разбор шага на примере с формулами.

Алгоритм CatBoost: бустинг с обработкой категорий
Алгоритм CatBoost простыми словами: упорядоченный бустинг против сдвига прогноза, кодирование категориальных признаков через ordered target statistics, симметричные деревья и разбор типовых задач.

Алгоритм LightGBM: быстрый градиентный бустинг
Алгоритм LightGBM простыми словами: рост дерева по листьям против роста по уровням, гистограммы признаков, GOSS и EFB, настройка num_leaves и learning rate, борьба с переобучением и разбор задач.

Алгоритм policy gradient: как обучают стратегию напрямую
Разбираем алгоритм policy gradient: теорема о градиенте, формула REINFORCE, роль baseline и log-производной. С примерами вывода, типовыми ошибками и интерактивным расчётом сходимости.