Оптимизация нейронных сетей представляет собой критически важный этап
обучения моделей. Среди множества алгоритмов градиентного спуска особое
место занимает Momentum, позволяющий ускорить
сходимость и сгладить траектории обновления весов. TensorFlow.js
предоставляет встроенную реализацию этого метода через класс
tf.train.momentum.
Momentum основывается на механизме накопления «импульса» предыдущих шагов градиента. Вместо того чтобы обновлять веса строго в направлении текущего градиента, алгоритм учитывает прошлые обновления, формируя своего рода «ускорение» в направлениях, где градиенты согласованы.
Формула обновления весов:
[ v_{t} = v_{t-1} + (1 - ) _J()]
[ _{t+1} = _t - v_t]
где:
Ключевой эффект: градиенты, которые последовательно указывают в одно направление, усиливают импульс, что ускоряет обучение на пологих участках поверхности потерь и уменьшает колебания на «рваных» участках.
В 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 позволяет автоматически вычислять
градиенты и применять шаг обновления.Опция useNesterov модифицирует классический Momentum.
Основная идея NAG заключается в следующем:
Формально:
[ v_{t+1} = v_t + _J(- v_t)]
[ _{t+1} = t - v{t+1}]
Преимущество NAG заключается в более точном корректировании направления шага, что повышает стабильность и ускоряет сходимость, особенно при сложных поверхностях потерь.
momentum 0.9–0.99
обеспечивает хорошее ускорение.momentum, чтобы избежать резких колебаний.useNesterov: true позволяет снизить риск «зацикливания» в
локальных минимумах.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 делает его
универсальным выбором для большинства задач регрессии и
классификации.