Библиотека Synaptic представляет собой нейросетевой фреймворк на JavaScript, позволяющий создавать, обучать и тестировать нейронные сети различной сложности. В основе лежат нейроны, слои и сети, которые можно комбинировать для построения как простых, так и сложных архитектур.
Создание сети начинается с инициализации слоев и задания количества нейронов в каждом из них:
const { Layer, Network, Trainer } = require('synaptic');
const inputLayer = new Layer(3);
const hiddenLayer = new Layer(4);
const outputLayer = new Layer(2);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
const myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
Обучение сети производится с помощью Trainer, который реализует различные алгоритмы обучения, включая backpropagation. В процессе обучения сеть подстраивает веса и смещения нейронов под данные обучающей выборки.
const trainer = new Trainer(myNetwork);
trainer.train([
{ input: [0,0,1], output: [0,1] },
{ input: [1,0,0], output: [1,0] }
], {
rate: 0.1,
iterations: 20000,
error: 0.005,
shuffle: true
});
Ключевым этапом при работе с нейронными сетями является оценка качества модели. В Synaptic нет встроенных статистических функций, поэтому необходимо самостоятельно реализовывать метрики оценки.
MSE показывает средний квадрат отклонения предсказанного значения от реального. Для сети с несколькими выходами вычисляется как среднее по всем выходам и всем примерам.
function meanSquaredError(network, testData) {
let totalError = 0;
testData.forEach(sample => {
const output = network.activate(sample.input);
output.forEach((val, i) => {
const error = sample.output[i] - val;
totalError += error * error;
});
});
return totalError / testData.length;
}
Для задач классификации используется метрика точности. Она измеряет долю правильных предсказаний относительно общего числа примеров.
function accuracy(network, testData) {
let correct = 0;
testData.forEach(sample => {
const output = network.activate(sample.input);
const predicted = output.map(v => v >= 0.5 ? 1 : 0);
if(predicted.toString() === sample.output.toString()) correct++;
});
return correct / testData.length;
}
Эта метрика подходит для задач многоклассовой классификации. Она учитывает вероятность предсказаний сети и фактические метки.
function crossEntropy(network, testData) {
let total = 0;
testData.forEach(sample => {
const output = network.activate(sample.input);
output.forEach((p, i) => {
const y = sample.output[i];
total += -y * Math.log(p + 1e-12) - (1 - y) * Math.log(1 - p + 1e-12);
});
});
return total / testData.length;
}
Переобучение (overfitting) возникает, когда сеть идеально подстраивается под тренировочные данные, но плохо обобщает на новые. Для его предотвращения данные делятся на три множества:
В Synaptic разделение выполняется вручную:
const trainData = data.slice(0, Math.floor(data.length * 0.7));
const validationData = data.slice(Math.floor(data.length * 0.7), Math.floor(data.length * 0.85));
const testData = data.slice(Math.floor(data.length * 0.85));
Для анализа поведения сети полезно строить графики изменения ошибок по эпохам и кривые точности. Даже без встроенных инструментов Synaptic, данные можно экспортировать и визуализировать средствами JavaScript, например, с помощью библиотек Chart.js или D3.js. Визуализация помогает выявлять признаки переобучения и недообучения, а также оптимизировать скорость обучения и структуру сети.
Оптимизация сети — непрерывный процесс. В Synaptic можно варьировать:
Комбинация этих параметров и тщательный анализ метрик качества позволяют создавать эффективные модели, способные справляться с реальными данными.