ИнтВиз

Математический анализ · модуль 1 из 14

Градиентный спуск: как обучается нейросеть

Функция потерь показана линиями уровня. На каждом шаге модель сдвигает параметры против градиента. Щёлкните по полю, чтобы выбрать стартовую точку.

  • траектория параметров
  • потери (лог. шкала)
  • старт: щёлкните по полю

Считаю траекторию…

Теория

Градиент функции двух переменных — вектор её частных производных:

$$ \nabla f(x, y) = \left( \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right). $$

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

Градиентный спуск ищет минимум, многократно делая шаг против градиента:

$$ w_{k+1} = w_k - \eta \, \nabla L(w_k), $$

где $\eta$ — шаг обучения (learning rate). Спуск останавливается, когда длина градиента становится меньше заданной точности.

Условие устойчивости. Для квадратичной функции потерь $L(w_1, w_2) = \tfrac12 (w_1^2 + k\,w_2^2)$ шаг спуска действует на каждую координату отдельно:

$$ w_1 \leftarrow (1 - \eta)\, w_1, \qquad w_2 \leftarrow (1 - \eta k)\, w_2. $$

Координата $w_2$ убывает, только если $|1 - \eta k| < 1$, то есть при $0 < \eta < 2/k$. Чем больше $k$ («вытянутость оврага»), тем меньше допустимый шаг и тем медленнее сходится координата $w_1$. При $\eta$ близком к $2/k$ траектория колеблется поперёк оврага, при $\eta \ge 2/k$ потери растут.

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

Где это применяется в IT

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

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

Код на Python

Загружаю пример…