Оптимизация формата данных

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


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

Нейронные сети требуют, чтобы входные значения находились в определённом диапазоне. В Brain.js чаще всего используются значения от 0 до 1. Неправильный масштаб данных может привести к медленной сходимости или невозможности обучения.

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

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

const data = [
  { input: [normalize(20, 0, 100)], output: [1] },
  { input: [normalize(50, 0, 100)], output: [0] }
];

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

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

Кодирование категориальных данных

Brain.js работает с числовыми массивами, поэтому категориальные значения необходимо преобразовывать. Наиболее распространённый метод — one-hot encoding.

Пример:

const colors = { red: [1, 0, 0], green: [0, 1, 0], blue: [0, 0, 1] };

const data = [
  { input: colors.red, output: [1] },
  { input: colors.green, output: [0] }
];

Рекомендации:

  • Для большого количества категорий можно использовать сокращённые методы кодирования, например Label Encoding, но это может ухудшить точность.
  • Категориальные данные не следует оставлять в виде чисел без кодирования, иначе нейросеть может интерпретировать их как непрерывные значения.

Балансировка набора данных

Неравномерное распределение классов снижает точность модели и увеличивает риск смещения. Brain.js чувствителен к дисбалансу, так как использует обратное распространение ошибки.

Методы балансировки:

  • Увеличение выборки меньших классов (oversampling).
  • Снижение числа примеров доминирующего класса (undersampling).
  • Генерация синтетических данных с помощью простых алгоритмов (например, небольшие шумы для вариаций входа).

Формат JSON для обучения

Brain.js требует массив объектов с полями input и output. Оптимизация формата JSON повышает скорость обучения и снижает использование памяти.

Пример компактного формата:

const trainingData = [
  { input: [0.1, 0.2, 0.3], output: [1, 0] },
  { input: [0.5, 0.6, 0.7], output: [0, 1] }
];

Советы:

  • Размер массива должен быть достаточным для выявления закономерностей.
  • Для больших наборов данных полезно использовать потоковую подачу данных (batch training) через net.trainStream.
  • Минимизировать вложенность объектов и массивов.

Выбор разрядности и округление данных

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

const roundedValue = Math.round(value * 1000) / 1000;

Преимущества:

  • Снижение объёма памяти.
  • Ускорение операций умножения и сложения в сети.
  • Снижение чувствительности к шуму в данных.

Использование бинарных входов

Для задач классификации с небольшим числом признаков эффективны бинарные входы (0 или 1). Они особенно полезны при работе с логическими состояниями или простыми категориями.

Пример:

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

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

  • Бинарные данные позволяют сети быстрее сходиться.
  • Требует корректной подготовки исходных признаков в бинарный формат.

Batch-подача данных

Для больших наборов данных обучение по одному примеру может быть неэффективным. Brain.js поддерживает batch training, когда данные подаются блоками.

const net = new brain.NeuralNetwork();
net.train(trainingData, { iterations: 2000, batchSize: 32 });

Важные моменты:

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

Поддержка потоковой тренировки

Для динамических данных или очень больших наборов используется trainStream:

const stream = new brain.Stream({
  neuralNetwork: net,
  floodCallback: () => console.log('Training complete')
});

stream.write({ input: [0.1, 0.2], output: [1] });
stream.end();

Преимущества:

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

Заключение по форматированию данных

  • Все входные значения должны быть числовыми и нормализованными.
  • Категориальные данные следует кодировать через one-hot или label encoding.
  • Балансировка классов повышает точность модели.
  • Использование округления и бинарных данных ускоряет обучение.
  • Batch-подача и потоковая тренировка позволяют работать с большими массивами эффективно.

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