Градиентный спуск — это алгоритм оптимизации, который используется для минимизации функции потерь модели путем итеративного обновления параметров. В TensorFlow.js градиентный спуск реализуется через оптимизаторы, которые автоматически вычисляют градиенты и обновляют веса.
const optimizer = tf.train.sgd(0.01); // Stochastic Gradient Descent с шагом обучения 0.01
Здесь 0.01 — это learning rate
(скорость обучения), определяющая, на сколько изменяются веса на каждом
шаге. Слишком маленькая скорость замедляет обучение, слишком большая
может привести к расходимости.
В TensorFlow.js данные представлены в виде тензоров
(tf.tensor, tf.tensor2d и др.). Функция потерь
описывает, насколько модель отклоняется от целевого значения. Наиболее
часто используемые функции потерь:
meanSquaredError — среднеквадратичная ошибка,
применяется для регрессии.softmaxCrossEntropy — для многоклассовой
классификации.binaryCrossentropy — для бинарной классификации.Пример создания функции потерь:
function loss(predictions, labels) {
return predictions.sub(labels).square().mean();
}
TensorFlow.js использует автоматическое
дифференцирование, позволяя вычислять градиенты без ручного
анализа производных. Ключевой метод — tf.variable для
обучаемых параметров и tf.grad или
tf.variableGrads для вычисления градиентов.
const w = tf.variable(tf.scalar(Math.random()));
const b = tf.variable(tf.scalar(Math.random()));
const f = () => {
const y = x.mul(w).add(b);
return y.sub(yTrue).square().mean();
};
const grads = tf.variableGrads(f);
optimizer.applyGradients(grads.grads);
tf.variable хранит изменяемый параметр.tf.variableGrads(f) вычисляет градиенты всех переменных
внутри функции f.optimizer.applyGradients(grads.grads) обновляет веса
согласно выбранному алгоритму оптимизации.Градиентный спуск работает циклически:
Пример цикла обучения:
for (let i = 0; i < 1000; i++) {
optimizer.minimize(() => loss(model.predict(xTrain), yTrain));
}
Метод minimize автоматически управляет вычислением
градиентов и обновлением переменных. Можно также указать, нужно ли
сохранять промежуточные тензоры для анализа:
optimizer.minimize(() => loss(model.predict(xTrain), yTrain), /* returnCost= */ true);
TensorFlow.js предоставляет несколько оптимизаторов:
tf.train.sgd(learningRate) — стохастический градиентный
спуск.tf.train.momentum(learningRate, momentum) — добавляет
моментум для ускорения сходимости.tf.train.adam(learningRate) — адаптивный оптимизатор,
автоматически корректирующий скорость обучения.tf.train.rmsprop(learningRate) — оптимизатор с
усреднением квадратов градиентов.Выбор оптимизатора зависит от задачи и характера данных.
adam часто используется по умолчанию для большинства
нейросетевых моделей из-за устойчивой сходимости.
TensorFlow.js поддерживает вычисления как на CPU,
так и на GPU (WebGL). Для ускорения обучения следует
использовать tf.tidy() для управления памятью:
tf.tidy(() => {
optimizer.minimize(() => loss(model.predict(xTrain), yTrain));
});
tf.tidy автоматически очищает промежуточные тензоры,
предотвращая утечки памяти при долгом обучении в браузере.
Эффективность градиентного спуска во многом определяется параметрами:
Для контроля сходимости можно отслеживать функцию потерь на каждом шаге:
for (let i = 0; i < 500; i++) {
const cost = optimizer.minimize(() => loss(model.predict(xTrain), yTrain), true);
if (i % 50 === 0) {
cost.data().then(val => console.log(`Step ${i}: Loss = ${val}`));
}
}
tf.variable.tf.tidy() для контроля памяти.Если необходимо, можно расширять градиентный спуск, интегрируя регуляризацию, dropout и слои с нелинейными активациями, сохраняя общую схему: предсказание → функция потерь → градиенты → обновление параметров.