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

Нормализация — критически важный этап подготовки данных при работе с нейронными сетями в Brain.js. Она заключается в приведении исходных числовых значений к диапазону, удобному для обработки сетью, чаще всего в интервал [0, 1] или [-1, 1]. Без нормализации обучение может проходить медленно или вовсе не приводить к корректным результатам из-за слишком больших или слишком малых чисел.

Зачем нужна нормализация

Нейронные сети обучаются с использованием градиентного спуска. Если значения входных данных сильно различаются по масштабу, градиенты могут либо исчезать, либо взрываться. Например, если одна переменная варьируется от 0 до 1, а другая — от 0 до 1000, то вес, связанный с большой переменной, будет доминировать, что приведет к неустойчивому обучению. Нормализация решает эту проблему.

Основные методы нормализации

  1. Мин–Макс нормализация Преобразует значения в заданный диапазон [0, 1] или [-1, 1] по формуле:

    x_norm = (x - min) / (max - min)

    Для диапазона [-1, 1] используется преобразование:

    x_norm = 2 * (x - min) / (max - min) - 1

    Этот метод прост и широко применяется в Brain.js, особенно при работе с полносвязными сетями.

  2. Нормализация Z-оценкой (Standardization) Преобразует данные так, чтобы они имели среднее значение 0 и стандартное отклонение 1:

    x_norm = (x - mean) / std

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

  3. Бинаризация данных Если входные данные являются категориальными или представляют собой дискретные значения, их можно преобразовать в бинарные векторы (one-hot encoding) или простые числа от 0 до 1. Brain.js корректно работает с такими входами, но важно сохранять согласованность между обучающими и тестовыми данными.

Практическая реализация в Brain.js

Для нормализации данных в Brain.js используется подготовка массива объектов, где входные данные (input) и выходные (output) уже нормализованы:

const trainingData = [
  { input: { x: 0.1, y: 0.5 }, output: { result: 0 } },
  { input: { x: 0.7, y: 0.2 }, output: { result: 1 } },
];

Если исходные данные имеют произвольный диапазон, сначала необходимо выполнить нормализацию:

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

// Пример подготовки данных
const rawData = [
  { x: 10, y: 200, result: 0 },
  { x: 50, y: 800, result: 1 },
];

const xValues = rawData.map(d => d.x);
const yValues = rawData.map(d => d.y);

const xMin = Math.min(...xValues);
const xMax = Math.max(...xValues);
const yMin = Math.min(...yValues);
const yMax = Math.max(...yValues);

const trainingData = rawData.map(d => ({
  input: {
    x: minMaxNormalize(d.x, xMin, xMax),
    y: minMaxNormalize(d.y, yMin, yMax),
  },
  output: { result: d.result },
}));

После нормализации данные готовы для обучения сети Brain.js.

Особенности при работе с разными функциями активации

  • Sigmoid: диапазон [0, 1], рекомендуется нормализовать входные данные в [0, 1].
  • Tanh: диапазон [-1, 1], следует нормализовать входные данные соответственно.

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

Влияние нормализации на обучение

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

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

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

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