Диагностика Mock-интервью
Главная · Основы машинного обучения

Градиентный спуск

Один алгоритм, который обучает почти всё: от линейной регрессии до GPT. Понимание градиентного спуска — обязательный минимум на любом ML-собеседовании, потому что через него объясняются learning rate, локальные минимумы и половина проблем обучения нейросетей.

Интуиция: спуск с горы в тумане

Представь, что ты стоишь на склоне горы в густом тумане и хочешь спуститься в долину. Карты нет, видно только землю под ногами. Разумная стратегия: нащупать, в какую сторону склон уходит вниз круче всего, сделать шаг туда — и повторять, пока не окажешься в низине.

В машинном обучении «гора» — это поверхность функции потерь (loss function) L(θ): каждой комбинации параметров модели θ соответствует своя высота — величина ошибки. «Нащупать склон» позволяет производная: она говорит, как изменится лосс при малом изменении параметра. Для многих параметров таких производных много, и вектор из них называется градиентом (gradient) ∇L — он указывает направление наискорейшего роста функции. Значит, чтобы спускаться, идти надо против него.

Как это работает

Весь алгоритм — одна строка, повторяемая в цикле:

θ ← θ − η·∇L(θ)

Здесь η (эта) — скорость обучения (learning rate): множитель, задающий длину шага. Минус — потому что градиент смотрит вверх, а мы идём вниз. Подбор η — главный практический вопрос:

💡 Ключевая мысль Градиент — это направление наискорейшего роста лосса, поэтому шаг делается со знаком минус. Всё остальное в оптимизации — надстройки над этой строчкой.

Проведи три эксперимента: 1) η ≈ 0.05 — шарик ползёт и застревает в ближайшей долине; 2) η ≈ 0.3–1 — шаги перепрыгивают мелкие ямы и находят долину поглубже; 3) η > 7 — каждый шаг закидывает шарик всё выше, лосс растёт: это и есть расходимость.

Локальные минимумы и сёдла

Спуск гарантированно находит глобальный минимум только у выпуклых (convex) функций — как у MSE в линейной регрессии. У нейросетей поверхность лосса изрезана: есть локальные минимумы (local minima) — долины, из которых чисто градиентным шагом не выбраться, и седловые точки (saddle points) — места, где градиент почти нулевой, но это не минимум: по одним направлениям функция растёт, по другим убывает. В высоких размерностях сёдла встречаются гораздо чаще локальных минимумов и именно они тормозят обучение. На практике помогают шум стохастического градиента, момент и адаптивные методы из темы про оптимизаторы.

SGD, batch и mini-batch

Честный градиент считается по всему датасету (batch gradient descent) — точно, но дорого: один шаг требует прохода по миллионам примеров. Другая крайность — стохастический градиентный спуск (SGD, stochastic gradient descent): градиент оценивается по одному случайному примеру. Шаги получаются шумными, зато очень дешёвыми, а шум иногда даже полезен — помогает выскакивать из плохих локальных минимумов.

Индустриальный стандарт — компромисс: mini-batch градиентный спуск, где градиент усредняется по небольшой пачке примеров (обычно 32–1024). Это одновременно снижает шум оценки и отлично ложится на параллелизм GPU. Когда в статьях пишут «SGD», почти всегда имеют в виду именно mini-batch вариант. Двигатель обучения глубоких сетей — он же: backpropagation лишь эффективно вычисляет градиент, а шаг делает всё тот же спуск.

⚠️ Подводный камень «Лосс перестал падать» не означает «learning rate слишком мал». Если лосс скачет вверх-вниз или растёт — η, наоборот, велик. Диагностируй по форме кривой лосса: плавное, но медленное падение — можно увеличить η; пила и взрывы — уменьшить; NaN в лоссе — почти всегда расходимость от слишком большого шага.
🎤 На собеседовании
  • «Почему шаг делается против градиента?» — градиент указывает направление наискорейшего роста функции, а мы минимизируем.
  • «Что будет при слишком большом/маленьком learning rate?» — расходимость или осцилляции / медленная сходимость и застревание. Идеальный ответ упоминает расписание (learning rate schedule): начать больше, к концу уменьшать.
  • «Чем SGD лучше полного batch-градиента?» — шаг в тысячи раз дешевле, шум помогает исследовать поверхность; сходимость по числу шагов хуже, но по времени — быстрее.
  • «Почему нельзя просто решить ∇L = 0 аналитически?» — для нейросетей замкнутой формы решения нет, уравнения нелинейны по миллиардам параметров.