Градиентный спуск (gradient descent) — это итерационный метод оптимизации первого порядка: параметры модели обновляются шаг за шагом в направлении наискорейшего убывания целевой функции. В практических библиотеках это обычно выглядит как вычитание градиента, умноженного на learning rate — скорость обучения.
Если вам нужен короткий ответ на запрос «что такое градиентный спуск», он такой: это способ постепенно уменьшать ошибку модели, повторяя одно и то же правило обновления параметров. В TensorFlow и PyTorch вы чаще встретите не абстрактный термин, а конкретные оптимизаторы семейства SGD.
Английский термин: gradient descent. Также встречаются: SGD для стохастического варианта, momentum для варианта с импульсом; в историческом контексте в отчёте Беркли для частного случая используется термин steepest descent.
Простыми словами
Грубо говоря, можно представить холм в тумане. Вы стоите на склоне и хотите спуститься вниз, не видя всю карту сразу. Тогда вы проверяете, в какую сторону уклон сильнее вниз, делаете шаг, снова проверяете направление — и так много раз.
Градиентный спуск делает то же самое с параметрами модели: не «угадывает» лучший ответ за один раз, а много раз делает маленькие корректировки. Размер шага задаёт скорость обучения: слишком маленький шаг замедляет процесс, а слишком большой может сделать обновления грубыми — но конкретные значения нужно проверять по документации и задаче, потому что в источниках здесь нет универсальной рекомендации.
Как это работает
В официальном гайде TensorFlow градиентный спуск описан как итерационная техника оптимизации: параметры сдвигаются в направлении наискорейшего убывания, масштабированного скоростью обучения. В документации tf.keras.optimizers.SGD это записано как вычитание градиента, умноженного на learning_rate.
Схема одного цикла
параметры θ
↓
считаем целевую функцию / loss
↓
получаем градиент ∇f(θ)
↓
обновляем параметры
θ ← θ − η∇f(θ)
↓
повторяем шаги много раз
- Берутся текущие параметры модели.
- Вычисляется целевая функция — например, ошибка на текущих данных.
- Вычисляется градиент, то есть направление изменения этой функции.
- Параметры обновляются по правилу
θ ← θ − η∇f(θ), гдеη— скорость обучения. - Цикл повторяется много раз, пока обучение продолжается.
Историческая справка: в техническом отчёте Беркли первая формулировка метода вида u(i+1)=u(i)−λ(i)∇f(u(i)) приписывается Коши в 1847 году, а специальный случай называется steepest descent. Но это важное ограничение источников: в данном пакете есть поздний отчёт и архивная карточка книги, а не прямая проверка оригинального текста 1847 года.
Где применяется
- В TensorFlow/Keras для обучения параметров модели. Современный путь в TensorFlow 2 — использовать
tf.keras.optimizers.SGD. Документация прямо указывает, что это gradient-descent optimizer, а приmomentum=0он сводится к стандартному градиентному спуску. - В PyTorch в обычном training loop. Официальная схема использования
torch.optim.SGDтакая: обнулить градиенты, вычислить их через обратный проход по loss и вызватьoptimizer.step(). - В scikit-learn для больших наборов данных и признаков. Документация по линейным моделям называет SGD простым и эффективным подходом для сценариев с большим числом объектов и признаков, а
partial_fitподдерживает online или out-of-core learning. - В поддержке старого кода TensorFlow 1.x.
tf.compat.v1.train.GradientDescentOptimizerвсё ещё реализует algorithm gradient descent, но документация отмечает, чтоcompat.v1предназначен для TF1-era code, а не для новых TF2-проектов.
Практический пример
Ниже — минимальная схема шага обучения в PyTorch. Это не полный учебный проект, а короткий ориентир по официальной последовательности действий из документации torch.optim.SGD.
import torch
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
# один шаг обучения
optimizer.zero_grad() # обнулить накопленные градиенты
loss = criterion(model(x), y)
loss.backward() # вычислить градиенты по loss
optimizer.step() # обновить параметры
Что здесь происходит:
zero_grad()очищает ранее накопленные градиенты.loss.backward()запускает вычисление градиентов.optimizer.step()обновляет параметры по правилу SGD.
Если вы добавите momentum в оптимизатор, то получите вариант с импульсом, который также поддерживается и в PyTorch, и в tf.keras.optimizers.SGD. Практический вывод: в коде вы обычно работаете не с термином «градиентный спуск» как таковым, а с объектом оптимизатора.
Чем отличается от похожих терминов
| Термин | Что это | Где обычно встречается |
|---|---|---|
| Градиентный спуск | Общий принцип итерационного обновления параметров по правилу вида θ ← θ − η∇f(θ). |
Объяснение метода, формулы, документация по оптимизации. |
| Стохастический градиентный спуск (SGD) | Практическая реализация семейства методов градиентного спуска; именно её официально реализуют torch.optim.SGD и SGD-модели в scikit-learn. |
PyTorch, scikit-learn, training loops. |
| Градиентный спуск с momentum | Вариант SGD с импульсом. В TensorFlow Keras и PyTorch momentum задаётся параметром оптимизатора. | Когда в коде вы видите аргумент momentum. |
| tf.compat.v1.train.GradientDescentOptimizer | Конкретная старая реализация gradient descent для совместимости с TensorFlow 1.x. | Легаси-код, миграция на TF2. |
Коротко: gradient descent — это идея и базовое правило обновления, а SGD в современных фреймворках — рабочий инструмент, который вы используете в коде.
Ограничения и заблуждения
- Заблуждение: «градиентный спуск» и «SGD» — всегда одно и то же. Нет. В источниках это разведено: TensorFlow говорит о gradient descent как о принципе оптимизации, а PyTorch явно реализует stochastic gradient descent.
- Заблуждение: старый TensorFlow-оптимизатор нужен и в новых проектах. Нет.
tf.compat.v1.train.GradientDescentOptimizerпредназначен для TF1-era code, а не как основной путь для новых TF2-проектов. - Ограничение документации по версиям. В source pack версии на страницах документации и анонсов релизов не полностью совпадают: например, TensorFlow API-страницы здесь помечены как v2.16.1, при этом есть более свежий пост про TensorFlow 2.20. То же относится к другим экосистемам. Проверяйте документацию под вашу установленную версию.
- Ограничение области применения в scikit-learn. Рассматриваемые здесь SGD-оцениватели относятся к линейным моделям; документация позиционирует их как эффективный вариант для больших наборов и поддерживает
partial_fitдля online/out-of-core learning. - Историческое ограничение. Атрибуция Коши 1847 года в этой статье опирается на более поздний технический отчёт и архивную запись, а не на прямую проверку оригинального издания.
Редакционный вердикт: если вы изучаете термин для практики, запомните главное. Градиентный спуск — это базовая схема обновления параметров, но в реальном коде вы почти всегда будете работать с конкретным оптимизатором вроде tf.keras.optimizers.SGD или torch.optim.SGD, а для старого TensorFlow — только при поддержке легаси-кода.
Связанные термины и инструменты
Если вы хотите понять, какие модели потом используют такие методы обучения, посмотрите материалы про генеративный ИИ и латентное пространство. Для прикладного контекста также полезны семантический поиск и локальный запуск моделей (on-device): сами эти статьи не про оптимизаторы, но помогают понять, где обученные модели затем используются.
Из инструментов в этом контексте чаще всего встречаются TensorFlow Keras SGD, PyTorch SGD и SGD-оцениватели из scikit-learn.
Источники
- Optimizers with Core APIs | TensorFlow Core
- tf.keras.optimizers.SGD | TensorFlow v2.16.1
- tf.compat.v1.train.GradientDescentOptimizer | TensorFlow v2.16.1
- SGD — PyTorch 2.12 documentation
- 1.1. Linear Models — scikit-learn 1.9.0 documentation
- Version 1.9 — scikit-learn 1.9.0 documentation
- What’s new in TensorFlow 2.20
- Berkeley technical report on gradient methods (1972 PDF)
- Exercices d’analyse et de physique mathématique. by Augustin Louis Cauchy | Open Library
Вопросы и ответы
Градиентный спуск и SGD — это одно и то же?
Не совсем. Градиентный спуск — общий метод обновления параметров, а SGD в документации PyTorch и scikit-learn — конкретная практическая реализация стохастического варианта. В TensorFlow tf.keras.optimizers.SGD описан как gradient-descent optimizer, а при momentum=0 он сводится к стандартному варианту.
Почему в TensorFlow есть и SGD, и GradientDescentOptimizer?
Потому что это разные поколения API. Для современного TensorFlow 2 рекомендуются Keras-оптимизаторы, а tf.compat.v1.train.GradientDescentOptimizer нужен в первую очередь для TF1-era code и совместимости.
Где градиентный спуск полезен на практике?
В TensorFlow и PyTorch — для обучения параметров модели через оптимизатор. В scikit-learn — для больших линейных моделей и сценариев с partial_fit, когда нужен online или out-of-core режим.
Можно ли ориентироваться только на название версии в документации?
Нет, лучше сверять её с вашей установленной библиотекой. В supplied source pack версии страниц документации и более свежих анонсов релизов местами различаются, поэтому для точной работы проверяйте именно официальный раздел под вашу версию.