L2 регуляризация является одним из ключевых методов предотвращения переобучения нейронных сетей. Она добавляет штраф за большие веса к функции потерь, что приводит к сжатию весов модели и улучшению её обобщающих способностей.
Для нейронной сети с весами ( W ) функция потерь с L2 регуляризацией определяется как:
[ {reg} = {orig} + _i W_i^2]
где:
Ключевой эффект: L2 регуляризация стремится минимизировать сумму квадратов всех весов, что приводит к уменьшению их абсолютных значений и более гладкой модели.
ConvNetJS предоставляет встроенную поддержку L2 регуляризации через
объект Trainer, который используется для оптимизации
параметров сети. Основные параметры, отвечающие за регуляризацию:
var trainer = new convnetjs.SGDTrainer(net, {
method: 'adadelta', // алгоритм оптимизации
l2_decay: 0.001, // коэффициент L2 регуляризации
learning_rate: 0.01, // скорость обучения
batch_size: 10
});
[ W = -( + W)]
где () — скорость обучения.
Снижение переобучения: Сети с большим количеством параметров часто склонны к переобучению. L2 регуляризация удерживает веса от чрезмерного увеличения, что повышает обобщающую способность.
Сглаживание весов: Большие значения весов приводят к резкой реакции нейронов на входные данные. Регуляризация заставляет веса быть более умеренными, обеспечивая стабильность активаций.
Взаимодействие с другими методами: L2 регуляризация часто применяется вместе с Dropout, Batch Normalization и ранней остановкой (Early Stopping), чтобы усилить устойчивость модели.
Выбор коэффициента l2_decay: Значения обычно лежат в диапазоне (10^{-5} - 10^{-2}). Малое значение практически не влияет на модель, слишком большое приводит к недообучению.
Комбинирование с другими гиперпараметрами: L2 регуляризация должна настраиваться вместе с learning_rate, так как слишком высокий learning_rate при сильной регуляризации может препятствовать сходимости сети.
Особенности ConvNetJS: ConvNetJS автоматически
учитывает L2 при вычислении градиентов и обновлении весов. Важно
учитывать, что регуляризация применяется только к обучаемым весам, но не
к смещениям (biases).
Создание простой сети с L2 регуляризацией:
var layer_defs = [];
layer_defs.push({type:'input', out_sx:28, out_sy:28, out_depth:1});
layer_defs.push({type:'conv', sx:5, filters:8, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'softmax', num_classes:10});
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
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<1000;i++){
var x = getNextBatch(); // функция, возвращающая входные данные
trainer.train(x.data, x.label);
}
В этом примере L2 регуляризация предотвращает резкое увеличение весов свёрточных фильтров и выходного слоя, обеспечивая более стабильное обучение и меньшую вероятность переобучения на тренировочных данных.
Наблюдение за весами: Можно визуализировать
распределение весов слоёв. Если веса становятся слишком большими —
увеличить l2_decay. Если веса слишком малы и сеть плохо
обучается — уменьшить l2_decay.
Влияние на функцию потерь: L2 регуляризация увеличивает значение функции потерь на тренировочных данных, но снижает разрыв между тренировочной и тестовой ошибкой, что является признаком улучшенной обобщающей способности.
Совместимость с разными слоями: ConvNetJS
применяет L2 ко всем слоям, где есть веса (conv и
fc). Параметр l2_decay одинаков для всех
слоёв, хотя в продвинутых настройках можно варьировать его для разных
слоёв вручную, изменяя градиенты до передачи в метод
train.
l2_decay могут замедлить сходимость при
этих методах.