Решение задачи XOR

Задача XOR является классическим примером проблемы, которую линейная модель решить не может. Выход функции XOR равен 1, если входы различны, и 0, если входы одинаковы. Для её решения требуется многослойная нейронная сеть с хотя бы одним скрытым слоем, обладающая способностью к нелинейной аппроксимации.

В библиотеке Synaptic нейронные сети строятся из компонентов:

  • Neuron — отдельный нейрон.
  • Layer — слой нейронов.
  • Network — сеть, состоящая из слоёв.
  • Trainer — объект для обучения сети.

Для задачи XOR оптимально использовать следующую архитектуру:

  • Входной слой: 2 нейрона (соответствует двум бинарным входам функции XOR).
  • Скрытый слой: 2–3 нейрона с сигмоидной активацией.
  • Выходной слой: 1 нейрон с сигмоидной активацией.

Создание сети в Synaptic

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;

Советы по улучшению обучения

  • Изменение количества нейронов в скрытом слое: 2–3 нейрона обычно достаточно, но иногда увеличение числа нейронов ускоряет сходимость.
  • Регулировка скорости обучения (rate): слишком высокая скорость может вызвать нестабильность, слишком низкая — медленное обучение.
  • Инициализация весов: Synaptic случайно инициализирует веса, повторное обучение может дать разные результаты. Для стабильности можно сохранять обученную сеть через toJSON() и загружать через Network.fromJSON().

Использование JSON для сохранения сети

const networkJSON = xorNetwork.toJSON();
// Сохранение в файл или базу данных

const restoredNetwork = Network.fromJSON(networkJSON);
console.log(restoredNetwork.activate([0, 1])); // ≈ 1

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

Особенности Synaptic для XOR

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

Библиотека Synaptic делает задачу решения XOR наглядной и простой для экспериментов, одновременно демонстрируя фундаментальные принципы многослойных нейронных сетей.