ConvNetJS — это чисто JavaScript-библиотека для построения и обучения нейронных сетей, преимущественно свёрточных (Convolutional Neural Networks). Основные компоненты библиотеки — это сети (Net), слои (Layer) и тренировочные объекты (Trainer). Каждая сеть создаётся как последовательность слоёв, где каждый слой отвечает за отдельный этап обработки данных: свёртку, пулинг, нормализацию или полностью связанный слой.
Слои в ConvNetJS реализуются как объекты, имеющие методы
forward и backward. Метод
forward отвечает за прямое распространение данных через
слой, а backward — за обратное распространение ошибки и
обновление градиентов.
Пример типичной последовательности слоёв:
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:'conv', sx:5, filters:20, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'fc', num_neurons:100, activation:'relu'});
layer_defs.push({type:'softmax', num_classes:10});
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
Регуляризация снижает вероятность переобучения и повышает способность модели к обобщению. ConvNetJS поддерживает два вида регуляризации: L1 и L2.
Применение в ConvNetJS происходит через параметры
l1_decay и l2_decay тренера:
var trainer = new convnetjs.SGDTrainer(net, {
method: 'adadelta',
l2_decay: 0.001,
l1_decay: 0.0001,
learning_rate: 0.01,
batch_size: 20
});
ConvNetJS поддерживает несколько методов оптимизации:
Применение адаптивных оптимизаторов позволяет снизить колебания градиентов и ускорить обучение, что прямо влияет на точность модели.
Слишком высокий learning rate может привести к нестабильности
обучения, а слишком низкий — к медленной сходимости. ConvNetJS позволяет
динамически изменять скорость обучения через параметр
learning_rate или через создание собственного расписания
изменения на каждой эпохе.
trainer.learning_rate = 0.005; // уменьшение шага обучения
Для повышения точности на ограниченных датасетах используется искусственное увеличение данных: повороты, сдвиги, отражения, масштабирование. ConvNetJS не предоставляет встроенные методы аугментации, но их легко реализовать через преобразование изображений перед подачей в сеть.
Пример поворота изображения:
function rotateImage(image, angle) {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = image.width;
canvas.height = image.height;
ctx.translate(canvas.width/2, canvas.height/2);
ctx.rotate(angle * Math.PI / 180);
ctx.drawImage(image, -image.width/2, -image.height/2);
return canvas;
}
Хотя ConvNetJS не имеет встроенного слоя batch normalization, его можно реализовать вручную, нормализуя входы слоёв и корректируя градиенты. Это снижает зависимость от начальной инициализации весов и ускоряет сходимость.
Dropout — метод регуляризации, случайно отключающий часть нейронов во
время обучения, предотвращая переобучение. В ConvNetJS реализуется через
параметр drop_prob в слоях:
layer_defs.push({type:'fc', num_neurons:100, activation:'relu', drop_prob:0.5});
Это уменьшает корреляцию между нейронами и повышает обобщающую способность сети.
trainer.train, который возвращает
текущую потерю на батче.Эта методическая комбинация позволяет добиться значительного увеличения точности модели, не жертвуя стабильностью и скоростью обучения.