Какие модификации алгоритма градиентного спуска вы знаете?

Ответ

Классический градиентный спуск имеет несколько ключевых модификаций, которые решают проблемы сходимости, шумом и выбором learning rate.

По размеру батча:

  • Batch Gradient Descent: Использует весь набор данных для вычисления градиента. Точен, но медленен и требователен к памяти для больших данных.
  • Stochastic Gradient Descent (SGD): Вычисляет градиент и обновляет веса для одного случайного примера. Очень шумный, но быстрый и позволяет выходить из локальных минимумов.
  • Mini-batch SGD: Компромиссный вариант. Градиент вычисляется на небольшой случайной подвыборке (батче). Это наиболее распространенный на практике подход, сочетающий устойчивость и скорость.

Алгоритмы с адаптивным learning rate (наиболее популярные сегодня): Эти методы автоматически адаптируют шаг обучения для каждого параметра.

  • AdaGrad: Накопливает квадраты градиентов за все время, сильно уменьшая шаг для часто меняющихся параметров. Может преждевременно остановить обучение.
  • RMSprop: Решает проблему AdaGrad, используя скользящее среднее квадратов градиентов, что позволяет learning rate не стремиться к нулю.
  • Adam (Adaptive Moment Estimation): Комбинирует идеи Momentum (инерция) и RMSprop (адаптивный шаг). На практике часто является выбором по умолчанию из-за хорошей скорости сходимости.
    # Пример использования Adam в PyTorch
    import torch.optim as optim
    optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))

Методы с импульсом (Momentum):

  • Классический Momentum: Помогает ускорить сходимость в нужном направлении и сгладить колебания, добавляя долю предыдущего обновления к текущему градиенту.
  • Nesterov Accelerated Gradient (NAG): «Умный» вариант Momentum, который сначала делает большой шаг в направлении накопленной скорости, а затем вычисляет градиент и корректирует. Часто сходится быстрее.

Для большинства задач Adam или AdamW (с исправлением весового затухания) являются хорошей отправной точкой, а SGD с Momentum может дать лучший результат при тщательной настройке, особенно для компьютерного зрения.

Ответ 18+ 🔞

Ну вот, сидишь ты такой, пытаешься свою нейронку обучить, а она как баба на диете — то в одну сторону качнётся, то в другую, и нихуя не сходится. Всё потому, что классический градиентный спуск — это как ехать на тракторе по кочкам: в принципе до точки Б доедешь, но овердохуища времени убьёшь и всю душу вытрясешь. Ну и мозги, конечно.

Так вот, чувак, чтобы не бздеть над каждым шагом, народ придумал, как эту телегу усовершенствовать. Первый больной вопрос — размер батча.

Смотри. Batch Gradient Descecnt — это когда ты, мазохист ёбаный, загружаешь ВЕСЬ свой датасет в память разом, считаешь градиент по всем данным и только потом шагаешь. Точность — пиздец какая, но если данных больше, чем мозгов у чиновника, то комп просто накрывается медным тазом. Жрёт памяти, как не в себя, и тормозит, будто ему вилкой в глаз ткнули.

Stochastic (SGD) — полная противоположность, ёпта. Берёшь ОДИН случайный пример, по нему считаешь градиент и сразу обновляешь веса. Быстро? Быстрее ветра! Но шумно, блядь, как на стройке в семь утра. Градиент скачет туда-сюда, как угорелый, но зато есть шанс выскочить из локальной ямы, куда обычный метод провалится с головой.

Золотая середина — Mini-batch SGD. Берёшь не весь огород, и не одну картошку, а небольшую случайную кучку примеров. И стабильнее, чем SGD, и быстрее, чем полный батч. На практике все так и работают, потому что не ебут мозг и технике.

Но главная головная боль — это learning rate, шаг обучения. Выставить его — это как уговорить тещу на ремонт: если маленький — будешь ползти до глобального минимума сто лет, если большой — проскочишь его нахуй и будешь скакать вокруг, как мартышлюшка на батарейках.

Тут на сцену вылезают алгоритмы с адаптивным шагом. Их девиз: «Зачем мучиться, пусть каждый параметр сам решает, как ему шагать».

  • AdaGrad — он для каждого параметра копит историю, сколько и как тот «нашумел» (квадраты градиентов). Кто много шумит — тому шаг и урежет. Проблема в том, что история копится на всю жизнь, и в итоге шаг может упасть почти до нуля ещё до того, как модель нормально выучится. Доверия ебать ноль к нему после такого.
  • RMSprop — умнее. Он тоже смотрит на шум, но через скользящее среднее, как умный начальник. Старые грехи забываются, можно двигаться дальше. Уже терпимо.
  • Adam — это, блядь, рок-звезда сейчас. Берёт идеи Momentum (инерция, чтобы катиться в нужном направлении) и RMSprop (адаптивный шаг для каждого параметра), скрещивает их и получается монстр, который часто сходится быстро и стабильно. Его сейчас юзают по дефолту, не думая. Чувак, если не знаешь, с чего начать — стартуй с Adam, не ошибёшься.
# Пример использования Adam в PyTorch
import torch.optim as optim
optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))

Про импульс отдельно. Классический Momentum — это как катить тяжёлый шар по полю. Разогнался — и его уже не остановить мелкими кочками (шумом градиента). Помогает не дёргаться и быстрее ехать по нужному направлению.

Nesterov (NAG) — ещё хитрая жопа. Он сначала делает шаг по инерции (туда, куда катился шар), а УЖЕ ПОТОМ смотрит, где он оказался, и вычисляет градиент и корректируется. Получается более осознанное движение, часто сходится ещё шустрее.

Итог, ёпта? Для большинства дел бери Adam или AdamW (исправленная версия, где weight decay не ебёт мозг) — и будет тебе счастье. Но если ты упрямый перфекционист и готов потратить время на тонкую настройку, то SGD с Momentum может в итоге выдать результат даже лучше, особенно в каких-нибудь задачках по зрению. Но это уже высший пилотаж, где без подозрения ебать чувствую не обойтись.