Математический анализ · модуль 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
Загружаю пример…