Ансамбли моделей

ConvNetJS — это чисто клиентская библиотека на JavaScript для создания и обучения нейронных сетей, в первую очередь сверточных (CNN). Она реализует как базовые слои, так и продвинутые методы оптимизации, позволяя строить сложные модели без необходимости серверной инфраструктуры. Основная структура библиотеки основана на трех компонентах:

  • Vol — многомерный массив, который хранит значения активаций, градиентов и весов.
  • Layer — базовый класс слоев нейронной сети (Convolutional, FullyConnected, Softmax и др.).
  • Net — объект, объединяющий слои в модель и обеспечивающий прямое и обратное распространение.

Архитектура ансамблей моделей

Ансамбли моделей представляют собой метод объединения нескольких нейросетевых моделей для повышения точности и стабильности предсказаний. Основная идея заключается в том, что комбинация нескольких слабых моделей может дать более сильную и устойчивую систему. В ConvNetJS ансамбли реализуются через создание нескольких объектов Net и объединение их выходов на этапе предсказания.

Виды ансамблей

  1. Бэггинг (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;
    }
  2. Бустинг (Boosting) Последовательное обучение моделей, где каждая новая сеть фокусируется на ошибках предыдущих. ConvNetJS не имеет встроенной поддержки бустинга, но его можно реализовать вручную, модифицируя веса примеров между обучением сетей.

  3. Стекинг (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);

Для ансамбля этот процесс повторяется для каждой модели на её подвыборке данных.

Объединение предсказаний

После обучения требуется агрегировать предсказания:

  • Среднее (для регрессии): усреднение выходов всех сетей.
  • Голосование (для классификации): подсчёт числа моделей, предсказавших каждый класс, и выбор класса с наибольшим числом голосов.
  • Взвешенное усреднение: каждая модель получает вес в зависимости от её точности на валидационной выборке.

Оптимизация ансамблей

  • Разнообразие моделей: наилучшие результаты достигаются, если модели различаются архитектурой, гиперпараметрами или подвыборками данных.
  • Регуляризация: добавление dropout или L2-регуляризации в каждой модели снижает переобучение и улучшает ансамбль.
  • Контроль количества моделей: чрезмерное увеличение числа моделей не всегда улучшает точность и увеличивает вычислительные затраты.

Особенности ConvNetJS для ансамблей

  • Клиентская работа: все вычисления происходят в браузере или на Node.js, что ограничивает размер моделей и объём данных.
  • Гибкость слоев: возможность легко комбинировать разные архитектуры в ансамбле.
  • Отсутствие встроенного распределённого обучения: ансамбли реализуются локально, но при желании можно синхронизировать результаты между браузерами.

Примеры применения

  • Классификация изображений CIFAR-10 с использованием бэггинга нескольких CNN.
  • Предсказание временных рядов с ансамблем полностью связанных сетей для повышения устойчивости к шуму.
  • Комбинация CNN и MLP в стекинге для улучшения точности в задачах распознавания сложных паттернов.

Эффективное использование ансамблей в ConvNetJS позволяет достичь значительного улучшения качества моделей без усложнения основной архитектуры, используя только базовые средства библиотеки.