Batch Normalization
Пакетная нормализация стандартизирует каждый канал по мини-батчу, а затем масштабирует его с помощью обучаемых параметров. Математика, поведение при инференсе и ограничения.
Пакетная нормализация, или BatchNorm, — это слой нейронной сети, который нормализует каждый канал входных данных по среднему значению и дисперсии текущего мини-пакета, а затем масштабирует результат с помощью двух обучаемых параметров. Сергей Иоффе и Кристиан Сегеди представили её в 2015 году, и это позволило их классификатору изображений Inception достичь той же точности, используя в 14 раз меньше шагов обучения. BatchNorm позволяет использовать более высокие скорости обучения, снижает чувствительность обучения к инициализации весов и стала стандартным компонентом свёрточных нейронных сетей (CNNs), таких как ResNet.
Как работает пакетная нормализация#
Для сверточного слоя BatchNorm вычисляет для каждого канала среднее μ и дисперсию σ², объединяя данные всех изображений в пакете и всех пространственных позиций. Затем каждая активация x проходит два этапа:
- Нормализация: x̂ = (x − μ) / √(σ² + ε), где небольшое ε, по умолчанию равное 1e-5 в PyTorch, предотвращает деление на ноль.
- Масштабирование и сдвиг: y = γ·x̂ + β, где γ и β — обучаемые параметры для каждого канала. Они позволяют сети восстановить среднее и разброс, подходящие для следующего слоя, в том числе полностью отменить нормализацию.
BatchNorm обычно располагается между сверткой и её функцией активации. Поскольку β уже добавляет смещение для каждого канала, смещение предшествующей свертки избыточно и обычно отключается.
Обучение и инференс#
Во время обучения каждый прямой проход также обновляет скользящие среднее и дисперсию, используя экспоненциальное скользящее среднее статистик пакета. По умолчанию BatchNorm2d в PyTorch сдвигает их на 10% в сторону значений каждого нового пакета (momentum=0.1). Во время инференса слой нормализует данные по этим скользящим средним, поэтому предсказание для одного изображения больше не зависит от того, какие другие изображения находятся в том же пакете. model.train() и model.eval() переключают слой между двумя режимами:
import torch
torch.manual_seed(0)
bn = torch.nn.BatchNorm2d(num_features=3)
# A batch of 8 three-channel feature maps with mean 5 and standard deviation 2
x = 5 + 2 * torch.randn(8, 3, 16, 16)
# Training mode normalizes with this batch's per-channel mean and variance
out = bn(x)
print(f"train mode: output mean {out.mean():.3f}, std {out.std():.3f}")
# The same call nudges the running averages 10% of the way toward the batch statistics
print(f"running mean {bn.running_mean[0]:.3f}, running var {bn.running_var[0]:.3f}")
# Eval mode normalizes with the running averages instead of the batch statistics
bn.eval()
out = bn(x)
print(f"eval mode: output mean {out.mean():.3f}, std {out.std():.3f}")В режиме обучения выходные данные имеют среднее 0.000 и стандартное отклонение 1.000, хотя среднее входных данных равно 5. После одного пакета скользящее среднее изменилось всего с 0 до 0.496, а скользящая дисперсия — с 1 до 1.294, поэтому в режиме оценки выходные данные имеют среднее 3.920. Скользящим средним требуется несколько десятков пакетов, чтобы сойтись. Если оценивать модель в неверном режиме или до стабилизации статистик, её точность будет намного ниже истинной.
Во время инференса BatchNorm представляет собой фиксированное линейное преобразование для каждого канала, поэтому его можно объединить с предшествующей сверткой: веса свертки умножаются на γ/√(σ² + ε), а смещение становится равным β − γμ/√(σ² + ε). Стандартный сверточный блок в YOLO26 состоит из свертки без смещения, за которой следуют BatchNorm и активация SiLU. Перед предсказанием и экспортом Ultralytics объединяет каждый такой слой BatchNorm со сверткой, удаляя этот слой при сохранении тех же выходных данных.
Почему пакетная нормализация помогает#
В исходной статье пользу BatchNorm объясняли уменьшением внутреннего ковариативного сдвига — изменения распределения входных данных каждого слоя по мере обновления предыдущих слоёв. Позднее эксперименты со случайными сдвигами распределения после слоёв BatchNorm показали, что обучение почти не меняется. Исследователи связали пользу с более гладкой поверхностью функции потерь и более предсказуемыми градиентами, благодаря которым оптимизатор может делать более крупные и стабильные шаги. Поддержание среднего предварительных активаций около нуля и дисперсии около единицы также не даёт насыщаемым активациям попадать в плоские области, что помогает бороться с исчезающими градиентами.
Поскольку каждый пример нормализуется по статистикам случайно выбранного пакета, BatchNorm также добавляет шум, который действует как мягкий регуляризатор. В исходной статье сообщалось, что в некоторых случаях благодаря этому можно отказаться от dropout.
Ограничения#
- Маленькие пакеты: Статистики пакета становятся шумными, когда на каждом устройстве находится мало изображений. При двух изображениях на GPU групповая нормализация, которая вычисляет статистики групп каналов внутри каждого изображения, снизила ошибку ResNet-50 на ImageNet на 10.6% по сравнению с BatchNorm.
- Обучение на нескольких GPU: Каждый GPU нормализует свою часть пакета, если только слои не преобразованы в SyncBatchNorm, которая объединяет статистики устройств ценой дополнительных коммуникационных затрат.
- Модели последовательностей: Последовательности переменной длины и зависящие от пакета статистики плохо сочетаются, поэтому трансформеры вместо этого используют нормализацию слоёв.
Пакетная нормализация и связанные термины#
- Нормализация данных: Однократно масштабирует исходные входные данные на этапе предобработки, например делит значения пикселей на 255. BatchNorm нормализует промежуточные активации на каждом слое и каждом шаге обучения.
- Нормализация слоёв: Нормализует признаки каждого примера отдельно, поэтому одинаково работает при обучении и инференсе и не зависит от размера пакета. RMSNorm — более простой вариант без вычитания среднего — широко используется в больших языковых моделях.
- Групповая нормализация: Делит каналы каждого изображения на группы и нормализует данные внутри каждой группы. Такой подход подходит для моделей детекции и сегментации, обучаемых на небольших пакетах.
- Нормализация экземпляров: Отдельно нормализует каждый канал каждого изображения, устраняя контрастные различия между изображениями. Замена BatchNorm нормализацией экземпляров и при обучении, и при тестировании заметно улучшила качество быстрого переноса нейронного стиля.










