Градиентный спуск
Один алгоритм, который обучает почти всё: от линейной регрессии до GPT. Понимание градиентного спуска — обязательный минимум на любом ML-собеседовании, потому что через него объясняются learning rate, локальные минимумы и половина проблем обучения нейросетей.
Интуиция: спуск с горы в тумане
Представь, что ты стоишь на склоне горы в густом тумане и хочешь спуститься в долину. Карты нет, видно только землю под ногами. Разумная стратегия: нащупать, в какую сторону склон уходит вниз круче всего, сделать шаг туда — и повторять, пока не окажешься в низине.
В машинном обучении «гора» — это поверхность функции потерь (loss function) L(θ): каждой комбинации параметров модели θ соответствует своя высота — величина ошибки. «Нащупать склон» позволяет производная: она говорит, как изменится лосс при малом изменении параметра. Для многих параметров таких производных много, и вектор из них называется градиентом (gradient) ∇L — он указывает направление наискорейшего роста функции. Значит, чтобы спускаться, идти надо против него.
Как это работает
Весь алгоритм — одна строка, повторяемая в цикле:
Здесь η (эта) — скорость обучения (learning rate): множитель, задающий длину шага. Минус — потому что градиент смотрит вверх, а мы идём вниз. Подбор η — главный практический вопрос:
- Слишком маленький — спуск верный, но мучительно медленный: тысячи шагов там, где хватило бы десятков.
- Умеренный — быстрое и стабильное приближение к минимуму.
- Слишком большой — шаг перелетает через долину на противоположный склон, ошибка начинает расти, и процесс расходится (divergence): лосс улетает в бесконечность.
Проведи три эксперимента: 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?» — расходимость или осцилляции / медленная сходимость и застревание. Идеальный ответ упоминает расписание (learning rate schedule): начать больше, к концу уменьшать.
- «Чем SGD лучше полного batch-градиента?» — шаг в тысячи раз дешевле, шум помогает исследовать поверхность; сходимость по числу шагов хуже, но по времени — быстрее.
- «Почему нельзя просто решить ∇L = 0 аналитически?» — для нейросетей замкнутой формы решения нет, уравнения нелинейны по миллиардам параметров.