Классификация точек на плоскости

Synaptic — это чисто JavaScript-библиотека для построения и обучения нейронных сетей, предоставляющая удобные средства для работы с сетями любой архитектуры. Она поддерживает создание перцептронов, многоуровневых сетей и сетей с обратной связью. Центральным понятием является объект Network, который объединяет слои нейронов и управляет их соединениями.

В Synaptic сети строятся из нейронов (Neuron), которые объединяются в слои (Layer), а слои соединяются с помощью соединений (connect). Каждый нейрон хранит значения активации, веса и смещения, что позволяет гибко управлять процессом обучения.

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

Создание сети для классификации точек на плоскости

Для задачи классификации точек на плоскости потребуется входной слой из двух нейронов (координаты X и Y), один или несколько скрытых слоев и выходной слой, который определяет класс точки. Например, для бинарной классификации достаточно одного выходного нейрона с сигмоидной активацией.

Настройка слоев и структуры сети

  • Входной слой: количество нейронов соответствует размерности признаков (в нашем случае 2).
  • Скрытые слои: могут содержать от 3 до 10 нейронов, в зависимости от сложности задачи.
  • Выходной слой: один нейрон для бинарной классификации, несколько для многоклассовой.
const inputLayer = new Layer(2);
const hiddenLayer1 = new Layer(5);
const hiddenLayer2 = new Layer(4);
const outputLayer = new Layer(1);

inputLayer.project(hiddenLayer1);
hiddenLayer1.project(hiddenLayer2);
hiddenLayer2.project(outputLayer);

const classifier = new Network({
    input: inputLayer,
    hidden: [hiddenLayer1, hiddenLayer2],
    output: outputLayer
});

Подготовка данных для обучения

Данные представляются массивами входов и соответствующих им выходов. Для точек на плоскости это могут быть координаты X и Y и метка класса (0 или 1).

const trainingSet = [
    { input: [0, 0], output: [0] },
    { input: [0, 1], output: [1] },
    { input: [1, 0], output: [1] },
    { input: [1, 1], output: [0] }
];

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

Алгоритмы обучения

Synaptic поддерживает метод обратного распространения ошибки через объект Trainer. Параметры обучения включают:

  • rate — скорость обучения
  • iterations — количество итераций
  • error — порог ошибки для завершения обучения
  • shuffle — перемешивание примеров на каждой итерации
const { Trainer } = require('synaptic');

const trainer = new Trainer(classifier);

trainer.train(trainingSet, {
    rate: 0.1,
    iterations: 20000,
    error: 0.005,
    shuffle: true,
    log: 1000,
    cost: Trainer.cost.MSE
});

Проверка и визуализация результатов

После обучения сеть можно тестировать на новых точках:

const testPoints = [
    [0.1, 0.2],
    [0.9, 0.8],
    [0.5, 0.5]
];

testPoints.forEach(point => {
    const output = classifier.activate(point);
    console.log(`Point ${point} classified as ${output[0]}`);
});

Для визуализации часто используют цветовую карту на плоскости, где каждый пиксель окрашен согласно предсказанному значению сети.

Особенности и тонкости настройки

  • Количество скрытых слоев и нейронов: больше слоев и нейронов увеличивает способность сети к аппроксимации сложных границ, но требует больше времени на обучение и повышает риск переобучения.
  • Скорость обучения: слишком высокая скорость может привести к неустойчивому обучению, слишком низкая — к медленному сходимости.
  • Функции активации: сигмоидная функция подходит для бинарной классификации, но для сложных задач часто используют tanh или ReLU.
  • Шум и нормализация данных: входные данные с большим разбросом значений снижают эффективность обучения, поэтому их следует нормализовать или стандартизовать.

Применение к сложным границам

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

// Пример расширенной архитектуры
const hiddenLayer1 = new Layer(8);
const hiddenLayer2 = new Layer(6);
const hiddenLayer3 = new Layer(4);

Настройка обратного распространения для ускорения обучения

Synaptic позволяет настраивать пакетную обработку (batch training) и адаптивную скорость обучения через внешние циклы, чтобы уменьшить число итераций и стабилизировать обучение при сложных функциях распределения классов.

for (let i = 0; i < 10000; i++) {
    trainingSet.forEach(sample => classifier.activate(sample.input));
    trainingSet.forEach(sample => classifier.propagate(0.1, sample.output));
}

Это дает полный контроль над процессом обучения и позволяет экспериментировать с различными стратегиями.