Nesterov momentum представляет собой усовершенствованную версию классического стохастического градиентного спуска с моментумом, используемого для ускорения сходимости нейронных сетей и уменьшения колебаний при обучении. В ConvNetJS эта техника интегрирована на уровне оптимизаторов и позволяет эффективно обновлять веса слоев, учитывая прогнозируемое смещение градиента.
Классический моментум обновляет веса ( w ) по формулам:
[ v_{t+1} = v_t - L(w_t)] [ w_{t+1} = w_t + v_{t+1}]
где:
Nesterov momentum изменяет порядок вычислений, делая прогноз на основе предварительно смещённых весов:
[ v_{t+1} = v_t - L(w_t + v_t)] [ w_{t+1} = w_t + v_{t+1}]
Ключевой момент: градиент вычисляется не по текущим весам, а по весам, смещённым на шаг предыдущего импульса. Это позволяет системе «заглянуть вперёд», корректируя направление обновления более точно и предотвращая избыточное преодоление оптимума.
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 вместо обычного моментума.Предварительный прогноз веса: Вес смещается на текущий импульс: [ = w + v]
Вычисление градиента: Градиент берется в точке ( ), а не в ( w ): [ g = L()]
Обновление импульса: [ v_{} = v - g]
Корректировка веса: [ w_{} = w + v_{}]
Это отличие позволяет корректировать импульс «на ходу», делая шаг более осознанным и уменьшает вероятность выхода за локальный минимум.
momentum обычно находится в диапазоне
0.9–0.99. Слишком высокие значения могут вызвать нестабильность.learning_rate нужно подбирать экспериментально;
Nesterov momentum позволяет использовать чуть более высокие значения,
чем стандартный SGD.l2_decay для регуляризации.batch_size) помогает
стабилизировать градиенты и уменьшить шум в обновлениях.Nesterov momentum эффективно работает с большинством слоев:
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 сочетает простоту реализации с высокой эффективностью, позволяя создавать быстрые и устойчивые модели нейронных сетей.