Nesterov momentum

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

Математическая формулировка

Классический моментум обновляет веса ( w ) по формулам:

[ v_{t+1} = v_t - L(w_t)] [ w_{t+1} = w_t + v_{t+1}]

где:

  • ( v_t ) — накопленный импульс (velocity),
  • ( ) — коэффициент моментума (обычно 0.9),
  • ( ) — скорость обучения,
  • ( L(w_t) ) — градиент функции потерь по текущим весам.

Nesterov momentum изменяет порядок вычислений, делая прогноз на основе предварительно смещённых весов:

[ v_{t+1} = v_t - L(w_t + v_t)] [ w_{t+1} = w_t + v_{t+1}]

Ключевой момент: градиент вычисляется не по текущим весам, а по весам, смещённым на шаг предыдущего импульса. Это позволяет системе «заглянуть вперёд», корректируя направление обновления более точно и предотвращая избыточное преодоление оптимума.

Реализация в ConvNetJS

ConvNetJS предоставляет класс Trainer, где можно настроить метод оптимизации. Для использования Nesterov momentum необходимо указать параметр method: 'nesterov':

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

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

  • learning_rate — скорость обучения, контролирует длину шага в направлении градиента.
  • momentum — коэффициент накопления импульса. Значения 0.9–0.99 чаще всего дают хорошую сходимость.
  • batch_size — размер мини-батча, влияет на стабильность градиентов.
  • l2_decay — коэффициент регуляризации, предотвращающий переобучение.
  • method: 'nesterov' — активирует использование Nesterov momentum вместо обычного моментума.

Принцип работы шага обновления

  1. Предварительный прогноз веса: Вес смещается на текущий импульс: [ = w + v]

  2. Вычисление градиента: Градиент берется в точке ( ), а не в ( w ): [ g = L()]

  3. Обновление импульса: [ v_{} = v - g]

  4. Корректировка веса: [ w_{} = w + v_{}]

Это отличие позволяет корректировать импульс «на ходу», делая шаг более осознанным и уменьшает вероятность выхода за локальный минимум.

Преимущества Nesterov momentum

  • Более быстрый и стабильный градиентный спуск: шаги направлены более точно, что ускоряет сходимость.
  • Меньше колебаний: предотвращает раскачку в узких «канавках» функции потерь.
  • Улучшение обобщающей способности: позволяет модели избегать чрезмерного переобучения за счет плавного сглаживания траектории обучения.

Настройка и рекомендации

  • Значение momentum обычно находится в диапазоне 0.9–0.99. Слишком высокие значения могут вызвать нестабильность.
  • learning_rate нужно подбирать экспериментально; Nesterov momentum позволяет использовать чуть более высокие значения, чем стандартный SGD.
  • Для больших сетей рекомендуется комбинировать с l2_decay для регуляризации.
  • Использование мини-батчей (batch_size) помогает стабилизировать градиенты и уменьшить шум в обновлениях.

Взаимодействие с другими слоями ConvNetJS

Nesterov momentum эффективно работает с большинством слоев:

  • FullyConnectedLayer: ускоряет обучение весов всех нейронов.
  • ConvLayer: позволяет быстрее находить оптимальные фильтры свёртки.
  • PoolingLayer и ReluLayer: напрямую не обновляются, но корректнее передают градиенты на предыдущие слои благодаря предсказанному смещению.

Практический пример

var layer_defs = [];
layer_defs.push({type:'input', out_sx:28, out_sy:28, out_depth:1});
layer_defs.push({type:'conv', sx:5, filters:8, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'fc', num_neurons:10, activation:'softmax'});

var net = new convnetjs.Net();
net.makeLayers(layer_defs);

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

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

Nesterov momentum в ConvNetJS сочетает простоту реализации с высокой эффективностью, позволяя создавать быстрые и устойчивые модели нейронных сетей.