Gradient Descent
Градиентный спуск обучает модели, многократно изменяя их веса в направлении, противоположном градиенту функции потерь. Рассматриваются скорость обучения, SGD, момент и Adam.
Градиентный спуск — это итерационный алгоритм оптимизации, на котором обучается большинство моделей машинного обучения: от линейной регрессии до крупных нейронных сетей. На каждом шаге алгоритм вычисляет градиент функции потерь относительно каждого веса модели и сдвигает каждый вес на небольшой шаг в противоположном направлении — туда, где функция потерь убывает быстрее всего. Правило обновления: w ← w − η∇L(w), где η — это скорость обучения. Часто используют такой образ: альпинист спускается с горы в густом тумане. Не видя долины, он чувствует наклон под ногами и снова и снова делает шаг вниз, пока поверхность не выравнивается.
Как работает градиентный спуск#
Каждая итерация состоит из трёх частей. Прямой проход вычисляет предсказания и функцию потерь, обратное распространение ошибки вычисляет градиент функции потерь относительно каждого веса, а оптимизатор обновляет веса. Согласно определению градиента в многомерном анализе, градиент указывает вверх по поверхности функции потерь, поэтому вычитание градиента сдвигает веса вниз.
Варианты различаются объёмом данных, используемых на каждом шаге. Пакетный градиентный спуск вычисляет точный градиент по всему набору обучающих данных; он точен, но медленно работает на больших наборах данных. Стохастический градиентный спуск (SGD) оценивает градиент по одному примеру, а мини-пакетный градиентный спуск, стандартный метод в глубоком обучении, усредняет градиенты по пакету из десятков или тысяч примеров, чтобы загружать GPU. Шум в градиентах мини-пакетов также помогает весам проходить седловые точки и острые минимумы. Один полный проход по обучающему набору — это эпоха.
Выбор скорости обучения#
Скорость обучения определяет размер шага и обычно становится первым гиперпараметром, который настраивают при градиентном спуске. Слишком низкая скорость приводит к лишним вычислениям из-за медленного приближения к минимуму, а слишком высокая — к его перескакиванию. Для квадратичной функции потерь любая скорость выше двух, делённых на кривизну функции, приводит к тому, что каждый следующий шаг оказывается дальше от минимума, чем предыдущий. В приведённом ниже фрагменте кода выражение (w − 2)² с кривизной 2 минимизируется с тремя значениями скорости обучения в PyTorch:
import torch
# Minimize loss(w) = (w - 2)^2, whose minimum is at w = 2, with three learning rates
for lr in [0.1, 0.5, 1.1]:
w = torch.tensor(5.0, requires_grad=True)
for step in range(20):
loss = (w - 2) ** 2
loss.backward() # w.grad now holds the slope 2 * (w - 2)
with torch.no_grad():
w -= lr * w.grad # step against the gradient
w.grad.zero_()
print(f"Learning rate {lr}: w = {w.item():.4f} after 20 steps")При скорости 0.1 вес после 20 шагов всё ещё равен 2.0346, скорость 0.5 даёт ровно 2.0000, поскольку она равна единице, делённой на кривизну, а скорость 1.1 каждый раз промахивается всё сильнее, пока w не достигает 117.0129. В реальных графиках обучения скорость сначала ненадолго разогревается, а затем снижается, часто по косинусной кривой, чтобы ранние шаги оставались стабильными, а поздние точно приводили к минимуму.
Momentum, Adam и современные оптимизаторы#
Обычный градиентный спуск зигзагами пересекает узкие долины поверхности потерь, поэтому при обучении чаще используют усовершенствованные правила обновления. Инерционный момент накапливает скользящее среднее прошлых градиентов и движется вдоль него, уменьшая колебания и ускоряя продвижение в устойчивых направлениях. Оптимизатор Adam также отслеживает квадраты градиентов каждого параметра, назначая каждому весу собственный адаптивный размер шага, а AdamW отделяет затухание весов от этого обновления. Muon ортогонализирует инерционное обновление каждой двумерной матрицы весов с помощью итераций Ньютона — Шульца, чтобы ни одно направление не доминировало в шаге. При обучении Ultralytics YOLO26 с optimizer="auto" выбирает AdamW с темпом обучения, подобранным по числу классов, для запусков длительностью до 10 000 итераций, а для более длительных запусков — MuSGD, который добавляет к SGD ортогонализированные обновления в стиле Muon для свёрточных и линейных весов.
Примеры применения в реальных условиях#
Градиентный спуск — основа обучения почти всех систем глубокого обучения. В автономных транспортных средствах он настраивает сети обнаружения объектов, чтобы уменьшить расхождение между предсказанными и размеченными рамками пешеходов, дорожных знаков и транспортных средств на миллионах кадров. В анализе медицинских изображений он обучает свёрточные нейронные сети, которые отделяют опухоли от здоровых тканей на снимках МРТ и КТ. Большие языковые модели обучаются так же, обычно с помощью AdamW на триллионах токенов.
Градиентный спуск и смежные понятия#
- Обратное распространение ошибки: Обратное распространение вычисляет градиенты по правилу дифференцирования сложной функции, а градиентный спуск использует их для обновления весов. На каждом шаге обучения эти два процесса выполняются последовательно и часто упоминаются вместе.
- Функция потерь: Функция потерь оценивает, насколько ошибочны предсказания модели, а градиентный спуск — это процедура, которая уменьшает эту оценку.
- Взрыв градиента: Когда градиенты в глубоких сетях бесконтрольно растут, градиентный спуск делает разрушительные шаги. Обрезка градиента предотвращает это, ограничивая норму градиента перед каждым обновлением.
- Эволюционные алгоритмы: Эти методы без градиентов ищут решения, генерируя и отбирая кандидатов без вычисления градиентов. Они подходят для целевых функций, которые нельзя дифференцировать, например при выборе гиперпараметров.










