Нормализация данных через тензорные операции

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


Основные концепции нормализации

Нормализация — процесс приведения данных к определенному диапазону или распределению. Наиболее распространенные методы:

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

    [ x_{} = ]

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

    [ x_{} = ]

  3. Нормализация единичной длины (L2-норма) Используется для приведения вектора признаков к длине 1:

    [ x_{} = ]


Создание тензоров из данных

Для работы с нормализацией данные необходимо представлять в виде тензоров. В TensorFlow.js используется объект tf.tensor. Пример создания тензора из массива:

import * as tf from '@tensorflow/tfjs';

const data = [10, 20, 30, 40, 50];
const tensor = tf.tensor(data);

Для двумерных данных, например признаков и примеров:

const data2D = [
  [10, 200],
  [20, 400],
  [30, 600]
];
const tensor2D = tf.tensor2d(data2D);

Min-Max нормализация через тензорные операции

Использование методов tf.min и tf.max позволяет выполнить нормализацию без явного обхода массива:

const min = tensor.min();
const max = tensor.max();

const normalized = tensor.sub(min).div(max.sub(min));

Для двумерного тензора можно нормализовать по столбцам, используя аргумент axis:

const minCol = tensor2D.min(0);
const maxCol = tensor2D.max(0);

const normalized2D = tensor2D.sub(minCol).div(maxCol.sub(minCol));

Ключевой момент: все операции в TensorFlow.js поддерживают автоматическое выравнивание размеров (broadcasting), что делает нормализацию по столбцам простой и эффективной.


Стандартизация (Z-score) через tf.mean и tf.moments

Для стандартизации используется среднее и стандартное отклонение. TensorFlow.js предоставляет функцию tf.moments, которая вычисляет и среднее, и дисперсию:

const { mean, variance } = tf.moments(tensor2D, 0);
const std = variance.sqrt();

const standardized = tensor2D.sub(mean).div(std);

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


Нормализация L2

Для приведения вектора к единичной длине используется tf.norm:

const l2Norm = tensor.norm('euclidean');
const unitVector = tensor.div(l2Norm);

Для матриц можно нормализовать строки или столбцы:

const rowNorms = tensor2D.norm('euclidean', 1, true); // axis=1, keepDims=true
const normalizedRows = tensor2D.div(rowNorms);

Интеграция нормализации в модель

TensorFlow.js позволяет интегрировать нормализацию прямо в граф вычислений модели. Например, при использовании tf.layers.batchNormalization или при создании кастомного слоя:

const model = tf.sequential();
model.add(tf.layers.dense({ units: 64, inputShape: [2] }));
model.add(tf.layers.batchNormalization());
model.add(tf.layers.dense({ units: 1 }));

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


Оптимизация вычислений

  1. Использование тензоров вместо массивов JavaScript Позволяет выполнять операции на GPU через WebGL.

  2. Освобождение памяти В TensorFlow.js необходимо использовать tensor.dispose() или tf.tidy, чтобы предотвращать утечки памяти:

tf.tidy(() => {
  const normalized = tensor2D.sub(minCol).div(maxCol.sub(minCol));
  normalized.print();
});
  1. Векторизация операций Любые циклы по элементам данных заменяются тензорными операциями для повышения производительности.

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

  • Для больших наборов данных нормализация должна выполняться до разделения на обучающую и тестовую выборки, чтобы избежать утечки информации.
  • Для потоковых данных (streaming data) можно использовать скользящие средние для стандартизации без загрузки всего датасета в память.
  • Всегда проверять размерности после нормализации, особенно при работе с многомерными тензорами: операции с axis могут изменить форму массива.

Эти инструменты обеспечивают гибкость и эффективность при подготовке данных для любых моделей машинного обучения в TensorFlow.js. Оптимизированные тензорные операции позволяют легко масштабировать нормализацию на большие объёмы данных и интегрировать её в обучение нейронных сетей.