Сети с несколькими входами и несколькими выходами

Библиотека Synaptic предоставляет гибкий инструментарий для создания и обучения нейронных сетей в JavaScript. Одной из ключевых возможностей является работа с сетями, имеющими несколько входных и выходных нейронов. Такие сети позволяют моделировать сложные зависимости, где каждый вход может влиять на несколько выходов одновременно.


Структура сети

Сеть с несколькими входами и выходами состоит из трёх основных компонентов:

  1. Входной слой (Input Layer) Содержит нейроны, которые принимают данные извне. Количество нейронов в этом слое соответствует числу входных переменных задачи.

  2. Скрытые слои (Hidden Layers) Могут быть одним или несколькими. Скрытые слои обеспечивают возможность моделирования нелинейных зависимостей между входами и выходами. Каждый нейрон скрытого слоя соединён со всеми нейронами предыдущего слоя.

  3. Выходной слой (Output Layer) Количество нейронов равно числу целевых переменных, которые сеть должна предсказывать. Каждый нейрон может интерпретироваться как отдельная функция отклика на входные данные.

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

// Создание слоев
const inputLayer = new Layer(3);  // три входных нейрона
const hiddenLayer = new Layer(5); // пять нейронов в скрытом слое
const outputLayer = new Layer(2); // два выходных нейрона

// Связь слоев
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

// Создание сети
const myNetwork = new Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

Передача сигналов и активация

Каждый нейрон входного слоя получает свои значения и передаёт их дальше через связи к скрытым нейронам. Synaptic автоматически управляет передачей сигналов и суммированием взвешенных входов.

Функции активации для скрытых и выходных нейронов могут быть выбраны индивидуально, хотя стандартная функция — sigmoid.

hiddenLayer.set({ squash: synaptic.Neuron.squash.TANH });
outputLayer.set({ squash: synaptic.Neuron.squash.LOGISTIC });

Выбор функции активации влияет на диапазон значений нейронов и на эффективность обучения. Для задач с несколькими выходами рекомендуется использовать функции, которые возвращают значения в диапазоне [0, 1] или [-1, 1], в зависимости от природы данных.


Подготовка данных

Для многовходовых многовыходных сетей необходимо формировать данные в виде массивов:

  • Входные данные: массивы с количеством элементов, равным числу входных нейронов.
  • Выходные данные: массивы с количеством элементов, равным числу выходных нейронов.

Пример:

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

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

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

const trainer = new synaptic.Trainer(myNetwork);

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

Ключевые моменты обучения многовыходной сети:

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

Прогнозирование и проверка

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

const output = myNetwork.activate([1, 0, 1]);
console.log(output); // [0.98, 0.02] — два значения для двух выходных нейронов

Можно реализовать проверку точности сети, сравнивая предсказанные и ожидаемые выходы с использованием MSE или другой метрики.


Практические рекомендации

  1. Количество скрытых нейронов должно быть больше, чем число входов, но не чрезмерно, чтобы избежать переобучения.
  2. Инициализация весов в Synaptic выполняется случайным образом, поэтому повторные запуски могут давать разные результаты. Для воспроизводимости можно фиксировать генератор случайных чисел.
  3. Нормализация входных и выходных данных повышает эффективность обучения, особенно при больших диапазонах значений.
  4. Выбор функции активации зависит от характера данных: для категориальных выходов используется логистическая функция, для числовых — TANH или линейная активация.

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