В задачах машинного обучения правильная обработка входных данных критически важна для корректной работы нейронных сетей. В библиотеке 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));
В 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.