Формат обучающей выборки

Библиотека Synaptic предоставляет удобные средства для создания и обучения нейронных сетей на языке JavaScript. Ключевым элементом успешного обучения является корректное представление обучающих данных. Неправильная структура или масштабирование выборки часто приводит к плохой сходимости или неправильным результатам.

Структура обучающих данных

В Synaptic обучающая выборка представляет собой массив объектов, где каждый объект содержит два обязательных свойства:

  • input — массив чисел, представляющий входные данные нейронной сети.
  • output — массив чисел, представляющий ожидаемый результат работы сети для этих входных данных.

Пример структуры:

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

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

Масштабирование и нормализация данных

Для корректного обучения нейронной сети все входные и выходные данные должны быть числовыми и нормализованными. Наиболее распространённые диапазоны:

  • Входы: [0, 1] или [-1, 1]
  • Выходы: [0, 1] для задач классификации или [0, 1]/[-1, 1] для регрессии

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

Пример нормализации:

function normalize(value, min, max) {
    return (value - min) / (max - min);
}

let trainingSet = [
    { input: [normalize(10, 0, 100), normalize(50, 0, 100)], output: [0.5] }
];

Вариативность и объём выборки

Для успешного обучения требуется достаточный объём и разнообразие обучающих примеров. Если набор данных слишком мал, сеть просто запомнит входы без способности к обобщению. В Synaptic рекомендуется:

  • Минимум десятки примеров для простой сети.
  • Сотни и тысячи примеров для сложных задач с большим числом входных переменных.
  • Включение примеров, покрывающих весь диапазон возможных входов, чтобы избежать переобучения на частных случаях.

Формат выходных данных

Выходные данные сети могут быть как скалярными, так и многомерными массивами. Для задач классификации, где требуется определить один класс из нескольких, используется one-hot encoding:

let trainingSet = [
    { input: [0, 1], output: [1, 0, 0] }, // класс 0
    { input: [1, 0], output: [0, 1, 0] }, // класс 1
    { input: [1, 1], output: [0, 0, 1] }  // класс 2
];

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

Генерация выборки программно

Иногда удобно создавать обучающий набор автоматически. Пример для задачи XOR:

function generateXORSet() {
    return [
        { input: [0, 0], output: [0] },
        { input: [0, 1], output: [1] },
        { input: [1, 0], output: [1] },
        { input: [1, 1], output: [0] }
    ];
}

let trainingSet = generateXORSet();

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

Использование объектов как обучающих данных

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

function objectToArray(obj, keys) {
    return keys.map(key => obj[key]);
}

let data = { x: 5, y: 10 };
let inputArray = objectToArray(data, ['x', 'y']); // [5, 10]

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

Взаимосвязь формата с функцией обучения

Метод Trainer.train() ожидает именно массив объектов {input, output}. Любое отклонение от этого формата приведёт к ошибкам или некорректному обучению. Параметры обучения, такие как rate (скорость обучения), iterations и error, работают напрямую с этим форматом, поэтому важно заранее подготовить данные правильно.


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