Плохая сходимость нейронной сети возникает, когда обучение не приводит к уменьшению ошибки на обучающем наборе данных или процесс обучения крайне медленный. В ConvNetJS эта проблема проявляется через медленное снижение функции потерь или резкие колебания точности. Основные причины:
Для диагностики сходимости важна визуализация и мониторинг:
var stats = trainer.getStats();
console.log(stats); // {loss: ..., gradMax: ..., gradMean: ..., trainAcc: ..., valAcc: ...}
ConvNetJS использует оптимизаторы с градиентным спуском, например
trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9, batch_size:20}).
Скорость обучения напрямую влияет на сходимость:
learning_rate > 0.1) приводит к
колебаниям функции потерь и нестабильности.learning_rate < 0.001) делает
обучение медленным, сеть может застрять в локальном минимуме.Стратегии корректировки:
gradMax и
gradMean.Для стабильной сходимости данные должны иметь среднее 0 и стандартное отклонение 1:
function normalizeData(data) {
var mean = data.reduce((sum, val) => sum + val) / data.length;
var std = Math.sqrt(data.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / data.length);
return data.map(val => (val - mean) / std);
}
Без нормализации нейроны могут получать значения различного масштаба, что приводит к затухающим или взрывающимся градиентам.
В ConvNetJS можно отслеживать распределение градиентов:
var gradStats = net.getGradientStats();
console.log(gradStats); // {mean: ..., max: ..., min: ...}
Плохая сходимость может быть следствием неподходящей архитектуры:
Пример конфигурации слоя с ReLU и Dropout:
var layerDefs = [];
layerDefs.push({type:'input', out_sx:32, out_sy:32, out_depth:3});
layerDefs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});
layerDefs.push({type:'pool', sx:2, stride:2});
layerDefs.push({type:'dropout', p:0.5});
layerDefs.push({type:'softmax', num_classes:10});
var net = new convnetjs.Net();
net.makeLayers(layerDefs);
Регуляризация снижает переобучение и может ускорить сходимость на валидационном наборе:
l2_decay в SGDTrainer.var trainer = new convnetjs.SGDTrainer(net, {
learning_rate: 0.01,
momentum: 0.9,
batch_size: 20,
l2_decay: 0.001
});
Для анализа сходимости создается лог функции потерь и точности:
var losses = [];
for(var i=0;i<1000;i++) {
trainer.train(xBatch, yBatch);
if(i % 10 === 0) losses.push(trainer.getStats().loss);
}
console.log(losses);
Эти методы позволяют выявить узкие места сходимости, корректировать параметры обучения и архитектуру, обеспечивая стабильное и эффективное обучение с использованием ConvNetJS.