Dropout — это техника регуляризации, предназначенная для предотвращения переобучения нейронных сетей. Основная идея заключается в случайном «выключении» части нейронов на этапе обучения, что заставляет сеть развивать более устойчивые и обобщающие признаки.
Во время обучения, для каждого мини-батча случайным образом выбирается подмножество нейронов, которые временно игнорируются. Игнорирование реализуется путем умножения активаций на случайный бинарный маскирующий вектор, где значения 0 означают «выключено», а 1 — «включено». Этот процесс можно формально описать так:
[ = r_i x_i]
Параметр (p) называется keep probability и определяет долю нейронов, которые остаются активными.
ConvNetJS — это библиотека на JavaScript, предоставляющая средства
для построения и обучения нейронных сетей, включая свёрточные и
полносвязные слои. Dropout реализуется в виде слоя
DropoutLayer.
Пример создания слоя Dropout:
var layer = new convnetjs.DropoutLayer({drop_prob: 0.5});
Здесь drop_prob определяет вероятность
выключения нейронов, то есть (1 - p). Для большинства задач
используют значения от 0.2 до 0.5, в зависимости от сложности модели и
объёма данных.
Основные свойства слоя:
Методы:
Dropout чаще всего вставляют между полносвязными слоями, чтобы уменьшить зависимость сети от конкретных активаций нейронов. Пример конфигурации сети с Dropout:
var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:784});
layer_defs.push({type:'fc', num_neurons:100, activation:'relu'});
layer_defs.push({type:'dropout', drop_prob:0.5});
layer_defs.push({type:'fc', num_neurons:10, activation:'softmax'});
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
Здесь Dropout слой отключает половину нейронов первого полносвязного слоя на каждой итерации обучения. Это снижает переобучение и заставляет сеть учиться более обобщённым признакам.
DropoutLayer хранит маску в виде объекта vol (тензора
ConvNetJS). На каждом прямом проходе генерируется случайная маска:
for(var i=0;i<V.w.length;i++){
if(Math.random()<this.drop_prob){
this.drop_mask.w[i] = 0;
} else {
this.drop_mask.w[i] = 1;
}
this.out_act.w[i] = V.w[i]*this.drop_mask.w[i];
}
На обратном проходе градиенты умножаются на ту же маску:
for(var i=0;i<this.out_act.w.length;i++){
V.dw[i] = this.drop_mask.w[i] * this.out_act.dw[i];
}
Это гарантирует, что градиенты учитывают только активные нейроны.
Dropout является простым, но мощным инструментом регуляризации в ConvNetJS, позволяя значительно улучшить устойчивость и обобщающую способность нейронных сетей, особенно в задачах с ограниченным объёмом данных.