Библиотека Brain.js предоставляет высокоуровневый интерфейс для работы с нейронными сетями на JavaScript. Одним из ключевых аспектов обучения сетей является оптимизация весов с помощью алгоритма градиентного спуска. В Brain.js поддерживаются различные варианты градиентного спуска, среди которых выделяются стохастический градиентный спуск (SGD) и мини-батчевый градиентный спуск (mini-batch gradient descent). Эти методы позволяют эффективно обучать сети на больших наборах данных, балансируя между скоростью обучения и стабильностью сходимости.
Градиентный спуск — это итеративный метод оптимизации, цель которого минимизировать функцию потерь (L()), изменяя параметры сети () в направлении отрицательного градиента:
[ _{t+1} = _t - L(_t)]
где:
В контексте нейронных сетей (L()) обычно вычисляется как средняя ошибка между предсказанными и фактическими значениями на обучающем наборе данных.
В SGD обновление весов происходит после каждого примера обучающего набора, что делает процесс более шумным, но позволяет быстрее проходить через данные. Формула обновления весов выглядит так:
[ _{t+1} = _t - L_i(_t)]
где (L_i(_t)) — функция потерь для одного примера (i).
Особенности SGD в Brain.js:
Пример настройки SGD в Brain.js:
const brain = require('brain.js');
const net = new brain.NeuralNetwork({
learningRate: 0.01,
// Использование стохастического обновления
});
net.train(trainingData, {
iterations: 20000,
errorThresh: 0.005,
log: true,
logPeriod: 100
});
В данном примере обновление происходит по одному примеру за раз, что делает обучение стохастическим.
Мини-батчевый градиентный спуск является компромиссом между пакетным градиентным спуском (batch gradient descent) и стохастическим. Вместо обработки всей выборки или одного примера, вычисление градиента производится на небольших подвыборках (мини-батчах). Формула обновления весов:
[ _{t+1} = t - {i=1}^{m} L_i(_t)]
где (m) — размер мини-батча.
Преимущества мини-батчей:
Пример настройки мини-батчевого градиентного спуска в Brain.js:
const brain = require('brain.js');
const net = new brain.NeuralNetwork({
learningRate: 0.01,
// Размер мини-батча
batchSize: 32
});
net.train(trainingData, {
iterations: 10000,
errorThresh: 0.005,
log: true,
logPeriod: 50
});
Здесь batchSize определяет количество примеров, на
которых вычисляется градиент перед обновлением весов.
Ключевые параметры для управления SGD и мини-батчевым градиентным спуском в Brain.js:
Правильный подбор этих параметров позволяет добиться баланса между скоростью сходимости и точностью сети.
Мини-батчевый подход также упрощает интеграцию с веб-приложениями, поскольку позволяет обрабатывать данные порциями и избегать перегрузки памяти.