Задача XOR является классическим примером проблемы, которую линейная
модель решить не может. Выход функции XOR равен 1, если
входы различны, и 0, если входы одинаковы. Для её решения
требуется многослойная нейронная сеть с хотя бы одним
скрытым слоем, обладающая способностью к нелинейной
аппроксимации.
В библиотеке Synaptic нейронные сети строятся из компонентов:
Для задачи XOR оптимально использовать следующую архитектуру:
const synaptic = require('synaptic');
const { Layer, Network, Trainer } = synaptic;
// Входной слой из 2 нейронов
const inputLayer = new Layer(2);
// Скрытый слой из 3 нейронов
const hiddenLayer = new Layer(3);
// Выходной слой из 1 нейрона
const outputLayer = new Layer(1);
// Связываем слои
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
// Создаем сеть
const xorNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
Ключевой момент: для корректного обучения важно,
чтобы слои были правильно связаны. project создает
полносвязное соединение между всеми нейронами двух слоев.
Для функции XOR возможны четыре комбинации входов:
const trainingSet = [
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }
];
Каждый элемент представляет собой объект с массивом
input и массивом output. Формат данных строго
соответствует требованиям Trainer.
Synaptic использует метод обратного распространения
ошибки через объект Trainer. Процесс обучения
включает несколько параметров:
rate — скорость обучения.iterations — количество итераций.error — целевая допустимая ошибка.const trainer = new Trainer(xorNetwork);
trainer.train(trainingSet, {
rate: 0.3,
iterations: 20000,
error: 0.005,
shuffle: true,
log: 1000
});
Объяснение параметров:
rate 0.3 означает умеренно быстрый шаг градиентного
спуска.iterations 20000 — необходимое количество циклов для
сходимости сети на XOR.error 0.005 задает порог ошибки, ниже которого обучение
считается завершенным.shuffle: true перемешивает данные, что улучшает
обобщающую способность сети.log: 1000 выводит промежуточные значения ошибки каждые
1000 итераций.После обучения сеть способна выдавать значения, близкие к идеальным:
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
Сеть возвращает числа от 0 до 1. Для бинарного вывода достаточно
применить пороговое значение 0.5:
const output = xorNetwork.activate([1, 0]) > 0.5 ? 1 : 0;
rate):
слишком высокая скорость может вызвать нестабильность, слишком низкая —
медленное обучение.toJSON() и загружать через
Network.fromJSON().const networkJSON = xorNetwork.toJSON();
// Сохранение в файл или базу данных
const restoredNetwork = Network.fromJSON(networkJSON);
console.log(restoredNetwork.activate([0, 1])); // ≈ 1
Это позволяет повторно использовать сеть без необходимости повторного обучения.
Библиотека Synaptic делает задачу решения XOR наглядной и простой для экспериментов, одновременно демонстрируя фундаментальные принципы многослойных нейронных сетей.