Synaptic — это чисто JavaScript-библиотека для построения и обучения
нейронных сетей, предоставляющая удобные средства для работы с сетями
любой архитектуры. Она поддерживает создание перцептронов,
многоуровневых сетей и сетей с обратной связью. Центральным понятием
является объект Network, который объединяет слои нейронов и
управляет их соединениями.
В Synaptic сети строятся из нейронов
(Neuron), которые объединяются в слои
(Layer), а слои соединяются с помощью
соединений (connect). Каждый нейрон хранит
значения активации, веса и смещения, что позволяет гибко управлять
процессом обучения.
const { Layer, Network } = require('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
});
Для задачи классификации точек на плоскости потребуется входной слой из двух нейронов (координаты X и Y), один или несколько скрытых слоев и выходной слой, который определяет класс точки. Например, для бинарной классификации достаточно одного выходного нейрона с сигмоидной активацией.
const inputLayer = new Layer(2);
const hiddenLayer1 = new Layer(5);
const hiddenLayer2 = new Layer(4);
const outputLayer = new Layer(1);
inputLayer.project(hiddenLayer1);
hiddenLayer1.project(hiddenLayer2);
hiddenLayer2.project(outputLayer);
const classifier = new Network({
input: inputLayer,
hidden: [hiddenLayer1, hiddenLayer2],
output: outputLayer
});
Данные представляются массивами входов и соответствующих им выходов. Для точек на плоскости это могут быть координаты X и Y и метка класса (0 или 1).
const trainingSet = [
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }
];
Важно масштабировать данные, если координаты имеют большой диапазон, чтобы сигмоидная функция активации работала эффективно.
Synaptic поддерживает метод обратного распространения
ошибки через объект Trainer. Параметры обучения
включают:
const { Trainer } = require('synaptic');
const trainer = new Trainer(classifier);
trainer.train(trainingSet, {
rate: 0.1,
iterations: 20000,
error: 0.005,
shuffle: true,
log: 1000,
cost: Trainer.cost.MSE
});
После обучения сеть можно тестировать на новых точках:
const testPoints = [
[0.1, 0.2],
[0.9, 0.8],
[0.5, 0.5]
];
testPoints.forEach(point => {
const output = classifier.activate(point);
console.log(`Point ${point} classified as ${output[0]}`);
});
Для визуализации часто используют цветовую карту на плоскости, где каждый пиксель окрашен согласно предсказанному значению сети.
tanh или ReLU.Для нелинейных границ классической двухслойной сети может быть недостаточно. Добавление второго скрытого слоя или увеличение числа нейронов в первом скрытом слое позволяет сети моделировать сложные формы разделяющих границ, такие как круги, эллипсы или зигзагообразные разделы на плоскости.
// Пример расширенной архитектуры
const hiddenLayer1 = new Layer(8);
const hiddenLayer2 = new Layer(6);
const hiddenLayer3 = new Layer(4);
Synaptic позволяет настраивать пакетную обработку (batch training) и адаптивную скорость обучения через внешние циклы, чтобы уменьшить число итераций и стабилизировать обучение при сложных функциях распределения классов.
for (let i = 0; i < 10000; i++) {
trainingSet.forEach(sample => classifier.activate(sample.input));
trainingSet.forEach(sample => classifier.propagate(0.1, sample.output));
}
Это дает полный контроль над процессом обучения и позволяет экспериментировать с различными стратегиями.