Нормализация и денормализация данных в ml5.neuralNetwork

При работе с нейронными сетями правильная подготовка данных играет ключевую роль в точности и стабильности обучения. В библиотеке ml5.js, которая упрощает взаимодействие с TensorFlow.js через удобные высокоуровневые методы, важными инструментами являются нормализация и денормализация данных при работе с классом ml5.neuralNetwork.

Подготовка данных

Метод ml5.neuralNetwork поддерживает как обучение с числовыми, так и с категориальными признаками. Перед обучением модель требует, чтобы все числовые данные находились в едином диапазоне — обычно [0, 1] или [-1, 1]. Это необходимо, чтобы разные масштабы признаков не влияли на сходимость градиентного спуска.

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

const options = {
  task: 'regression',
  debug: true,
  learningRate: 0.01,
  layers: [
    { type: 'dense', units: 16, activation: 'relu' },
    { type: 'dense', units: 1 }
  ]
};

const nn = ml5.neuralNetwork(options);

Автоматическая нормализация

Библиотека ml5.js позволяет включить автоматическую нормализацию данных при добавлении примеров для обучения. Это выполняется через опцию normalize: true.

Пример добавления данных с нормализацией:

nn.addData({ x: 50, y: 200 }, { output: 0.8 });
nn.addData({ x: 30, y: 100 }, { output: 0.5 });

// Нормализация будет применена при вызове:
nn.normalizeData();

Функция normalizeData() вычисляет минимальные и максимальные значения каждого числового признака и масштабирует их в диапазон [0, 1]. При этом сохраняются пропорции между значениями, что позволяет сети эффективнее обучаться.

Денормализация результатов

После обучения модели и получения предсказаний на нормализованных данных часто возникает необходимость вернуть значения к исходному масштабу. Для этого используется денормализация. В ml5.js можно применить сохранённые параметры нормализации для обратного преобразования.

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

const normalizedInput = { x: 0.5, y: 0.75 };
const output = await nn.predict(normalizedInput);

// Денормализация результата
const denormalizedOutput = nn.denormalize(output, 'output');

Метод denormalize() позволяет преобразовать выход модели в реальные значения, удобные для интерпретации и использования в приложении.

Ручная нормализация

Иногда требуется полный контроль над процессом нормализации, особенно если данные будут использоваться вне ml5.js или требуется другой диапазон. Для этого можно вручную масштабировать признаки:

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

function denormalize(normValue, min, max) {
  return normValue * (max - min) + min;
}

const xNorm = normalize(50, 0, 100); // 0.5
const yNorm = normalize(200, 0, 400); // 0.5

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

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

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

Практические рекомендации

  1. Всегда вызывать nn.normalizeData() перед обучением при использовании числовых признаков.
  2. Хранить параметры нормализации для последующей денормализации предсказаний.
  3. При комбинировании числовых и категориальных данных применять нормализацию только к числовым признакам.
  4. Для прогнозирования новых примеров масштабировать входные данные тем же образом, что и данные обучения.

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