🔴 Сложный ⏱️ 25 минут

Batch Normalization: как сделать нейросети стабильнее

Batch Normalization: как сделать нейросети стабильнее

🎯 Зачем это нужно?

Представь, что ты тренируешь команду для эстафеты 🏃‍♂️. Если один бегун очень быстрый, а другой медленный - команда работает нестабильно. То же самое происходит в нейросетях: слои могут “работать” с разной скоростью, что замедляет обучение.

Реальные применения:

  • ResNet в компьютерном зрении: BatchNorm помог создать сети с 152 слоями
  • BERT в NLP: без нормализации трансформеры обучались бы месяцами
  • Стабильная диффузия: нормализация критична для генерации изображений

📚 История вопроса

В 2015 году исследователи Google заметили странную проблему: глубокие сети обучались мучительно медленно. Причина оказалась неожиданной - “внутренний сдвиг ковариаций” (internal covariate shift).

Сергей Иоффе и Кристиан Сегеди предложили решение: нормализовать входы каждого слоя. Их статья стала одной из самых цитируемых в deep learning - BatchNorm используется практически везде!

💡 Интуиция

Проблема без BatchNorm: Представь оркестр, где каждый музыкант играет в своём темпе 🎵. Первая скрипка играет медленно, барабаны - очень быстро. Дирижёру (алгоритму обучения) сложно координировать такой хаос!

[МЕДИА: image_01] Описание: Сравнение активаций слоев с BatchNorm и без него - гистограммы распределений Промпт: “side-by-side histograms showing layer activations distribution, left side chaotic spread without batch norm, right side normalized gaussian distribution, neural network layers visualization, technical illustration style”

Решение с BatchNorm: BatchNorm - это как метроном для оркестра. Он заставляет все слои “играть в одном ритме”, нормализуя их выходы к стандартному распределению.

Что происходит:

  1. Берём batch из примеров (скажем, 32 изображения)
  2. Для каждого нейрона вычисляем среднее и дисперсию по batch’у
  3. Нормализуем: (x - μ) / σ
  4. Добавляем обучаемые параметры γ и β для гибкости

📐 Формальное определение

Batch Normalization для слоя с активациями x:

Шаг 1: Вычисляем статистики по batch’у

  • μ = (1/m) Σᵢ xᵢ (среднее)
  • σ² = (1/m) Σᵢ (xᵢ - μ)² (дисперсия)

Шаг 2: Нормализуем

  • x̂ᵢ = (xᵢ - μ) / √(σ² + ε)

Шаг 3: Масштабируем и сдвигаем

  • yᵢ = γx̂ᵢ + β

Где γ (scale) и β (shift) - обучаемые параметры, ε ≈ 1e-5 для численной стабильности.

🔍 Примеры с разбором

Пример 1: BatchNorm в свёрточном слое

import torch.nn as nn

# Свёртка + BatchNorm + ReLU
conv_block = nn.Sequential(
    nn.Conv2d(64, 128, 3, padding=1),    # (batch, 128, H, W)
    nn.BatchNorm2d(128),                  # Нормализуем по 128 каналам
    nn.ReLU()
)

Что происходит:

  1. Свёртка выдаёт тензор размера (batch_size, 128, H, W)
  2. BatchNorm2d вычисляет μ и σ² для каждого из 128 каналов отдельно
  3. Нормализует все пиксели канала одновременно

[МЕДИА: image_02] Описание: Схема работы BatchNorm в CNN - показать как нормализуются каналы Промпт: “technical diagram showing BatchNorm operation in CNN, feature maps before and after normalization, channel-wise statistics computation, arrows showing data flow, modern technical illustration”

Пример 2: Влияние на градиенты

Без BatchNorm:

# Градиенты могут "взрываться" или "исчезать"
L/w₁ = 0.001    # очень маленький
L/w₁₀ = 100     # огромный

С BatchNorm:

# Градиенты стабилизируются
L/w₁ = 0.1      # разумный масштаб
L/w₁₀ = 0.3     # тоже разумный

Пример 3: Train vs Eval режимы

Training mode:

model.train()  # Использует статистики текущего batch'а

Evaluation mode:

model.eval()   # Использует накопленные running statistics

Это критично! В inference мы не можем зависеть от других примеров в batch’е.

🎮 Практика

Базовый уровень 🟢

Задание 1: Реализуй простую BatchNorm для полносвязного слоя

def batch_norm_1d(x, gamma, beta, eps=1e-5):
    # x: (batch_size, features)
    # Твой код здесь
    pass

Задание 2: Вычисли выход BatchNorm Дан batch: [[1, 2], [3, 4], [5, 6]], γ=1, β=0 Найди нормализованный выход.

Задание 3: Почему BatchNorm помогает с градиентами? Объясни связь между нормализацией активаций и стабильностью градиентов.

Задание 4: Где в архитектуре ставить BatchNorm? Выбери правильный порядок: Conv → BN → ReLU или Conv → ReLU → BN?

Продвинутый уровень 🟡

Задание 5: Реализуй BatchNorm2d для свёрток

def batch_norm_2d(x, gamma, beta, eps=1e-5):
    # x: (batch, channels, height, width)
    # Нормализация по (batch, height, width) для каждого канала
    pass

Задание 6: Momentum в running statistics Объясни, зачем нужен momentum=0.1 в накоплении статистик: running_mean = momentum * batch_mean + (1-momentum) * running_mean

Задание 7: BatchNorm vs LayerNorm В чём разница? Когда использовать каждый тип?

Задание 8: Влияние batch size Почему BatchNorm плохо работает с маленькими batch’ами (< 8)?

Челлендж 🔴

Задание 9: Ghost Batch Normalization Реализуй модификацию для очень больших batch’ов, где статистики вычисляются по “виртуальным” mini-batch’ам размера 32.

Задание 10: Differentiable GroupNorm Почему в некоторых задачах (детекция объектов) GroupNorm лучше BatchNorm?

Задание 11: BatchNorm в GAN Объясни, почему в дискриминаторе GAN BatchNorm может навредить, а в генераторе помогает.

⚠️ Частые ошибки

Ошибка: Забывать переключать в eval() режим ✅ Правильно: model.eval() перед inference 💡 Почему: В training используются batch статистики, в eval - накопленные

Ошибка: BatchNorm после ReLU: Conv → ReLU → BN ✅ Правильно: Conv → BN → ReLU 💡 Почему: Нормализация перед активацией более стабильна

Ошибка: Использовать с dropout без понимания взаимодействия ✅ Правильно: BatchNorm часто заменяет dropout 💡 Почему: Оба метода регуляризации, могут конфликтовать

Ошибка: Не учитывать batch size при выборе нормализации ✅ Правильно: При batch < 8 лучше LayerNorm или GroupNorm 💡 Почему: Статистики маленького batch’а ненадёжны

Ошибка: Инициализация γ и β ✅ Правильно: γ=1, β=0 изначально 💡 Почему: Начинаем с identity transformation

🎓 Главное запомнить

Суть: BatchNorm стабилизирует обучение, нормализуя активации к N(0,1) ✅ Формула: y = γ((x-μ)/σ) + β, где μ,σ - статистики batch’а ✅ Применение: Почти во всех современных архитектурах (ResNet, EfficientNet, трансформеры)

🔗 Связь с другими темами

Откуда пришли: Проблема внутреннего ковариатного сдвига в глубоких сетях (урок 331) Куда ведёт: Другие виды нормализации (LayerNorm, GroupNorm), архитектуры ResNet и трансформеры Связано с: Инициализация весов, выбор learning rate, регуляризация

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!