Что такое momentum в контексте оптимизации нейронных сетей?

Ответ

Momentum (импульс) — это метод ускорения градиентного спуска, который добавляет инерцию процессу обновления весов. Вместо того чтобы двигаться строго по текущему градиенту, оптимизатор учитывает направление предыдущих обновлений, что помогает быстрее проходить плато и сглаживает колебания в узких оврагах функции потерь.

Механизм работы: Обновление весов происходит по формуле, которая включает в себя "накопленную скорость":

# Псевдокод обновления с импульсом
v = beta * v_prev + learning_rate * gradient
weights = weights - v

Где beta — коэффициент затухания импульса (обычно 0.9 или 0.99), а v_prev — скорость с предыдущего шага.

Практическое применение: В PyTorch импульс используется по умолчанию во многих оптимизаторах. Например, в SGD:

import torch.optim as optim

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

В Adam и его вариантах импульс интегрирован в алгоритм через вычисление экспоненциально взвешенного среднего градиентов (первый момент).

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

  1. Ускорение на плато: На участках с малым, но постоянным градиентом накопленная скорость увеличивается, ускоряя движение.
  2. Подавление шума: Противоположные по знаку шумовые градиенты частично компенсируют друг друга в накопленной скорости.
  3. Прохождение оврагов: Помогает двигаться вдоль дна узкого оврага, а не осциллировать от склона к склону.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Сейчас объясню на пальцах, чтобы даже мартышлюшка с бананом в руке поняла.

Momentum (импульс) — это такой трюк, чтобы наш градиентный спуск не тупил как пиздопроебибна на ровном месте. Вместо того чтобы на каждом шаге слушать только текущий градиент (который может врать, как последний пидарас шерстяной), оптимизатор с импульсом оглядывается назад и говорит: «А помнишь, чувак, мы в прошлый раз туда катились? Давай и сейчас туда же, с разгону!». Это помогает не застревать на плоских участках и меньше дёргаться в узких щелях функции потерь.

Как оно внутри устроено, бля: По сути, мы заводим себе «скорость» и катимся на ней, как хуй с горы. Формула проще простого:

# Псевдокод обновления с импульсом
v = beta * v_prev + learning_rate * gradient
weights = weights - v

Вот этот beta (обычно 0.9) — это коэффициент «недоверия». Типа, «на новую инфу от градиента я посмотрю, но и старую скорость на 90% учту, ёб твою мать». v_prev — это то, с какой скоростью мы неслись на прошлом шаге.

Где это впихнуть в код: В PyTorch это делается в два счёта. Хочешь в обычный SGD — пожалуйста:

import torch.optim as optim

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

А в том же Adam этот импульс уже вшит в саму суть, там он по-хитрому усредняет градиенты за прошлые шаги. Просто сиди и радуйся.

Ну и нахуя это всё, если по-чесноку:

  1. На плато не буксовать: Когда градиент маленький, но упорно в одну сторону, скорость потихоньку набирается — и через пару шагов ты уже летишь, как угорелый. Без импульса тут можно стоять овердохуища шагов.
  2. Шум отфильтровать: Если градиент сегодня говорит «налево», а завтра «направо» — это просто шум, ебать копать. Импульс эти выбросы сглаживает, потому что помнит общее направление движения.
  3. По оврагам не скакать: Представь узкую щель с крутыми склонами. Обычный спуск будет метаться от стенки к стенке, а импульсный — по инерции проскочит вдоль дна. Красота, ядрёна вошь!

В общем, без импульса сейчас вообще нихуя не делают, это как соль в супе. Ставишь 0.9 и забываешь, как страшный сон.