Synaptic — это мощная библиотека для создания и обучения нейронных сетей на JavaScript. Одной из ключевых техник обучения является стохастический градиентный спуск (SGD, Stochastic Gradient Descent). Эта техника позволяет нейронной сети адаптироваться к данным путём пошагового обновления весов на основе ошибок предсказания.
Стохастический градиентный спуск является вариантом классического градиентного спуска. Основная идея заключается в том, чтобы минимизировать функцию ошибки сети (E(W)) относительно весов (W):
[ W W - ]
где:
В отличие от обычного градиентного спуска, который вычисляет градиент на всей обучающей выборке, SGD обновляет веса после обработки каждого отдельного примера. Это обеспечивает более частые корректировки весов, ускоряет обучение на больших данных и помогает выходить из локальных минимумов.
Synaptic предоставляет класс Trainer, который управляет обучением сети. Для использования стохастического градиентного спуска необходимо указать соответствующие параметры:
const synaptic = require('synaptic');
const { Layer, Network, Trainer } = synaptic;
// Создание простой сети
const inputLayer = new Layer(2);
const hiddenLayer = new Layer(3);
const outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
const myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
// Настройка тренера с SGD
const trainer = new Trainer(myNetwork);
trainer.train([
{ input: [0,0], output: [0] },
{ input: [0,1], output: [1] },
{ input: [1,0], output: [1] },
{ input: [1,1], output: [0] }
], {
rate: 0.1, // learning rate
iterations: 20000, // количество итераций
error: 0.005, // порог ошибки
shuffle: true, // случайный порядок выборки
log: 1000, // лог каждые 1000 итераций
cost: Trainer.cost.MSE // функция потерь (Mean Squared Error)
});
Ключевые моменты:
В Synaptic можно реализовать модификацию SGD через использование
mini-batch — небольшой подвыборки данных на каждом
шаге. Хотя встроенно Trainer работает по одному примеру, мини-пакеты
можно эмулировать вручную, разбивая массив тренировочных данных на
подмножества и вызывая trainer.train() для каждой
подвыборки.
Случайность в выборе примеров и начальных весов играет ключевую роль: она обеспечивает более разнообразные пути градиента, снижает вероятность застревания в локальных экстремумах и улучшает обобщающие способности сети.
Synaptic поддерживает несколько стандартных функций ошибки:
Градиенты вычисляются автоматически внутри сети через механизм обратного распространения ошибки (backpropagation), и SGD корректирует веса на каждом примере.
Хотя классический SGD использует фиксированный rate, Synaptic позволяет имитировать адаптивные стратегии через динамическое изменение rate между итерациями. Например:
let currentRate = 0.1;
for (let i = 0; i < 10000; i++) {
trainer.trainBatch(trainingData, {
rate: currentRate,
iterations: 1,
error: 0.005,
shuffle: true
});
currentRate *= 0.999; // постепенное снижение learning rate
}
Такой подход уменьшает колебания весов на поздних этапах обучения, способствуя более точной сходимости.
SGD особенно эффективен при:
Сочетание обратного распространения ошибки и стохастического обновления весов делает Synaptic гибкой библиотекой для обучения как простых, так и глубоких сетей, обеспечивая баланс между скоростью обучения и стабильностью.