Ансамблирование нейронных сетей представляет собой метод улучшения качества предсказаний за счёт объединения нескольких моделей. В контексте библиотеки Brain.js это позволяет компенсировать слабости отдельных сетей, повышая общую устойчивость и точность. Brain.js предоставляет гибкие инструменты для создания и обучения как отдельных сетей, так и их ансамблей.
Суммирование выходов (Averaging / Voting) Наиболее распространённый метод — усреднение предсказаний нескольких сетей. Если сети возвращают численные значения, используется среднее арифметическое. В случае категориальных задач применяются методы голосования (majority voting):
const brain = require('brain.js');
const net1 = new brain.NeuralNetwork();
const net2 = new brain.NeuralNetwork();
net1.train([{ input: [0, 0], output: [0] }, { input: [1, 1], output: [1] }]);
net2.train([{ input: [0, 0], output: [0] }, { input: [1, 1], output: [1] }]);
const output1 = net1.run([1, 1]);
const output2 = net2.run([1, 1]);
const ensembleOutput = (output1[0] + output2[0]) / 2;
Ключевой момент — корректное масштабирование выходов сетей. Для задач классификации можно преобразовать выходы в вероятности через нормализацию.
Бэггинг (Bootstrap Aggregating) Создание нескольких сетей на различных подвыборках данных позволяет снизить переобучение. В Brain.js это реализуется путём генерации случайных подмножеств исходного набора данных для каждой сети:
function bootstrapSample(data, size) {
const sample = [];
for (let i = 0; i < size; i++) {
const idx = Math.floor(Math.random() * data.length);
sample.push(data[idx]);
}
return sample;
}
const datasets = [bootstrapSample(trainingData, trainingData.length),
bootstrapSample(trainingData, trainingData.length)];
const nets = datasets.map(data => {
const net = new brain.NeuralNetwork();
net.train(data);
return net;
});
Каждая сеть обучается на немного отличающихся данных, что повышает разнообразие ансамбля и устойчивость к шуму.
Стекинг (Stacking) Более сложная стратегия, при которой выходы базовых сетей становятся входами для мета-сети, обучающейся на этих выходах. Это позволяет мета-сети выявлять закономерности ошибок отдельных моделей:
const metaNet = new brain.NeuralNetwork();
const metaTrainingData = trainingData.map(item => {
const outputs = nets.map(net => net.run(item.input)[0]);
return { input: outputs, output: item.output };
});
metaNet.train(metaTrainingData);
Применение стекинга особенно эффективно при работе с разнородными архитектурами сетей или различными наборами признаков.
Количество сетей в ансамбле зависит от размера обучающего набора и сложности задачи. Практическая рекомендация — использовать от 3 до 10 сетей для большинства задач с небольшими или средними объёмами данных. Архитектура отдельных сетей может быть идентичной или варьироваться для увеличения разнообразия предсказаний.
Promise.all или worker-потоки сокращает время.Использование ансамблей в Brain.js повышает надёжность моделей и часто даёт прирост точности, недостижимый отдельными сетями, особенно в условиях шумных или неполных данных.