ConvNetJS — это чисто JavaScript библиотека для построения и обучения нейронных сетей, включая сверточные сети. Центральным элементом обучения является градиентный спуск — метод оптимизации, позволяющий находить минимум функции потерь нейронной сети.
Каждая нейронная сеть имеет функцию потерь ( L() ), где () — параметры сети (веса и смещения). Задача обучения — минимизация этой функции. Градиентный спуск основывается на вычислении градиента функции потерь по параметрам сети:
[ _L() = ]
В ConvNetJS вычисление градиента выполняется автоматически с помощью
метода backward(), который распространяет ошибку от
выходного слоя к входным слоям.
Основное правило обновления весов при стандартном стохастическом градиентном спуске (SGD) выглядит так:
[ - _L()]
где () — скорость обучения (learning rate). В ConvNetJS это задается
при создании объекта оптимизатора Trainer. Пример:
var trainer = new convnetjs.SGDTrainer(net, {
learning_rate: 0.01,
momentum: 0.9,
batch_size: 20,
l2_decay: 0.001
});
Здесь:
learning_rate — скорость обучения.momentum — коэффициент импульса, ускоряющий
сходимость.batch_size — размер мини-батча.l2_decay — регуляризация L2, предотвращающая
переобучение.Помимо стандартного SGD, ConvNetJS поддерживает различные варианты оптимизации:
SGD с моментумом Добавление импульса помогает сгладить обновления и ускоряет обучение при “узких” минимумах функции потерь:
[ v v - _L(), + v]
где (v) — скорость, () — коэффициент моментума.
RMSProp Адаптивная скорость обучения для каждого параметра, уменьшающая колебания:
[ g^2_ g^2_ + (1-) g^2] [ - _L()]
AdaGrad Уменьшает скорость обучения для часто обновляемых параметров, что особенно полезно при разреженных данных.
ConvNetJS предоставляет эти методы через конфигурацию
Trainer, изменяя только параметр method:
var trainer = new convnetjs.SGDTrainer(net, {
method: 'adagrad',
learning_rate: 0.01
});
Использование мини-батчей — ключевой аспект оптимизации в ConvNetJS. Вместо вычисления градиента по всему датасету одновременно, градиент считается на небольших подвыборках. Преимущества:
Размер мини-батча настраивается через batch_size в
SGDTrainer. Типичные значения: 10–100.
ConvNetJS поддерживает L2-регуляризацию и дропаут:
l2_decay: 0.001
var layer = { type: 'dropout', p: 0.5 };
Это помогает модели лучше обобщать и снижает переобучение.
Процесс обучения сети в ConvNetJS выглядит так:
var net = new convnetjs.Net();
net.addLayer({ type: 'input', out_sx: 28, out_sy: 28, out_depth: 1 });
net.addLayer({ type: 'conv', sx: 5, filters: 8, stride: 1, pad: 2, activation: 'relu' });
net.addLayer({ type: 'pool', sx: 2, stride: 2 });
net.addLayer({ type: 'softmax', num_classes: 10 });
var trainer = new convnetjs.SGDTrainer(net, {
learning_rate: 0.01,
momentum: 0.9,
batch_size: 20,
l2_decay: 0.001
});
for(var i=0;i<iterations;i++){
var x = getNextInput(); // вектор входных данных
var y = getNextLabel(); // правильная метка
trainer.train(x, y);
}
console.log("Loss:", trainer.getLoss());
console.log("Accuracy:", trainer.test(x_test, y_test));
Эффективность градиентного спуска зависит от правильного выбора
learning_rate и momentum. В ConvNetJS часто
используется адаптивная подстройка скорости обучения
вручную, снижая learning_rate по мере уменьшения
потерь:
if(epoch % 10 === 0){
trainer.learning_rate *= 0.9;
}
Это позволяет достигать более стабильной сходимости и предотвращает колебания около минимума.
Градиентный спуск в ConvNetJS — гибкий инструмент, позволяющий эффективно обучать нейронные сети даже в среде JavaScript, сохраняя возможность экспериментов с различными методами оптимизации и регуляризации.