Ответ
Классический градиентный спуск имеет несколько ключевых модификаций, которые решают проблемы сходимости, шумом и выбором 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 может в итоге выдать результат даже лучше, особенно в каких-нибудь задачках по зрению. Но это уже высший пилотаж, где без подозрения ебать чувствую не обойтись.