Batch Renormalization является расширением стандартной нормализации батча (Batch Normalization, BN) и предназначена для стабилизации обучения глубоких нейронных сетей при небольших размерах мини-батча и при изменяющихся распределениях данных. Она добавляет дополнительные корректирующие параметры к классическому BN, позволяя сети корректировать отклонения между статистикой текущего мини-батча и статистикой всей выборки.
В стандартной Batch Normalization активации (x) нормализуются по формуле:
[ = ]
где (_B) и (_B^2) — среднее и дисперсия по батчу, () — небольшое смещение для численной стабильности. После нормализации применяется масштабирование и смещение:
[ y = + ]
Batch Renormalization добавляет два новых параметра (r) и (d), которые корректируют нормализованные значения:
[ _r = r + d]
где
[ r = , d = ]
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).
layer.bn_r_max = 3.0;
layer.bn_d_max = 5.0;
Batch Renormalization совместима с любыми слоями, поддерживающими нормализацию батча:
Рекомендуемая последовательность в 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.