Стохастический градиентный спуск — это метод оптимизации, при котором параметры модели обновляются по одному случайно выбранному примеру, а не по всему набору данных сразу. За счет этого обучение обычно требует меньше вычислений на каждом шаге и лучше масштабируется на больших выборках.
Этот алгоритм постоянно встречается в машинном обучении и глубоком обучении. Им обучают линейные модели, логистическую регрессию, нейросети и другие системы, где нужно уменьшать ошибку предсказания шаг за шагом.
Содержание статьи
Как работает градиентный спуск
Градиентный спуск уменьшает функцию потерь, двигая параметры модели в сторону, противоположную градиенту. Проще говоря, алгоритм смотрит, куда ошибка растет быстрее всего, и делает шаг в обратную сторону.
У любой обучаемой модели есть функция потерь. Она показывает, насколько предсказания отличаются от правильных ответов. Если ошибка большая, параметры модели подобраны неудачно. Если малая, модель ближе к хорошему решению.
На каждом шаге алгоритм вычисляет градиент функции потерь по параметрам модели. Градиент — это набор производных, который показывает направление роста ошибки. После этого параметры обновляются с учетом скорости обучения. Это число определяет размер шага.
Слишком маленький шаг замедляет обучение. Слишком большой может приводить к перескоку через минимум, из-за чего ошибка начинает колебаться или вовсе перестает уменьшаться.
Чем стохастический вариант отличается от обычного
Обычный градиентный спуск использует весь обучающий набор для одного обновления параметров, а стохастический градиентный спуск берет только один случайный пример. В этом и состоит главное различие.
Если данных много, полный проход по выборке перед каждым шагом оказывается дорогим по времени и памяти. Стохастический вариант заметно легче: он обновляет веса сразу после обработки одного объекта.
У такого подхода есть обратная сторона. Направление обновления получается более шумным, потому что один пример может плохо отражать поведение всей выборки. Поэтому траектория обучения выглядит менее плавной, чем у классического градиентного спуска.
Но этот шум иногда полезен. Он помогает алгоритму не застревать в неглубоких локальных минимумах и седловых точках, которые часто встречаются в задачах с большим числом параметров.
Почему на практике часто имеют в виду мини-пакеты
Строгое SGD обновляет модель по одному примеру, но в современных библиотеках под SGD часто понимают обучение на небольших пакетах данных. Такой вариант называют мини-пакетным градиентным спуском.
Мини-пакет берет не один объект, а маленькую группу. Градиент считается по среднему значению ошибки внутри этой группы. Из-за этого обновления становятся менее шумными, чем при обучении на одном примере.
Именно поэтому в глубоком обучении чаще используют мини-пакеты. Они дают разумный баланс между скоростью, стабильностью и удобством вычислений на GPU.
Что происходит с сходимостью
Сходимость означает, что параметры модели постепенно приходят к области минимума функции потерь. Для SGD этот процесс обычно более неровный, чем для полного градиентного спуска.
Полный градиентный спуск движется более предсказуемо, потому что на каждом шаге опирается на всю выборку. Стохастический вариант обновляет параметры по случайным примерам, поэтому значения функции потерь могут заметно колебаться даже при общем движении вниз.
Такие колебания не всегда вредны. В ряде задач они помогают продолжать поиск, когда слишком аккуратный алгоритм уже бы остановился рядом с неудачным минимумом.
На поведение сходимости сильно влияет скорость обучения. При неудачном значении модель либо учится слишком медленно, либо начинает прыгать вокруг минимума без устойчивого улучшения.
Формула обновления параметров
Общее правило обновления выглядит т��к: параметр уменьшается на произведение скорости обучения и градиента функции потерь по этому параметру.
Записать это можно в стандартном виде: θ := θ — η · ∇θL(θ). Здесь θ — параметр модели, η — скорость обучения, а ∇θL(θ) — градиент функции потерь по этому параметру.
В полном градиентном спуске градиент считается по всей выборке. В SGD он приближается по одному случайному примеру. Поэтому вместо общей функции потерь используется ошибка отдельного наблюдения.
Идея простая: не ждать дорогого точного расчета, а делать быстрые приближенные шаги много раз подряд.
Простой пример на линейной регрессии
В линейной регрессии модель пытается подобрать прямую вида y = wx + b, где w — вес, а b — смещение. SGD обновляет эти два параметра после каждого отдельного примера.
Предсказание для одного объекта записывается как y^ = wx + b. Если предсказание отличается от истинного значения y, возникает ошибка. Квадрат этой ошибки можно использовать как функцию потерь для одного примера.
Дальше вычисляются производные по w и b. Они показывают, как изменить каждый параметр, чтобы уменьшить ошибку. После этого оба параметра обновляются по правилу градиентного спуска.
Вместо среднего градиента по всей выборке алгоритм использует оценку по одному наблюдению. Поэтому шаг получается дешевле вычислительно, но более шумным.
Как выглядит процесс обучения по шагам
Обучение с помощью SGD состоит из повторяющихся обновлений параметров на случайных примерах или небольших пакетах. Цель — постепенно уменьшить функцию потерь.
- Инициализируются параметры модели.
- Из обучающей выборки выбирается случайный пример или мини-пакет.
- Модель строит предсказание.
- Вычисляется ошибка и градиенты по параметрам.
- Параметры обновляются с учетом скорости обучения.
- Процесс повторяется много раз, пока ошибка перестает заметно снижаться или не заканчивается заданное число эпох.
Одна эпоха — это проход по всей выборке. При SGD внутри эпохи происходит много отдельных обновлений, поэтому обучение получается более дробным и подвижным.
Какие плюсы и минусы есть у SGD
Главный плюс SGD — низкая стоимость одного шага. Главный минус — шумные обновления, из-за которых обучение становится менее стабильным.
| Параметр | SGD | Полный градиентный спуск |
| Данные на один шаг | Один пример или малый пакет | Вся выборка |
| Стоимость шага | Ниже | Выше |
| Шум обновлений | Выше | Ниже |
| Масштабирование на больших данных | Удобнее | Сложнее |
| Траектория обучения | Неровная | Более плавная |
На больших наборах данных преимущества SGD становятся особенно заметны. Но за скорость приходится платить более капризной настройкой скорости обучения и большим разбросом значений ошибки между шагами.
Какие варианты градиентного спуска используют вместе с SGD
На базе SGD появились методы, которые улучшают скорость сходимости и уменьшают колебания. Чаще всего их делят на методы с моментом, методы с адаптивной скоростью обучения и гибридные подходы.
Методы с моментом
Momentum и Nesterov accelerated gradient добавляют инерцию в обновления параметров. Это помогает двигаться устойчивее в направлениях, где градиент долго сохраняет знак, и уменьшает зигзагообразное поведение.
- Momentum использует накопленное среднее прошлых градиентов и ускоряет движение в согласованном направлении.
- NAG сначала оценивает, куда параметры сдвинутся по инерции, и только потом считает градиент для следующего шага.
Методы с адаптивной скоростью обучения
AdaGrad и RMSProp меняют скорость обучения отдельно для каждого параметра. Это отличает их от обычного SGD, где шаг задается единым значением.
AdaGrad уменьшает шаг для параметров, которые часто получают большие градиенты, и сохраняет более крупный шаг для редких признаков. RMSProp тоже масштабирует обновления по каждому параметру, но использует скользящее среднее квадратов градиентов, чтобы шаг не уменьшался слишком быстро.
Гибридные методы
Adam сочетает идеи момента и адаптивного изменения шага. Он одновременно учитывает среднее прошлых градиентов и среднее их квадратов.
Из-за этого Adam часто быстрее выходит на рабочий режим обучения. Но в ряде задач SGD с моментом может давать более удачное обобщение на новых данных.
Где стохастический градиентный спуск применяется чаще всего
SGD особенно полезен там, где модель обучается на больших массивах данных и содержит много параметров. Поэтому его регулярно используют в глубоком обучении и в ряде классических методов машинного обучения.
Типичные области применения:
- обучение глубоких нейронных сетей;
- линейная и логистическая регрессия;
- модели с регуляризацией;
- линейные SVM с функцией потерь hinge loss.
Для нейросетей этот подход особенно удобен, потому что обучение идет итеративно, а наборы данных бывают слишком большими для полного перерасчета градиента на каждом шаге.
Когда выбирать SGD, а когда смотреть на другие оптимизаторы
SGD подходит, когда важны масштабируемость, контроль над процессом обучения и работа с большими выборками. Другие оптимизаторы полезны, если нужна более быстрая стабилизация на старте или отдельная настройка шага для каждого параметра.
Если модель ведет себя слишком шумно, часто переходят к мини-пакетам, добавляют момент или используют Adam, RMSProp и похожие методы. Если задача хорошо переносит простую схему обновлений, SGD остается базовым и понятным выбором.
На практике вопрос обычно не в том, какой метод абстрактно лучше, а в поведении конкретной модели на конкретной функции потерь.
Краткий вывод
Стохастический градиентный спуск — это способ обучать модель через частые и дешевые обновления параметров по отдельным примерам или малым пакетам. Он быстрее масштабируется на больших данных, чем полный градиентный спуск, но вносит больше шума в процесс обучения.
Именно из этой комбинации и складывается его ценность: меньше вычислений на шаг, больше подвижности при поиске минимума и широкое применение в обучении современных моделей машинного обучения.