Synaptic — это гибкая и полностью настраиваемая библиотека для создания и обучения нейронных сетей на JavaScript. Она поддерживает работу как в Node.js, так и в браузере, предоставляя удобный интерфейс для построения моделей с любым числом слоев и архитектур. Основная идея библиотеки заключается в абстракции нейронов и связей между ними, что позволяет создавать сложные сети без необходимости погружаться в низкоуровневые детали.
Базовые элементы библиотеки:
Для создания сети используется следующий подход:
const synaptic = require('synaptic');
const { Layer, Network } = 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
});
Ключевой момент — возможность полного контроля над соединениями между слоями. Synaptic не накладывает строгих ограничений на топологию сети: можно создавать рекуррентные связи, объединять несколько скрытых слоев или настраивать различные функции активации.
Обучение в Synaptic производится через объект Trainer,
который предоставляет методы для итеративного обучения
и пакетного обучения:
const trainer = new synaptic.Trainer(myNetwork);
const trainingSet = [
{ input: [0, 0, 1], output: [0, 1] },
{ input: [1, 1, 0], output: [1, 0] },
// ...
];
trainer.train(trainingSet, {
rate: 0.1, // скорость обучения
iterations: 20000, // количество итераций
error: 0.005, // порог ошибки
shuffle: true,
log: 1000
});
Особенности:
Synaptic поддерживает Feedforward (прямое распространение), LSTM, Hopfield и Liquid State Machine. Это позволяет использовать библиотеку как для простых задач классификации, так и для работы с временными рядами и последовательными данными.
Для рекуррентных сетей пример создания LSTM выглядит следующим образом:
const { Layer, Network } = synaptic;
const inputLayer = new Layer(2);
const lstmLayer = new Layer.LSTM(4, 4);
const outputLayer = new Layer(1);
inputLayer.project(lstmLayer);
lstmLayer.project(outputLayer);
const lstmNetwork = new Network({
input: inputLayer,
hidden: [lstmLayer],
output: outputLayer
});
Synaptic не предоставляет встроенной системы нормализации данных, поэтому важным шагом является подготовка входных и выходных данных. Чаще всего используется масштабирование в диапазон [0,1] или стандартизация с помощью z-score.
Пример подготовки данных:
function normalize(array) {
const max = Math.max(...array);
const min = Math.min(...array);
return array.map(x => (x - min) / (max - min));
}
const input = normalize([10, 20, 30]);
После завершения обучения сеть может использоваться для предсказаний:
const result = myNetwork.activate([0, 1, 0]);
console.log(result);
Важно помнить, что activate возвращает массив выходов, соответствующих последнему слою сети, и его значения зависят от функции активации, установленной в слоях.
toJSON и восстанавливать через
Network.fromJSON.const json = myNetwork.toJSON();
const restoredNetwork = Network.fromJSON(json);
Такой подход позволяет переносить модели между средами и сохранять результаты обучения.
Synaptic предоставляет возможность создавать пользовательские функции активации и обратного распространения ошибки, что делает её пригодной для исследований и экспериментов с новыми архитектурами. Например:
Neuron.squash.LOGISTIC = function(x) {
return 1 / (1 + Math.exp(-x));
};
Это позволяет использовать собственные функции вместо стандартных
LOGISTIC, TANH или IDENTITY, что
особенно полезно при работе с нестандартными задачами.