Synaptic — это легковесная библиотека для создания и обучения
нейронных сетей на JavaScript. Основной архитектурной единицей являются
нейроны (Neuron), слои
(Layer) и сети (Network).
Каждый нейрон имеет входные и выходные соединения с весами, которые
корректируются в процессе обучения. Библиотека поддерживает различные
типы сетей, включая персептроны, многослойные
сети с обратным распространением ошибки и рекуррентные
сети.
Ключевые моменты:
Neuron — минимальный элемент, выполняющий функцию
активации и передачи сигнала.Layer — совокупность нейронов, упрощает организацию
сети и позволяет подключать целые слои к другим слоям.Network — комбинация слоев, способная обучаться и
прогнозировать значения.Сеть строится с использованием объектов Layer и
Network. Простейший пример — многослойный персептрон:
const synaptic = require('synaptic');
const { Layer, Network } = synaptic;
let inputLayer = new Layer(2);
let hiddenLayer = new Layer(3);
let outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
let myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
Особенности:
project создаёт соединения между слоями с случайными
начальными весами.Synaptic поддерживает обратное распространение ошибки
(Backpropagation) для обучения. Метод train
позволяет передавать массив обучающих примеров:
myNetwork.train([
{ input: [0,0], output: [0] },
{ input: [0,1], output: [1] },
{ input: [1,0], output: [1] },
{ input: [1,1], output: [0] }
], {
rate: 0.3,
iterations: 20000,
error: 0.005,
shuffle: true,
log: 1000
});
Ключевые параметры метода train:
rate — скорость обучения, определяет величину
корректировки весов.iterations — количество циклов обучения.error — порог ошибки, при достижении которого обучение
останавливается.shuffle — случайное перемешивание примеров для
повышения качества обучения.log — частота вывода информации о процессе
обучения.Каждый нейрон использует активационную функцию для трансформации входного сигнала. В Synaptic доступны следующие функции:
LOGISTIC — сигмоидальная функция, ограничивает значения
от 0 до 1.TANH — гиперболический тангенс, значения от -1 до
1.IDENTITY — линейная функция, полезна для
регрессии.STEP — пороговая функция, возвращает 0 или 1.let neuron = new synaptic.Neuron();
neuron.squash = synaptic.Neuron.squash.TANH;
Соединения между нейронами имеют веса, которые корректируются во
время обучения. Каждое соединение можно получить через метод
project или напрямую управлять через
connections.
Пример доступа к весам:
let connections = inputLayer.project(hiddenLayer).connectedTo;
connections.forEach(conn => {
conn.weight = Math.random() * 0.2 - 0.1;
});
Особенности работы с весами:
Node.js позволяет работать с потоками данных через встроенные
streams (Readable, Writable,
Transform). Synaptic можно интегрировать с потоками для
обработки больших наборов данных без загрузки их целиком в память.
Пример интеграции с потоками:
const fs = require('fs');
const readline = require('readline');
const rl = readline.createInterface({
input: fs.createReadStream('data.csv'),
output: process.stdout,
terminal: false
});
rl.on('line', (line) => {
const [x1, x2, y] = line.split(',').map(Number);
myNetwork.activate([x1, x2]);
myNetwork.propagate(0.3, [y]);
});
Преимущества такого подхода:
toJSON и fromJSON, что облегчает интеграцию с
потоками данных на разных этапах обработки.let exported = myNetwork.toJSON();
let restoredNetwork = Network.fromJSON(exported);
Потоковое использование JSON: