Momentum

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

Основная идея Momentum

В стандартном градиентном спуске веса обновляются по правилу:

[ w w - ]

где ( ) — скорость обучения, а ( ) — градиент функции потерь по весу ( w ).

Momentum вводит накопление предыдущих изменений весов, создавая эффект инерции:

[ v v - ] [ w w + v]

где ( v ) — скорость изменения веса, ( ) — коэффициент момента (обычно 0.9), а ( ) — learning rate.

Ключевые эффекты Momentum:

  • Ускорение сходимости в направлениях с низким градиентом.
  • Сглаживание колебаний при высоких градиентах.
  • Возможность перескакивать через мелкие локальные минимумы.

Настройка Momentum в ConvNetJS

ConvNetJS предоставляет класс Trainer, который управляет обучением нейронной сети. Momentum задается через параметр momentum при создании экземпляра Trainer:

var trainer = new convnetjs.SGDTrainer(net, {
    method: 'sgd',
    learning_rate: 0.01,
    momentum: 0.9,
    batch_size: 10,
    l2_decay: 0.0001
});

Пояснение параметров:

  • learning_rate — скорость обучения, определяет величину шага вдоль градиента.
  • momentum — коэффициент момента, обычно выбирается в диапазоне 0.8–0.99.
  • batch_size — размер мини-батча для вычисления градиента.
  • l2_decay — коэффициент регуляризации для предотвращения переобучения.

Влияние значения momentum

  1. Малое значение (0–0.5): эффект инерции слабый, сеть обучается медленно, но стабильнее.
  2. Среднее значение (0.6–0.9): баланс между скоростью сходимости и устойчивостью, чаще всего оптимальный выбор.
  3. Высокое значение (0.9–0.99): сеть движется быстро, но возможны сильные колебания и переход через глобальный минимум.

Momentum и mini-batch

Momentum особенно полезен при работе с мини-батчами. Поскольку градиенты мини-батча шумные, накопление изменения через momentum сглаживает обучение и ускоряет сходимость.

Пример использования:

for (var i = 0; i < 1000; i++) {
    var x = new convnetjs.Vol(1, 1, 3);
    x.w = [Math.random(), Math.random(), Math.random()];
    var y = trainer.train(x, target_label);
}

При каждом вызове trainer.train обновления весов учитывают предыдущие изменения, что уменьшает “скачки” градиента и повышает устойчивость к шуму в данных.

Momentum vs Nesterov

ConvNetJS также поддерживает вариант Nesterov Accelerated Gradient (NAG), который отличается предварительным расчетом градиента на предполагаемом новом положении веса:

var trainer = new convnetjs.SGDTrainer(net, {
    method: 'nag',
    learning_rate: 0.01,
    momentum: 0.9
});

Разница: классический Momentum вычисляет градиент в текущей позиции, а NAG — чуть впереди, предсказывая направление движения. Это позволяет быстрее корректировать траекторию и избегать переходов через оптимум.

Практические рекомендации

  • Значение momentum около 0.9 — хороший стандарт для большинства задач.
  • Высокие скорости обучения требуют меньшего momentum для стабильности.
  • Momentum хорошо комбинируется с learning_rate_decay для постепенного снижения скорости обучения по мере тренировки.
  • При использовании momentum меньше вероятности “залипания” в локальных минимумах, особенно на сложных, высокоразмерных функциях потерь.

Визуализация влияния Momentum

Для демонстрации эффекта Momentum можно отслеживать путь веса в двумерной функции потерь. Без momentum веса “дрожат” вдоль градиента, двигаясь медленно. С momentum траектория становится более гладкой и прямолинейной, быстрее достигая минимума.

Использование momentum в ConvNetJS — простой способ значительно ускорить обучение нейронной сети, повысить устойчивость к шуму и улучшить общую эффективность градиентного спуска.