ConvNetJS — это чисто клиентская библиотека на JavaScript для создания и обучения нейронных сетей, в первую очередь сверточных (CNN). Она реализует как базовые слои, так и продвинутые методы оптимизации, позволяя строить сложные модели без необходимости серверной инфраструктуры. Основная структура библиотеки основана на трех компонентах:
Vol — многомерный массив, который
хранит значения активаций, градиентов и весов.Layer — базовый класс слоев нейронной
сети (Convolutional, FullyConnected, Softmax и др.).Net — объект, объединяющий слои в
модель и обеспечивающий прямое и обратное распространение.Ансамбли моделей представляют собой метод объединения нескольких
нейросетевых моделей для повышения точности и стабильности предсказаний.
Основная идея заключается в том, что комбинация нескольких слабых
моделей может дать более сильную и устойчивую систему. В ConvNetJS
ансамбли реализуются через создание нескольких объектов Net
и объединение их выходов на этапе предсказания.
Бэггинг (Bagging) Каждая модель обучается на случайной подвыборке обучающих данных с возвращением (bootstrap). Итоговое предсказание формируется как усреднение выходов всех сетей для регрессии или голосование для классификации.
var nets = [];
for(var i=0;i<5;i++){
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
nets.push(net);
}
// После обучения на разных подвыборках:
function predictBagging(input){
var votes = [];
nets.forEach(net => {
votes.push(net.forward(input).w);
});
var avg = votes[0].slice();
for(var j=1;j<votes.length;j++){
for(var k=0;k<avg.length;k++){
avg[k] += votes[j][k];
}
}
for(var k=0;k<avg.length;k++) avg[k] /= votes.length;
return avg;
}Бустинг (Boosting) Последовательное обучение моделей, где каждая новая сеть фокусируется на ошибках предыдущих. ConvNetJS не имеет встроенной поддержки бустинга, но его можно реализовать вручную, модифицируя веса примеров между обучением сетей.
Стекинг (Stacking) Выходы нескольких сетей
используются как вход для метамодели (например, простой линейной
регрессии или ещё одной сети). В ConvNetJS это реализуется путем
создания дополнительного Net, который обучается на выходах
базовых моделей.
Для успешного использования ансамблей важно корректно подготовить данные:
[0,1] или [-1,1].Каждая модель создаётся через new convnetjs.Net(), затем
определяется архитектура с помощью массива layer_defs.
Типичный пример:
var layer_defs = [];
layer_defs.push({type:'input', out_sx:32, out_sy:32, out_depth:3});
layer_defs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'fc', num_neurons:50, activation:'relu'});
layer_defs.push({type:'softmax', num_classes:10});
Обучение выполняется через Trainer:
var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9, batch_size:10, l2_decay:0.001});
trainer.train(x, y);
Для ансамбля этот процесс повторяется для каждой модели на её подвыборке данных.
После обучения требуется агрегировать предсказания:
Эффективное использование ансамблей в ConvNetJS позволяет достичь значительного улучшения качества моделей без усложнения основной архитектуры, используя только базовые средства библиотеки.