Что такое Batch Normalization и зачем он нужен?
Batch Normalization (BN) — это метод нормализации активаций внутри нейронной сети, разработанный Сергеем Иоффе и Кристианом Шиллем в 2015 году. Он применяется к выходам скрытых слоёв нейросети и помогает ускорить и стабилизировать обучение. Изначально BN был предложен как способ борьбы с так называемым внутренним ковариационным сдвигом (internal covariate shift), но на практике его эффективность объясняется более широким кругом факторов.
1. Мотивация: внутренний ковариационный сдвиг
Когда параметры нейросети обновляются в процессе обучения, распределения активаций внутренних слоёв изменяются. Это приводит к тому, что каждый следующий слой постоянно получает «нестабильный» вход, что усложняет обучение.
Batch Normalization стремится стабилизировать распределения входов каждого слоя, что:
-
позволяет использовать более высокие значения learning rate
-
ускоряет сходимость
-
уменьшает чувствительность к инициализации весов
-
оказывает регуляризующее воздействие
2. Как работает Batch Normalization
BN выполняет следующие операции на каждом мини-батче и для каждого канала признаков (в сверточных сетях) или на каждом нейроне (в полносвязных сетях):
Шаги нормализации:
Пусть x1,x2,…,xmx_1, x_2, \dots, x_m — значения активации нейрона по мини-батчу из mm примеров:
- **Вычисление среднего:
**
μB=1m∑i=1mxi\mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i
- **Вычисление дисперсии:
**
σB2=1m∑i=1m(xi−μB)2\sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2
- **Нормализация входов:
**
x^i=xi−μBσB2+ϵ\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}
Где ϵ\epsilon — маленькая константа для предотвращения деления на ноль.
- **Обратное масштабирование и смещение:
**
yi=γx^i+βy_i = \gamma \hat{x}_i + \beta
Где γ\gamma и β\beta — обучаемые параметры, позволяющие сети при необходимости восстановить исходное распределение.
Таким образом, даже после нормализации сеть сохраняет возможность представить нужную трансформацию.
3. BatchNorm в сверточных сетях
В задачах компьютерного зрения BN применяется по каналам признаков, отдельно для каждого канала:
-
Если вход имеет форму (N,C,H,W)(N, C, H, W), где:
-
NN — размер батча
-
CC — число каналов
-
HH, WW — высота и ширина карты признаков
-
-
То BN вычисляется по осям NN, HH, WW для каждого из CC каналов
Это делает BN особенно удобным для сверточных сетей, так как он не разрушает пространственную структуру данных.
4. Режимы работы: обучение и инференс
BN работает по-разному в режиме обучения и инференса:
-
Во время обучения: используются статистики текущего батча: μB,σB2\mu_B, \sigma_B^2
-
Во время инференса: используются экспоненциально сглаженные оценки среднего и дисперсии, накопленные во время обучения
Это важно для стабильности работы на этапе тестирования, где размер батча может быть другим или батч состоит из одного изображения.
5. Преимущества Batch Normalization
1. Ускоряет обучение
Поскольку активации нормализованы, градиенты становятся более стабильными, и можно использовать большие learning rate без риска взрыва градиентов.
2. Уменьшает чувствительность к инициализации
BN снижает зависимость от выбора начальных весов, упрощая настройку модели.
3. Снижает переобучение
Хотя BN напрямую не предназначен для регуляризации, он оказывает регуляризующее действие, особенно при использовании больших батчей. Эффект связан с тем, что статистики батча слегка шумные, что аналогично Dropout.
4. Повышает устойчивость к шуму
Модель становится более устойчивой к входным и внутренним флуктуациям.
6. Недостатки и ограничения
1. Зависимость от размера батча
При слишком маленьком батче (например, ≤4\leq 4) статистики становятся нестабильными. Это особенно важно в задачах, где доступна ограниченная память (например, 3D-медицинские изображения).
2. Трудности при обучении на одном объекте (batch size = 1)
BN некорректно работает при inference на одном изображении, если не использовать заранее накопленные средние и дисперсии.
3. Не подходит для рекуррентных сетей
В RNN временные зависимости делают batch normalization трудноприменимой. Вместо неё используют LayerNorm или GroupNorm.
4. Добавляет вычисления
Хотя они незначительны, при работе на edge-устройствах это может иметь значение.
7. Альтернативы Batch Normalization
Layer Normalization
-
Нормализация по всем входам одного примера
-
Подходит для RNN и Transformer
-
Не зависит от размера батча
Instance Normalization
-
Применяется отдельно для каждого канала и для каждого примера
-
Используется в style transfer, GAN
Group Normalization
-
Делит каналы на группы и нормализует внутри групп
-
Не зависит от размера батча
-
Работает лучше на маленьких батчах (в отличие от BN)
8. Интеграция в архитектуру сети
BatchNorm обычно вставляется между свёрткой (или линейным слоем) и активацией:
Последовательность:
\[Conv\] → \[BatchNorm\] → \[ReLU\]
Такой порядок позволяет нормализовать выход слоя до применения ReLU и избежать обнуления статистик из-за активации.
9. Влияние на обратное распространение ошибки
Поскольку BN изменяет поток градиента, он помогает избежать взрыва или исчезновения градиентов, особенно в глубоких сетях. Градиенты становятся более равномерными, что помогает всем слоям обучаться примерно с одинаковой скоростью.
10. Практическое использование
PyTorch
import torch.nn as nn
model = nn.Sequential(
nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3),
nn.BatchNorm2d(128),
nn.ReLU()
)
TensorFlow / Keras
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation
x = Conv2D(128, kernel_size=3)(input_tensor)
x = BatchNormalization()(x)
x = Activation('relu')(x)
11. Эмпирическое влияние на производительность
Исследования показали, что добавление BatchNorm позволяет:
-
сократить число эпох до сходимости в 2–3 раза
-
использовать learning rate в 10 раз выше без нестабильности
-
достичь более высокой точности, особенно при глубокой архитектуре (ResNet, Inception и др.)
BN используется практически во всех современных архитектурах компьютерного зрения, включая:
-
ResNet (после каждой свёртки)
-
VGG (в модифицированных версиях)
-
DenseNet
-
EfficientNet
-
UNet и его вариации
-
GAN (DCGAN, StyleGAN)
Batch Normalization стал стандартным компонентом нейросетевых архитектур благодаря своей способности стабилизировать обучение, ускорять сходимость и повышать общую устойчивость сети.