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

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

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

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

Простейший способ нормализации — линейное преобразование:

[ x_ = ]

где (x) — исходное значение признака, (x_) и (x_) — минимальное и максимальное значения признака в обучающей выборке.

В Synaptic нормализация реализуется на уровне подготовки данных. Например, если есть массив входных данных inputs, нормализовать его можно следующим образом:

function normalizeArray(arr) {
    const min = Math.min(...arr);
    const max = Math.max(...arr);
    return arr.map(x => (x - min) / (max - min));
}

const normalizedInputs = inputs.map(sample => normalizeArray(sample));

Важно сохранять параметры min и max для применения той же нормализации на новых данных при прогнозировании.

Стандартизация данных

Стандартизация приводит данные к распределению с нулевым средним и единичной дисперсией. Формула стандартизации:

[ x_ = ]

где () — среднее значение признака, () — стандартное отклонение.

Стандартизация полезна для алгоритмов, чувствительных к масштабу входных данных, включая нейронные сети с функцией активации ReLU, так как она ускоряет сходимость и стабилизирует процесс обучения.

Пример реализации стандартизации в Jav * aScript:

function standardizeArray(arr) {
    const mean = arr.reduce((sum, x) => sum + x, 0) / arr.length;
    const variance = arr.reduce((sum, x) => sum + (x - mean) ** 2, 0) / arr.length;
    const stdDev = Math.sqrt(variance);
    return arr.map(x => (x - mean) / stdDev);
}

const standardizedInputs = inputs.map(sample => standardizeArray(sample));

Выбор между нормализацией и стандартизацией

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

Применение в Synaptic

В Synaptic можно передавать данные в виде массивов чисел, но библиотека не выполняет автоматическую нормализацию. Поэтому подготовка данных перед обучением — обязательный шаг. Пример подготовки и обучения сети:

const { Layer, Network, Trainer } = require('synaptic');

const inputLayer = new Layer(3);
const hiddenLayer = new Layer(5);
const outputLayer = new Layer(2);

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

const myNetwork = new Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

// Подготовка данных
const trainingSet = [
    { input: normalizeArray([5, 10, 15]), output: [1, 0] },
    { input: normalizeArray([2, 8, 12]), output: [0, 1] }
];

const trainer = new Trainer(myNetwork);
trainer.train(trainingSet, {
    rate: 0.1,
    iterations: 20000,
    error: 0.005,
    shuffle: true
});

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

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

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