Оптимизатор Momentum

Оптимизация нейронных сетей представляет собой критически важный этап обучения моделей. Среди множества алгоритмов градиентного спуска особое место занимает Momentum, позволяющий ускорить сходимость и сгладить траектории обновления весов. TensorFlow.js предоставляет встроенную реализацию этого метода через класс tf.train.momentum.


Принцип работы Momentum

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

Формула обновления весов:

[ v_{t} = v_{t-1} + (1 - ) _J()]

[ _{t+1} = _t - v_t]

где:

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

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


Создание оптимизатора в TensorFlow.js

В TensorFlow.js оптимизатор Momentum создаётся с использованием класса tf.train.momentum. Конструктор принимает следующие параметры:

const optimizer = tf.train.momentum(
    learningRate,  // скорость обучения
    momentum,      // коэффициент momentum
    useNesterov    // булев флаг, использование Nesterov ускорения
);

Параметры:

  • learningRate — число, задающее базовый шаг градиента. Рекомендуется выбирать значения 0.01–0.1 для небольших моделей.
  • momentum — число в диапазоне [0,1). Значение 0.9 является стандартным для большинства задач.
  • useNesterov — опционально, булево значение. Если true, активируется ускорение Nesterov, которое предсказывает градиент в будущем положении весов.

Пример базового создания оптимизатора:

const optimizer = tf.train.momentum(0.01, 0.9);

Для активации Nesterov ускорения:

const optimizer = tf.train.momentum(0.01, 0.9, true);

Обновление весов модели

После создания оптимизатора обновление весов осуществляется через метод minimize, который принимает функцию потерь. Пример интеграции с простой нейронной сетью:

const model = tf.sequential();
model.add(tf.layers.dense({units: 10, inputShape: [5], activation: 'relu'}));
model.add(tf.layers.dense({units: 1}));

model.compile({
  optimizer: optimizer,
  loss: 'meanSquaredError'
});

const xs = tf.randomNormal([100, 5]);
const ys = tf.randomNormal([100, 1]);

await model.fit(xs, ys, {
  epochs: 50,
  batchSize: 16
});

Особенности работы:

  • Оптимизатор автоматически управляет накоплением импульса для каждого веса.
  • Внутренние состояния импульса обновляются на каждой итерации.
  • Метод minimize позволяет автоматически вычислять градиенты и применять шаг обновления.

Nesterov Accelerated Gradient (NAG)

Опция useNesterov модифицирует классический Momentum. Основная идея NAG заключается в следующем:

  1. Сначала делается прогноз на будущее положение веса с учётом текущего импульса.
  2. Градиент вычисляется в прогнозируемой точке.
  3. Вес обновляется с использованием полученного градиента.

Формально:

[ v_{t+1} = v_t + _J(- v_t)]

[ _{t+1} = t - v{t+1}]

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


Советы по использованию Momentum в TensorFlow.js

  • Для небольших моделей коэффициент momentum 0.9–0.99 обеспечивает хорошее ускорение.
  • При высокой скорости обучения рекомендуется снижать momentum, чтобы избежать резких колебаний.
  • В задачах с сильно «извилистой» функцией потерь использование useNesterov: true позволяет снизить риск «зацикливания» в локальных минимумах.
  • Momentum хорошо комбинируется с уменьшением скорости обучения (learning rate decay) для повышения стабильности обучения.

Практический пример с кастомной функцией потерь

const learningRate = 0.01;
const momentum = 0.9;
const optimizer = tf.train.momentum(learningRate, momentum);

const weights = tf.variable(tf.randomNormal([5, 1]));
const biases = tf.variable(tf.zeros([1]));

function loss() {
  const preds = tf.matMul(xs, weights).add(biases);
  return tf.losses.meanSquaredError(ys, preds);
}

for (let i = 0; i < 100; i++) {
  optimizer.minimize(loss);
}

В данном примере Momentum аккумулирует прошлые градиенты и сглаживает обновления переменных weights и biases, ускоряя сходимость даже при нестабильных данных.


Momentum в TensorFlow.js представляет собой мощный инструмент для ускорения обучения нейронных сетей, особенно при сложных функциях потерь и больших объёмах данных. Гибкость реализации через Nesterov и настройку параметров learningRate и momentum делает его универсальным выбором для большинства задач регрессии и классификации.