Типизация входных и выходных данных

Brain.js — это библиотека для работы с нейронными сетями в JavaScript. Одной из ключевых особенностей работы с нейронными сетями является правильная типизация входных и выходных данных, так как от этого зависит корректность обучения и точность предсказаний.

Входные данные

В Brain.js входные данные передаются в виде массивов чисел или объектов с числовыми значениями. Тип используемого формата зависит от конкретной сети.

  1. Массив чисел (Array of Numbers) Пример для обычной полносвязной сети (NeuralNetwork):
const brain = require('brain.js');
const net = new brain.NeuralNetwork();

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

net.train(trainingData);

В этом случае все элементы массива должны быть числами в диапазоне от 0 до 1. Если значения выходят за этот диапазон, сеть может работать нестабильно.

  1. Объектная форма (Object Input) Позволяет использовать именованные ключи:
const trainingData = [
  { input: { red: 1, green: 0, blue: 0 }, output: { hot: 1 } },
  { input: { red: 0, green: 1, blue: 0 }, output: { cold: 1 } }
];

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

Выходные данные

Выходные данные могут иметь бинарную или непрерывную форму, в зависимости от задачи:

  1. Бинарные выходы Используются для задач классификации с конечным числом категорий. В массивной форме это может быть [0, 1], [1, 0] и так далее. В объектной форме — { classA: 1, classB: 0 }.

    Ключевые моменты:

    • Каждое значение должно быть в диапазоне 0–1.
    • Сумма значений для категориальной классификации не обязательно равна 1, так как Brain.js не нормализует выход автоматически.
  2. Непрерывные выходы Используются для регрессионных задач, где требуется предсказать число, например, цену, температуру или процент. Пример:

const trainingData = [
  { input: [0.1, 0.2], output: [0.3] },
  { input: [0.4, 0.6], output: [1.0] }
];

Важно помнить, что сеть может плохо работать с отрицательными числами или числами, превышающими 1, если не выполнена нормализация данных.

Нормализация и масштабирование

Правильная типизация данных часто подразумевает масштабирование входов и выходов. Для этого применяются стандартные методы:

  • Минимум–максимум (Min-Max scaling): приводит все значения к диапазону [0,1].
  • Среднее и стандартное отклонение (Standardization): значения приводятся к нормальному распределению с μ=0 и σ=1.

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

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

const input = normalize(75, 0, 100); // результат: 0.75

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

Согласованность формата данных

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

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

Нарушение этих правил может привести к ошибкам во время обучения или к снижению точности сети.

Преобразование категорий в числовые значения

Для работы с категориальными данными требуется one-hot encoding. Пример:

// Категории: красный, зеленый, синий
const trainingData = [
  { input: { red: 1, green: 0, blue: 0 }, output: { red: 1, green: 0, blue: 0 } },
  { input: { red: 0, green: 1, blue: 0 }, output: { red: 0, green: 1, blue: 0 } }
];

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

Поддержка разных типов сетей

  • NeuralNetwork: работает с числами в диапазоне 0–1. Подходит для классификации и регрессии.
  • RecurrentNetwork и LSTM: требуют последовательных входных данных в виде массивов. Типизация данных аналогична, но порядок элементов критичен для обучения.

Проверка и отладка данных

Перед подачей на вход сети полезно проверять:

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

Простейший способ проверки:

trainingData.forEach(item => {
  console.log(Object.values(item.input).every(v => v >= 0 && v <= 1));
});

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

Резюме по типизации

  • Входные и выходные данные должны быть числами в диапазоне 0–1.
  • Для категориальных задач использовать one-hot encoding.
  • Все примеры должны иметь одинаковую структуру.
  • Необходима нормализация и масштабирование для стабильного обучения.
  • Проверка корректности данных перед обучением снижает риск ошибок и ускоряет отладку.

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