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

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

11 июня 2026Время чтения: 8 минут
#стохастический градиентный спуск#sgd#градиентный спуск#машинное обучение#мини-батч
Стохастический градиентный спуск SGD: формула и шум

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

Формула обновления SGD

Пусть f(θ)f(\theta) - функция потерь, зависящая от параметров модели θ\theta (веса нейросети, коэффициенты регрессии и т.п.), а fi(θ)f_i(\theta) - вклад в неё одного обучающего примера ii. Полный градиент по всей выборке из nn примеров - это среднее:

f(θ)=1ni=1nfi(θ).\nabla f(\theta) = \frac{1}{n} \sum_{i=1}^{n} \nabla f_i(\theta).

Считать эту сумму на каждом шаге для больших nn дорого, поэтому SGD заменяет её оценкой по случайно выбранному мини-батчу BB размера B|B|:

gk=1BiBfi(θk),θk+1=θkηgk,g_k = \frac{1}{|B|} \sum_{i \in B} \nabla f_i(\theta_k), \qquad \theta_{k+1} = \theta_k - \eta\, g_k,

где η\eta - скорость обучения (learning rate). Оценку gkg_k удобно записать как истинный градиент плюс шум: gk=f(θk)+ξkg_k = \nabla f(\theta_k) + \xi_k. Матожидание шума равно нулю (оценка несмещённая - в среднем по всем возможным батчам gkg_k совпадает с полным градиентом), но его дисперсия убывает с ростом размера батча примерно как 1/B1/|B|, то есть стандартное отклонение шума падает как 1/B1/\sqrt{|B|}. Отсюда и главный компромисс SGD: батч побольше даёт более точную оценку градиента и более гладкий спуск, но каждый шаг обходится дороже; батч поменьше (вплоть до одного примера) даёт дешёвые, но шумные шаги.

Почему SGD не сходится точно в минимум

У полного градиентного спуска с постоянным шагом на квадратичной функции траектория гладко сходится к минимуму, и f0\nabla f \to 0 гасит и сам шаг. У SGD шум ξk\xi_k от градиента не зависит от того, насколько параметры близки к минимуму, - он не исчезает, когда θk\theta_k уже рядом с оптимумом. Из-за этого при постоянной скорости обучения η\eta траектория не останавливается в точке минимума, а входит в небольшую область вокруг него и дальше блуждает внутри неё - размер этой области растёт с η\eta и с дисперсией шума и падает с размером батча.

Область блуждания SGD вокруг минимума: при постоянной скорости обучения точка не останавливается в нуле, а колеблется в шаре радиусом порядка eta умножить на эффективный шум
Область блуждания SGD вокруг минимума: при постоянной скорости обучения точка не останавливается в нуле, а колеблется в шаре радиусом порядка eta умножить на эффективный шум

Именно поэтому на практике скорость обучения η\eta часто не держат постоянной, а уменьшают по ходу обучения (расписание, например ηk=η0/k\eta_k = \eta_0 / \sqrt{k} или ступенчатое снижение) - тогда шаги становятся мельче, шар блуждания сжимается, и в пределе SGD может сходиться точно к минимуму. Без такого расписания метод даёт быстрый прогресс на старте, но выходит на «шумное плато» и перестаёт заметно улучшать функцию потерь.

Слева на линиях уровня квадратичной чаши гладкая траектория полного градиентного спуска ровно приходит в минимум; справа та же чаша с траекторией SGD - она подходит близко к минимуму, но дальше зашумлённо блуждает вокруг него, не останавливаясь в точке ноль

Роль размера батча и скорости обучения

Размер мини-батча - не только вопрос вычислительной цены, но и прямой рычаг управления шумом. Если обозначить базовый уровень шума на одном примере как σ\sigma, то эффективное стандартное отклонение шума градиента по батчу размера BB составляет:

σeff=σB.\sigma_{\text{eff}} = \frac{\sigma}{\sqrt{B}}.

Увеличение батча в 4 раза уменьшает шум ровно вдвое - не пропорционально, а по корню, поэтому отдача от увеличения батча быстро падает: чтобы вчетверо снизить шум, батч нужно увеличить в 16 раз. Скорость обучения η\eta действует иначе: она одинаково масштабирует и полезный сигнал (движение к минимуму), и шум, поэтому просто уменьшать η\eta ради борьбы с шумом - не бесплатно, это же замедляет и сходимость по сигналу. Разумный компромисс - умеренный батч (не обязательно весь датасет) вместе с расписанием, которое снижает η\eta по мере приближения к минимуму. В калькуляторе выше это видно напрямую: переключи размер батча и посмотри, как меняется толщина «облака» вокруг конечной траектории SGD на графике сходимости.

Похожий, но принципиально другой рычаг управления шагом - метод наискорейшего спуска, где длина шага на каждой итерации не фиксируется заранее, а вычисляется точной одномерной минимизацией; там источник зигзага - не шум оценки градиента, а форма (обусловленность) самой функции потерь.

Пример решения типовой задачи

Возьмём ту же модельную чашу потерь f(x,y)=12(x2+6y2)f(x, y) = \tfrac12(x^2 + 6y^2), старт из точки (x0,y0)=(8,4)(x_0, y_0) = (8, 4), скорость обучения η=0,12\eta = 0{,}12 и батч размера 1 (максимальный шум, σeff=1,5\sigma_{\text{eff}} = 1{,}5). Полный градиент в старте: f(8,4)=(8,24)\nabla f(8, 4) = (8, 24). Оценка по батчу добавляет к нему шум первого шага ξ0=(0,497, 0,813)\xi_0 = (0{,}497,\ 0{,}813), умноженный на σeff\sigma_{\text{eff}}:

g0=(8+1,50,497,  24+1,50,813)=(8,75, 25,22).g_0 = (8 + 1{,}5 \cdot 0{,}497,\ \ 24 + 1{,}5 \cdot 0{,}813) = (8{,}75,\ 25{,}22).

Шаг обновления даёт новую точку и новое значение потерь:

(x1,y1)=(8,4)0,12(8,75, 25,22)=(6,95, 0,97),f(x1,y1)27,0.(x_1, y_1) = (8, 4) - 0{,}12 \cdot (8{,}75,\ 25{,}22) = (6{,}95,\ 0{,}97), \qquad f(x_1, y_1) \approx 27{,}0.

За 30 таких шагов итоговое значение функции потерь и его зависимость от размера батча (при том же η\eta) выглядят так:

Размер батчаσeff\sigma_{\text{eff}}ff после 30 шагов
11,50≈ 0,27
40,75≈ 0,10
160,375≈ 0,05
640,188≈ 0,03
полный градиент (GD)0≈ 0,015

Видно закономерность из предыдущего раздела: чем больше батч, тем ближе итоговое значение к результату полного градиентного спуска, но даже батч 64 не даёт точно такого же ff, как GD, - небольшой шум остаётся всегда, пока η\eta постоянна.

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

  • Путать SGD с обычным градиентным спуском. В классическом (батч-) градиентном спуске градиент на каждом шаге точный - по всей выборке; в SGD это всегда оценка по мини-батчу или одному примеру, отсюда и шум.
  • Ждать, что итоговое значение функции потерь дойдёт до нуля. При постоянной скорости обучения SGD в общем случае сходится не к точке минимума, а к небольшой окрестности вокруг неё - это не баг, а свойство метода.
  • Считать, что увеличение батча вдвое вдвое же снижает шум. Зависимость идёт через корень: σeff1/B\sigma_{\text{eff}} \propto 1/\sqrt{B}, а не 1/B1/B. Чтобы снизить шум в 2 раза, батч нужно увеличить в 4 раза.
  • Игнорировать взаимосвязь батча и скорости обучения. Один и тот же η\eta при маленьком батче может расходиться, хотя при полном градиенте с тем же η\eta спуск был устойчив, - шум увеличивает эффективный разброс шага.
  • Забывать про несмещённость оценки. Хотя каждый отдельный шаг SGD зашумлён, в среднем по батчам оценка градиента gkg_k совпадает с истинным f(θk)\nabla f(\theta_k) - это и есть формальная причина, почему метод вообще работает.

FAQ

Чем SGD отличается от градиентного спуска (GD)? В GD градиент считается точно по всей обучающей выборке на каждом шаге; в SGD - по одному примеру или мини-батчу, из-за чего оценка градиента шумная, а траектория - зигзагообразная и не гладкая.

Почему SGD не сходится точно к минимуму при постоянной скорости обучения? Потому что шум оценки градиента не зависит от расстояния до минимума и не исчезает, когда параметры уже рядом с оптимумом. Точка входит в небольшую область вокруг минимума и продолжает в ней блуждать.

Как размер батча влияет на шум градиента? Эффективное стандартное отклонение шума убывает как 1/B1/\sqrt{B}, где BB - размер батча. Увеличение батча в 4 раза снижает шум только вдвое - отдача от роста батча ограничена.

Нужно ли уменьшать скорость обучения по ходу обучения SGD? Да, если нужна сходимость точно к минимуму: убывающее расписание ηk\eta_k (например η0/k\eta_0/\sqrt{k}) сжимает область блуждания к нулю. При постоянной η\eta метод быстро прогрессирует на старте, но выходит на шумное плато.

Коротко

Стохастический градиентный спуск обновляет параметры по формуле θk+1=θkηgk\theta_{k+1} = \theta_k - \eta\, g_k, где gkg_k - несмещённая, но зашумлённая оценка полного градиента по мини-батчу размера BB. Дисперсия шума убывает как 1/B1/B, поэтому эффективный разброс шага падает как 1/B1/\sqrt{B}: батч побольше сглаживает траекторию, но не бесплатно по вычислениям. При постоянной скорости обучения метод не сходится точно в минимум, а входит в небольшую область блуждания вокруг него, - избавиться от этого можно только убывающим расписанием ηk\eta_k. Это ровно то же ядро правила обновления, которое лежит в основе обучения нейросетей через обратное распространение ошибки: backpropagation считает градиент функции потерь по весам, а SGD (или его модификации вроде Adam) решает, как именно этим градиентом обновлять веса на каждом шаге.

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

Открыть EssayAI

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

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

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

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

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

19 июня 20268 минут
Оптимизатор Adam: формула и параметры

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

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

11 июня 20267 минут
Алгоритм AdaBoost: как слабые классификаторы дают сильный

Алгоритм AdaBoost: как слабые классификаторы дают сильный

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

20 июня 20267 минут
Алгоритм CatBoost: бустинг с обработкой категорий

Алгоритм CatBoost: бустинг с обработкой категорий

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

20 июня 20268 минут
Алгоритм LightGBM: быстрый градиентный бустинг

Алгоритм LightGBM: быстрый градиентный бустинг

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

20 июня 20268 минут
Алгоритм policy gradient: как обучают стратегию напрямую

Алгоритм policy gradient: как обучают стратегию напрямую

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

20 июня 20267 минут