Градиентный спуск является фундаментальным методом оптимизации в машинном обучении, используемым для минимизации функции потерь нейронных сетей. В TensorFlow.js доступно несколько вариантов градиентного спуска, включая полный, стохастический и мини-батчевый, каждый из которых имеет свои особенности и области применения.
Градиентный спуск основан на вычислении производной функции потерь (L()) по параметрам модели () и обновлении этих параметров в направлении, противоположном градиенту:
[ - _L()]
где () — скорость обучения (learning rate).
TensorFlow.js предоставляет удобный интерфейс для всех видов градиентного спуска через класс tf.train.Optimizer. Наиболее часто используемые оптимизаторы:
tf.train.sgd(learningRate) — стандартный градиентный
спуск с возможностью задания скорости обучения.tf.train.momentum(learningRate, momentum) — ускоренный
метод с моментумом для сглаживания колебаний.tf.train.adam(learningRate) — адаптивная версия
градиентного спуска, объединяющая преимущества моментума и RMSProp.Пример создания стохастического градиентного спуска:
const optimizer = tf.train.sgd(0.01);
Стохастический подход обновляет веса после каждого примера:
for (let i = 0; i < data.length; i++) {
optimizer.minimize(() => {
const x = tf.tensor([data[i].input]);
const y = tf.tensor([data[i].output]);
const preds = model.predict(x);
return tf.losses.meanSquaredError(y, preds);
});
}
Преимущества:
Недостатки:
Мини-батчевый подход использует подвыборки данных фиксированного
размера. Он обеспечивает баланс между скоростью и стабильностью. В
TensorFlow.js батчи можно формировать с помощью tf.data API
или вручную:
const batchSize = 32;
for (let i = 0; i < data.length; i += batchSize) {
const batch = data.slice(i, i + batchSize);
optimizer.minimize(() => {
const xs = tf.tensor(batch.map(d => d.input));
const ys = tf.tensor(batch.map(d => d.output));
const preds = model.predict(xs);
return tf.losses.meanSquaredError(ys, preds);
});
}
Особенности:
Скорость обучения () критически важна. В TensorFlow.js можно использовать:
tf.train.sgd(0.01)tf.train.adam
автоматически подстраивает шаги для каждого параметра, что полезно при
сложных сетевых архитектурах.TensorFlow.js позволяет отслеживать динамику функции потерь с помощью:
const history = [];
for (let epoch = 0; epoch < numEpochs; epoch++) {
const loss = optimizer.minimize(() => tf.losses.meanSquaredError(ys, model.predict(xs)), true);
history.push(loss.dataSync()[0]);
}
Графики изменения loss помогают определить, слишком ли велика скорость обучения или нужен другой размер батча.
Эффективное использование стохастического и мини-батчевого градиентного спуска в TensorFlow.js позволяет ускорять обучение, повышать стабильность модели и экономить вычислительные ресурсы, обеспечивая гибкость при работе с различными размерами данных.