Первая нейронная сеть за пять минут

Библиотека Synaptic представляет собой чистую JavaScript-реализацию нейронных сетей, позволяющую создавать, обучать и тестировать различные архитектуры без необходимости сторонних зависимостей. Для работы с ней можно использовать Node.js или подключать библиотеку напрямую в браузере через

После подключения доступны основные классы: Neuron, Layer, Network, Trainer.


Создание базовой нейронной сети

В Synaptic сеть строится из слоёв нейронов. Классический подход — трехслойная архитектура: входной слой, скрытый слой и выходной слой.

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
});

Ключевой момент: слои соединяются методом .project(), который формирует все связи между нейронами исходного слоя и целевого.


Прямое распространение сигнала

Для вычисления выхода сети используется метод activate. Входные данные передаются в виде массива чисел:

const output = myNetwork.activate([0, 1]);
console.log(output);

Каждое число массива соответствует отдельному нейрону входного слоя. После активации сигналы проходят через все слои сети, преобразуясь функциями активации, и возвращается массив выходных значений.


Обучение сети

Обучение в Synaptic может быть двух видов: ручное обновление весов или использование встроенного класса Trainer, который реализует популярный метод обратного распространения ошибки (backpropagation).

Ручное обновление весов

Метод propagate используется после активации сети:

myNetwork.activate([0, 1]);
myNetwork.propagate(0.3, [1]);  // 0.3 — скорость обучения, [1] — целевой результат

Важно: метод propagate корректирует веса сети, минимизируя разницу между ожидаемым и фактическим выходом.

Использование Trainer

Trainer позволяет автоматизировать процесс обучения на массиве данных:

const { Trainer } = require('synaptic');

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,
    iterations: 20000,
    error: 0.005,
    shuffle: true,
    log: 1000
});

Параметры обучения:

  • rate — скорость обучения;
  • iterations — количество итераций;
  • error — порог ошибки для остановки обучения;
  • shuffle — перемешивание тренировочных данных;
  • log — частота вывода статистики.

Пример полной реализации логической функции XOR

const { Layer, Network, Trainer } = require('synaptic');

// Архитектура сети
const inputLayer = new Layer(2);
const hiddenLayer = new Layer(3);
const outputLayer = new Layer(1);

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

const xorNetwork = new Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

// Данные для обучения
const trainingSet = [
    { input: [0,0], output: [0] },
    { input: [0,1], output: [1] },
    { input: [1,0], output: [1] },
    { input: [1,1], output: [0] }
];

const trainer = new Trainer(xorNetwork);
trainer.train(trainingSet, {
    rate: 0.2,
    iterations: 5000,
    error: 0.005,
    shuffle: true
});

// Проверка результатов
console.log(xorNetwork.activate([0, 0])); // ~0
console.log(xorNetwork.activate([0, 1])); // ~1
console.log(xorNetwork.activate([1, 0])); // ~1
console.log(xorNetwork.activate([1, 1])); // ~0

Особенности:

  • Скрытый слой из 3 нейронов достаточно для решения задачи XOR;
  • После нескольких тысяч итераций сеть приближается к идеальному поведению;
  • С помощью Trainer можно автоматически контролировать скорость сходимости и порог ошибки.

Настройка функций активации и других параметров

По умолчанию нейроны используют сигмоидальную функцию активации. Synaptic поддерживает также tanh и linear, которые задаются при создании нейрона или слоя:

const { Neuron } = require('synaptic');

const neuron = new Neuron();
neuron.squash = Neuron.squash.TANH;

С помощью настройки функций активации и количества нейронов можно экспериментировать с архитектурой сети для оптимизации обучения и точности.


Генерация, сохранение и загрузка сети

Сеть можно экспортировать в JSON для последующего использования:

const json = xorNetwork.toJSON();
const restoredNetwork = Network.fromJSON(json);

Это позволяет сохранять обученные модели и загружать их без необходимости повторного обучения.