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

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

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

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

  • Для сигмоидной функции активации ( (x) = ) значения входа далеко за пределами диапазона [-5, 5] приводят к насыщению, что замедляет обучение.
  • Для гиперболического тангенса (()) значения должны находиться приблизительно в диапазоне [-1, 1] для эффективного обновления весов.

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

  1. Минимум–Максимум (Min-Max Scaling)

    Преобразование значения (x) в диапазон [0,1] или [-1,1] по формуле: [ x_{norm} = ] Для диапазона [-1, 1]: [ x_{norm} = 2 - 1]

    Применение в Synaptic требует предварительной обработки массива входных данных перед передачей их в сеть.

  2. Стандартизация (Standardization)

    Преобразование входных данных для получения среднего 0 и стандартного отклонения 1: [ x_{std} = ] где ( ) — среднее значение признака, ( ) — стандартное отклонение. Стандартизация полезна для функций активации типа tanh и ReLU.

  3. Логарифмическое и экспоненциальное масштабирование

    Используется для данных с большим разбросом значений (например, финансовые показатели). Пример логарифмической нормализации: [ x_{log} = (x + 1)]

Практическая реализация в Synaptic

Synaptic не предоставляет встроенных функций нормализации, поэтому обработка входных данных выполняется вручную перед тренировкой сети. Пример нормализации массива чисел с помощью Min-Max Scaling:

function normalizeArray(arr, newMin = 0, newMax = 1) {
    const min = Math.min(...arr);
    const max = Math.max(...arr);
    return arr.map(x => ((x - min) / (max - min)) * (newMax - newMin) + newMin);
}

// Пример использования
const rawInput = [15, 20, 35, 50, 80];
const normalizedInput = normalizeArray(rawInput, 0, 1);

После нормализации значения можно подавать на вход нейронной сети Synaptic:

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

// Создание простой сети
const inputLayer = new Layer(5);
const hiddenLayer = new Layer(3);
const outputLayer = new Layer(1);

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

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

// Тренировка
const trainer = new Trainer(network);
trainer.train([
    { input: normalizedInput, output: [0.5] }
], {
    rate: 0.1,
    iterations: 2000,
    error: 0.005,
    shuffle: true
});

Особенности при работе с несколькими признаками

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

function normalizeMatrix(matrix) {
    const cols = matrix[0].length;
    const normalized = matrix.map(row => [...row]);
    for (let j = 0; j < cols; j++) {
        const colValues = matrix.map(row => row[j]);
        const min = Math.min(...colValues);
        const max = Math.max(...colValues);
        for (let i = 0; i < matrix.length; i++) {
            normalized[i][j] = (matrix[i][j] - min) / (max - min);
        }
    }
    return normalized;
}

Рекомендации по выбору диапазона

  • Для сигмоидной функции: входы желательно нормализовать в диапазон [0,1].
  • Для tanh: предпочтителен диапазон [-1,1].
  • Для ReLU: можно использовать стандартизацию или нормализацию в диапазон, близкий к положительным значениям, чтобы минимизировать «мертвые» нейроны.

Ошибки при нормализации

  • Игнорирование масштаба разных признаков может привести к медленной сходимости.
  • Нормализация всего массива данных без учёта будущих входов для предсказаний может вызвать несоответствие при работе сети в реальном времени. Рекомендуется сохранять параметры (min, max, μ, σ) для применения к новым данным.

Вывод

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