Градиентный спуск: как нейросеть находит минимум ошибки

Градиентный спуск: как нейросеть находит минимум ошибки

Данные на октябрь 2026, Python 3.13Опубликовано 27 ноября 2025Обновлено 25 сентября 20266 мин чтения
Чашеобразный спуск со стальным шариком в трёх положениях
Коротко
  • Градиентный спуск — итерационный метод: параметры модели сдвигают против градиента функции потерь, пока ошибка не перестанет падать.
  • Главный параметр метода — скорость обучения, то есть размер шага: слишком малый замедляет обучение, слишком большой отбрасывает от минимума.
  • Есть три варианта: по всей выборке, по одному объекту (стохастический) и по небольшим группам (мини-батч); для нейросетей используют мини-батч.
  • Метод не гарантирует глобальный минимум: для линейных моделей это верно, для нейросетей — нет.
Содержание10 разделов ▾
  1. Какую задачу решает градиентный спуск
  2. Что такое градиент
  3. Алгоритм по шагам
  4. Шаг 1. Выберите начальные параметры
  5. Шаг 2. Посчитайте ошибку и градиент
  6. Шаг 3. Сдвиньте параметры против градиента
  7. Шаг 4. Повторяйте
  8. Шаг 5. Остановитесь
  9. Пример с числами
  10. Скорость обучения
  11. Варианты метода
  12. Когда спуск застревает
  13. Условия и ограничения
  14. Частые ошибки
  15. Короткий вывод

Градиентный спуск — это метод, который шаг за шагом сдвигает параметры модели в ту сторону, где ошибка уменьшается быстрее всего, и останавливается, когда ошибка перестаёт падать. Именно так учится большинство нейросетей. Статья для тех, кто уже знает, что такое функция потерь и обучение модели, и хочет понять, как устроен сам процесс подбора весов.

Опираемся на курс машинного обучения Google, математический учебник Яндекса, обзор Себастьяна Рудера и статью про оптимизатор Adam. Расчёты проверены запуском на Python 3.13, данные на октябрь 2026 года.

Какую задачу решает градиентный спуск

Цель обучения — получить модель с наименьшей ошибкой. Ошибку записывают функцией потерь L(w)L(w), где ww — веса модели. Нужно найти такие веса, при которых LL минимальна. В учебнике Яндекса замечено: в большинстве случаев аналитического решения нет, а если оно есть, то может быть нестабильным или вычисляться долго. Поэтому используют итерационный подход: за несколько шагов можно найти решение с хорошей точностью.

Что такое градиент

Для функции одной переменной производная показывает, как быстро и в какую сторону растёт функция. Для функции многих переменных такую роль играет градиент: вектор частных производных по каждому параметру. По учебнику Яндекса, градиент показывает направление наискорейшего роста функции. Значит, чтобы уменьшать ошибку, нужно двигаться в противоположную сторону — по антиградиенту.

Алгоритм по шагам

Шаг 1. Выберите начальные параметры

Начните с некоторой точки: случайных или нулевых значений весов.

Шаг 2. Посчитайте ошибку и градиент

Вычислите значение функции потерь и градиент в текущей точке.

Шаг 3. Сдвиньте параметры против градиента

Новые значения получаются по формуле:

wt+1=wt−η ∇L(wt)w_{t+1} = w_t - \eta \,\nabla L(w_t)

Расшифровка: wtw_t — веса на шаге tt, ∇L(wt)\nabla L(w_t) — градиент функции потерь в этой точке, η\eta (эта) — скорость обучения, то есть размер шага. Минус означает движение против градиента.

Шаг 4. Повторяйте

Вернитесь к шагу 2 и продолжайте, пока ошибка заметно уменьшается.

Шаг 5. Остановитесь

В учебнике Яндекса сказано: когда градиент около нуля, метод останавливают, и получившиеся веса считают искомыми. В курсе Google говорят, что модель сошлась (сошёлся процесс обучения), когда дальнейшие итерации существенно не уменьшают потери.

Пример с числами

Возьмём самую простую функцию f(x)=x2f(x)=x^2 с минимумом в нуле. Её производная равна 2x2x, значит, шаг метода: xt+1=xt−η⋅2xtx_{t+1} = x_t - \eta \cdot 2x_t. Начнём с x=4x=4 и сравним три значения шага.

Python
def спуск(шаг, x=4.0, итераций=6):
    путь = [x]
    for _ in range(итераций):
        градиент = 2 * x          # производная функции f(x) = x**2
        x = x - шаг * градиент    # шаг против градиента
        путь.append(x)
    return путь

шаги = [0.05, 0.4, 1.1]
пути = [спуск(шаг) for шаг in шаги]
print("итерация   шаг 0.05   шаг 0.4   шаг 1.1")
for i in range(7):
    print(f"{i:^9}" + "".join(f"{путь[i]:>10.3f}" for путь in пути))
print("ошибка f(x)=x² на 6-й итерации:", *(f"{путь[-1] ** 2:.3f}" for путь in пути))

Вывод при запуске на Python 3.13.12:

Текст
итерация   шаг 0.05   шаг 0.4   шаг 1.1
    0         4.000     4.000     4.000
    1         3.600     0.800    -4.800
    2         3.240     0.160     5.760
    3         2.916     0.032    -6.912
    4         2.624     0.006     8.294
    5         2.362     0.001    -9.953
    6         2.126     0.000    11.944
ошибка f(x)=x² на 6-й итерации: 4.519 0.000 142.658

Скорость обучения

В таблице видны три сценария. Шаг 0,05 безопасен, но за шесть итераций точка прошла лишь половину пути. Шаг 0,4 за те же шесть итераций почти точно попал в минимум. Шаг 1,1 каждый раз перелетает через ноль и оказывается дальше, чем был: ошибка растёт с каждой итерацией. Это соответствует тому, что пишет учебник Яндекса: слишком большой шаг заставляет модель перескакивать минимум и блуждать, слишком малый — затягивает обучение.

Варианты метода

В учебнике Яндекса разобраны три способа считать градиент.

ВариантЧто считает на каждом шагеОсобенности
Полный (батч)Градиент по всей обучающей выборкеТочный, но очень дорогой; нужны тысячи итераций
СтохастическийГрадиент по одному случайному объектуБыстрый на шаге, но шумный: нужно больше итераций
Мини-батчГрадиент по небольшой группе объектов (например, 32 или 64)Золотая середина; для нейросетей используют именно его

Поверх этих вариантов строят оптимизаторы. Их разбирает обзор Рудера, а Кингма и Ба в статье 2014 года предложили Adam — метод стохастической оптимизации. Подробности смотрите в первоисточниках.

Когда спуск застревает

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

Условия и ограничения

Версия
Октябрь 2026 — данные приведены на дату написания; расчёт проверен на Python 3.13.12.
Функция
Дифференцируемость — метод требует, чтобы функцию потерь можно было дифференцировать по параметрам.
Шаг
Подбирается опытным путём — значения шага в примере учебные и не подходят для настоящих моделей.
Гарантии
Выпуклость — для линейных моделей метод находит глобальный минимум, для нейросетей такой гарантии нет.
Пример
Одна переменная — на одной переменной показана идея; в нейросетях параметров миллионы и больше.

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

  • Берут шаг «на глаз» и не смотрят на график ошибки по итерациям.
  • Не смотрят на график ошибки: расходящийся спуск по цифрам в начале легко принять за обучение.
  • Останавливаются слишком рано, пока ошибка ещё заметно падает.
  • Путают минимум на обучающих данных и на проверочных: хорошая обучающая ошибка ещё не значит хорошую модель.
  • Считают, что спуск всегда находит глобальный минимум.
  • Путают понятия: градиентный спуск вычисляет сдвиг весов, а градиенты по слоям нейросети получают методом обратного распространения.

Короткий вывод

Градиентный спуск движет параметры против градиента функции потерь с шагом, который задаёт скорость обучения. Шаг определяет, сойдётся ли метод: слишком малый и слишком большой одинаково плохи. Для нейросетей применяют мини-батч-вариант, а гарантий глобального минимума там нет. Дальше стоит изучить обратное распространение ошибки и оптимизаторы вроде Adam.

Источники

  1. Google for Developers: Linear regression — Gradient descent (Machine Learning Crash Course)↗ developers.google.com
  2. Математика для анализа данных (Яндекс): Градиентные методы↗ education.yandex.ru
  3. Ruder. An overview of gradient descent optimization algorithms, arXiv:1609.04747↗ arxiv.org
  4. Kingma, Ba. Adam: A Method for Stochastic Optimization, arXiv:1412.6980↗ arxiv.org
  5. Википедия: Градиентный спуск↗ ru.wikipedia.org

Частые вопросы

Что такое градиентный спуск простыми словами?

Это способ подобрать параметры модели так, чтобы ошибка стала минимальной. Модель начинает с некоторых значений, считает ошибку, определяет, в какую сторону параметры нужно сдвинуть, чтобы ошибка уменьшилась, и делает небольшой шаг. Так повторяют, пока ошибка не перестанет заметно падать. В курсе Google это описано как итерационный метод поиска весов и смещения с наименьшей потерей.

Как работает градиентный спуск в нейросетях?

Нейросеть обучают минимизацией функции потерь по весам. Градиент показывает направление наискорейшего роста ошибки, поэтому веса сдвигают в противоположную сторону. В учебнике Яндекса для нейросетей используют мини-батч-вариант: градиент считают по небольшой группе объектов, а не по всей выборке. Сами градиенты для всех слоёв вычисляют методом обратного распространения ошибки.

Что такое скорость обучения и как её выбрать?

Скорость обучения — размер шага вдоль антиградиента. По учебнику Яндекса, если шаг слишком большой, модель может перескочить через минимум и начать блуждать, а если слишком маленький, обучение затянется. Подбирают шаг опытным путём: смотрят на график ошибки по итерациям. Если ошибка растёт, шаг нужно уменьшить. Пример с тремя значениями шага есть в этой статье.

Чем стохастический градиентный спуск отличается от обычного?

Обычный градиентный спуск считает градиент по всей обучающей выборке, а стохастический — по одному случайному объекту. Он гораздо быстрее на каждом шаге, но шумнее, и для сходимости ему нужно больше итераций. Золотая середина — мини-батч: градиент по небольшой группе, например из 32 или 64 объектов. Как отмечено в учебнике Яндекса, на практике мини-батч тоже часто называют стохастическим.

Где на русском языке изучать эту тему подробно?

Подробный разбор есть в открытом учебнике «Математика для анализа данных» Яндекса, раздел «Градиентные методы», и в «Учебнике по машинному обучению» Школы анализа данных, глава об оптимизации. Определения и варианты метода также описаны в статье «Градиентный спуск» на Википедии. Обзор вариантов и их недостатков в виде научной статьи на английском написал Себастьян Рудер.

  • #gradientnyj-spusk
  • #obuchenie
  • #optimizaciya
РедакцияМатериал подготовлен по источникам выше · 25 сентября 2026