Нормализация данных является фундаментальной техникой при работе с нейронными сетями. Она позволяет привести значения признаков к единому масштабу, ускорить сходимость градиентного спуска и уменьшить вероятность переполнения или затухания градиентов. В JavaScript для этого используется библиотека TensorFlow.js, которая предоставляет удобные инструменты для работы с многомерными массивами — тензорами.
Нормализация — процесс приведения данных к определенному диапазону или распределению. Наиболее распространенные методы:
Min-Max нормализация Преобразует значения признаков в диапазон [0, 1] или [-1, 1] по формуле:
[ x_{} = ]
Z-score (стандартизация) Преобразует значения таким образом, чтобы они имели среднее 0 и стандартное отклонение 1:
[ x_{} = ]
Нормализация единичной длины (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);
Использование методов 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), что делает нормализацию по столбцам простой и эффективной.
Для стандартизации используется среднее и стандартное отклонение.
TensorFlow.js предоставляет функцию tf.moments, которая
вычисляет и среднее, и дисперсию:
const { mean, variance } = tf.moments(tensor2D, 0);
const std = variance.sqrt();
const standardized = tensor2D.sub(mean).div(std);
Особенность: при работе с батчами данных или
многомерными признаками важно указывать ось нормализации
(axis), чтобы операции выполнялись корректно по каждому
признаку.
Для приведения вектора к единичной длине используется
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 автоматически масштабирует и смещает значения каждого батча, ускоряя обучение и улучшая стабильность градиентов.
Использование тензоров вместо массивов JavaScript Позволяет выполнять операции на GPU через WebGL.
Освобождение памяти В TensorFlow.js необходимо
использовать tensor.dispose() или tf.tidy,
чтобы предотвращать утечки памяти:
tf.tidy(() => {
const normalized = tensor2D.sub(minCol).div(maxCol.sub(minCol));
normalized.print();
});
streaming data) можно
использовать скользящие средние для стандартизации без
загрузки всего датасета в память.axis могут изменить
форму массива.Эти инструменты обеспечивают гибкость и эффективность при подготовке данных для любых моделей машинного обучения в TensorFlow.js. Оптимизированные тензорные операции позволяют легко масштабировать нормализацию на большие объёмы данных и интегрировать её в обучение нейронных сетей.