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

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


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

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

Пример формата для Feedforward сети:

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

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

Особенности:

  • Все входные массивы должны иметь одинаковую длину, соответствующую количеству нейронов входного слоя.
  • Значения должны быть числами. Строки и булевы значения требуют предварительной кодировки (например, через one-hot encoding).
  • Если данные категориальные, рекомендуется использовать one-hot кодирование, чтобы избежать искажений при обучении.

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

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

  • Бинарным — один нейрон с выходом 0 или 1.
  • Многоклассовым — несколько нейронов, каждый из которых отвечает за один класс.
  • Непрерывным — числа в диапазоне от 0 до 1 для регрессионных задач.

Пример для многоклассовой классификации:

const trainingData = [
  { input: [1, 0, 0], output: [1, 0, 0] }, // класс A
  { input: [0, 1, 0], output: [0, 1, 0] }, // класс B
  { input: [0, 0, 1], output: [0, 0, 1] }  // класс C
];

Особенности:

  • Для многоклассовой классификации каждый класс должен иметь отдельный нейрон на выходном слое.
  • Сумма выходных значений не обязательно должна быть равна 1, если используется стандартная сигмоидальная активация. Для вероятностных предсказаний лучше использовать softmax (в Brain.js реализуется через внешние функции или нормализацию выхода).

Нормализация данных

Нормализация — обязательный шаг перед обучением сети. Она предотвращает переобучение и ускоряет сходимость. Наиболее часто используется линейная нормализация:

[ x_{} = ]

Для бинарных задач данные уже могут быть нормализованы автоматически (0 и 1), но для числовых признаков типа температуры, возраста, цены или координат необходимо приводить значения к диапазону 0–1.

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

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

const input = [normalize(50, 0, 100), normalize(200, 0, 500)];

Последовательные данные

Для рекуррентных сетей (RNN, LSTM) формат входных данных отличается:

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

Пример для LSTM:

const trainingData = [
  { input: [[0], [1], [0]], output: [[1]] },
  { input: [[1], [0], [1]], output: [[0]] }
];
  • Первый уровень вложенности — последовательность.
  • Второй уровень — вектор признаков на каждом шаге времени.

Важные моменты при формировании данных

  1. Согласованность размеров: длина входного массива должна совпадать для всех обучающих примеров.
  2. Тип данных: только числа. Булевы и строковые значения требуют кодирования.
  3. Диапазон значений: предпочтительно нормализовать к 0–1 или -1–1.
  4. Выбор формата для задач: классификация, регрессия или последовательные данные — формат отличается.
  5. Кодирование категориальных данных: one-hot кодирование обеспечивает корректную обработку сети.

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