L2 регуляризация

L2 регуляризация является одним из ключевых методов предотвращения переобучения нейронных сетей. Она добавляет штраф за большие веса к функции потерь, что приводит к сжатию весов модели и улучшению её обобщающих способностей.

Математическая формулировка

Для нейронной сети с весами ( W ) функция потерь с L2 регуляризацией определяется как:

[ {reg} = {orig} + _i W_i^2]

где:

  • ( _{orig} ) — исходная функция потерь (например, MSE или кросс-энтропия),
  • ( W_i ) — отдельные веса сети,
  • ( ) — коэффициент регуляризации, определяющий степень штрафа за большие веса.

Ключевой эффект: L2 регуляризация стремится минимизировать сумму квадратов всех весов, что приводит к уменьшению их абсолютных значений и более гладкой модели.

Реализация в ConvNetJS

ConvNetJS предоставляет встроенную поддержку L2 регуляризации через объект Trainer, который используется для оптимизации параметров сети. Основные параметры, отвечающие за регуляризацию:

var trainer = new convnetjs.SGDTrainer(net, {
    method: 'adadelta',   // алгоритм оптимизации
    l2_decay: 0.001,      // коэффициент L2 регуляризации
    learning_rate: 0.01,  // скорость обучения
    batch_size: 10
});
  • l2_decay — коэффициент (), контролирующий влияние L2 регуляризации на обновление весов.
  • При каждом шаге градиентного спуска веса обновляются с учетом штрафа, добавляемого к градиенту:

[ W = -( + W)]

где () — скорость обучения.

Влияние L2 регуляризации на обучение

  1. Снижение переобучения: Сети с большим количеством параметров часто склонны к переобучению. L2 регуляризация удерживает веса от чрезмерного увеличения, что повышает обобщающую способность.

  2. Сглаживание весов: Большие значения весов приводят к резкой реакции нейронов на входные данные. Регуляризация заставляет веса быть более умеренными, обеспечивая стабильность активаций.

  3. Взаимодействие с другими методами: 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 регуляризация изменяет градиент на каждом шаге, но не добавляет вычислительной сложности, так как это простое умножение весов на коэффициент и суммирование с исходным градиентом.
  • При использовании адаптивных оптимизаторов (Adagrad, Adam, Adadelta) L2 также корректирует обновления, однако следует помнить, что слишком высокие значения l2_decay могут замедлить сходимость при этих методах.