Переобучение (overfitting) возникает, когда нейронная сеть слишком точно подстраивается под обучающие данные, включая шум и случайные закономерности, что снижает её способность к обобщению на новых данных. В Brain.js это проявляется в том, что после обучения сеть показывает практически идеальные результаты на тренировочном наборе, но резко теряет точность на тестовом.
1. Регуляризация
Brain.js позволяет использовать регуляризацию через параметр
learningRate и контроль количества эпох:
const net = new brain.NeuralNetwork({
hiddenLayers: [10],
learningRate: 0.01 // Снижает скорость обучения, предотвращая резкое подгонку
});
net.train(data, {
iterations: 2000, // Оптимальное число итераций
errorThresh: 0.005
});
Регуляризация снижает весовую значимость случайных выбросов и улучшает обобщающую способность сети.
2. Разделение данных на тренировочные и тестовые
Использование отдельного набора тестовых данных позволяет контролировать качество обучения:
const trainData = data.slice(0, Math.floor(data.length * 0.8));
const testData = data.slice(Math.floor(data.length * 0.8));
const net = new brain.NeuralNetwork();
net.train(trainData);
const accuracy = testData.reduce((acc, item) => {
const output = net.run(item.input);
return acc + (Math.round(output[0]) === item.output[0] ? 1 : 0);
}, 0) / testData.length;
3. Уменьшение сложности сети
Для уменьшения риска переобучения используется меньшее количество нейронов и слоев. Например, для задачи классификации 3 классов достаточно 5–10 нейронов в скрытом слое.
4. Добавление шума к данным
Небольшое случайное искажение входных данных позволяет сети научиться устойчивым закономерностям, а не конкретным примерам. В Brain.js это можно реализовать на этапе подготовки данных:
const noisyData = data.map(item => ({
input: item.input.map(x => x + (Math.random() - 0.5) * 0.1),
output: item.output
}));
5. Раннее прекращение обучения (Early Stopping)
Brain.js позволяет отслеживать ошибку на валидационном наборе. Как только ошибка перестаёт уменьшаться, обучение останавливается, предотвращая переобучение:
let lastError = Infinity;
for (let i = 0; i < 5000; i++) {
const stats = net.train(trainData, { iterations: 1 });
const testError = net.test(testData).error;
if (testError > lastError) break;
lastError = testError;
}
6. Кросс-валидация
Использование метода k-fold позволяет проверять сеть на нескольких поднаборах данных, что уменьшает риск выбора модели, ориентированной на случайные закономерности конкретного поднабора.
Использование этих стратегий позволяет в Brain.js создавать модели, которые демонстрируют стабильное качество на новых данных и сохраняют способность к обобщению без излишней подгонки под обучающие примеры.