Batch renormalization

Batch Renormalization является расширением стандартной нормализации батча (Batch Normalization, BN) и предназначена для стабилизации обучения глубоких нейронных сетей при небольших размерах мини-батча и при изменяющихся распределениях данных. Она добавляет дополнительные корректирующие параметры к классическому BN, позволяя сети корректировать отклонения между статистикой текущего мини-батча и статистикой всей выборки.


Принцип работы

В стандартной Batch Normalization активации (x) нормализуются по формуле:

[ = ]

где (_B) и (_B^2) — среднее и дисперсия по батчу, () — небольшое смещение для численной стабильности. После нормализации применяется масштабирование и смещение:

[ y = + ]

Batch Renormalization добавляет два новых параметра (r) и (d), которые корректируют нормализованные значения:

[ _r = r + d]

где

[ r = , d = ]

  • () и () — усреднённые значения по всей выборке, используемые в момент обучения.
    1. и (d) позволяют корректировать отклонения мини-батча от глобальной статистики, предотвращая расходимость обучения при малых батчах или при значительных изменениях распределения данных (covariate shift).

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

ConvNetJS предоставляет поддержку Batch Renormalization через слой ConvLayer или FullyConnectedLayer, используя ключевые параметры batch_normalization и batch_renorm.

Пример создания слоя с Batch Renormalization:

var layer = new convnetjs.FullyConnLayer({
    num_neurons: 128,
    batch_normalization: true,
    batch_renorm: true
});

Ключевые параметры:

  • batch_normalization — включает стандартную нормализацию батча.
  • batch_renorm — включает расширение Batch Renormalization.
  • bn_epsilon — параметр () для численной стабильности (по умолчанию 1e-5).
  • bn_momentum — коэффициент экспоненциального скользящего среднего для статистики всей выборки (по умолчанию 0.9).

Обновление статистики

Batch Renormalization требует отслеживания глобальных средних значений () и (). ConvNetJS автоматически использует экспоненциальное скользящее среднее для их обновления во время обучения:

[ (1 - ) + _B]

[ ^2 (1 - ) ^2 + _B^2]

Эти значения используются при корректировке параметров (r) и (d).


Преимущества Batch Renormalization

  1. Стабильное обучение при малых батчах: классическая BN плохо работает с маленькими мини-батчами, так как статистика может сильно отличаться от глобальной. Batch Renorm корректирует это отклонение.
  2. Снижение covariate shift: параметры (r) и (d) помогают сети адаптироваться к изменению распределения данных в процессе обучения.
  3. Гибкость: легко интегрируется в существующие архитектуры ConvNetJS без значительных изменений кода.

Важные нюансы при использовании

  • Параметры (r) и (d) обычно ограничиваются значениями (r_{}) и (d_{}) для предотвращения чрезмерных корректировок. В ConvNetJS эти ограничения настраиваются автоматически, но их можно регулировать через:
layer.bn_r_max = 3.0;
layer.bn_d_max = 5.0;
  • Batch Renorm рекомендуется использовать вместе с адаптивными оптимизаторами, такими как Adam или RMSProp, чтобы ускорить сходимость и уменьшить колебания градиентов.
  • На этапе тестирования слой ведет себя аналогично стандартной Batch Normalization: используются только глобальные статистики () и ().

Интеграция с другими слоями

Batch Renormalization совместима с любыми слоями, поддерживающими нормализацию батча:

  • Полносвязные слои (FullyConnectedLayer) — особенно полезно при малых размерах батчей.
  • Сверточные слои (ConvLayer) — помогает стабилизировать обучение глубоких сетей с большим количеством фильтров.
  • Слои активации (ReLU, Sigmoid, Tanh) — обычно идут после слоя Batch Renorm.

Рекомендуемая последовательность в ConvNetJS:

[ConvLayer / FullyConnectedLayer] -> [BatchRenorm] -> [Activation]

Примеры обучения

Настройка простой модели с Batch Renormalization:

var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:784});
layer_defs.push({type:'fc', num_neurons:256, batch_normalization:true, batch_renorm:true, activation:'relu'});
layer_defs.push({type:'fc', num_neurons:128, batch_normalization:true, batch_renorm:true, activation:'relu'});
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:32,
    l2_decay:0.0001
});

При обучении параметр batch_size может быть уменьшен без потери стабильности, благодаря корректировкам r и d.


Batch Renormalization в ConvNetJS обеспечивает улучшенную стабильность обучения глубоких сетей, особенно при небольших батчах и изменяющемся распределении данных, что делает её мощным инструментом для построения высокоточных моделей на JavaScript.