← Назад к вопросам

Почему сеть с BatchNorm сходится быстрее?

1.8 Middle🔥 111 комментариев
#Глубокое обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему BatchNorm ускоряет сходимость нейронной сети

Batch Normalization (BatchNorm) — это одна из самых эффективных техник для ускорения обучения глубоких нейронных сетей. Вот основные механизмы:

1. Решение проблемы Internal Covariate Shift

Внутренняя ковариационная сдвиг (Internal Covariate Shift) — явление, когда распределение входных данных каждого слоя меняется во время обучения. Это замедляет обучение, так как слои постоянно адаптируются к новым распределениям.

Как BatchNorm решает проблему:

  • Нормализует активации каждого слоя: среднее = 0, дисперсия = 1
  • Стабилизирует распределение входов следующего слоя
  • Позволяет использовать более высокие learning rate без взрывного градиента
import numpy as np

def batch_norm(x, gamma, beta, eps=1e-5):
    # Вычисляем статистику по батчу
    mean = np.mean(x, axis=0)
    var = np.var(x, axis=0)
    
    # Нормализуем
    x_norm = (x - mean) / np.sqrt(var + eps)
    
    # Масштабируем и сдвигаем
    return gamma * x_norm + beta

2. Более плавные градиенты

Без BatchNorm:

  • Активации могут взрываться или умирать
  • Градиенты нестабильны (vanishing/exploding gradient problem)
  • Требуется маленький learning rate

С BatchNorm:

  • Нормализованные активации → нормализованные градиенты
  • Градиент сглаживается во всей сети
  • Можно использовать 10-100x больший learning rate

3. Регуляризационный эффект

BatchNorm работает как слабая регуляризация:

  • Шум от нормализации по батчу действует как Data Augmentation
  • Уменьшает переобучение
  • Позволяет отказаться от Dropout или использовать его слабее

4. Ускорение обучения в цифрах

Оригинальная статья (Ioffe & Szegedy, 2015) показала:

  • Сходимость в 14x быстрее на ImageNet
  • Достижение той же точности за 25x меньше батчей
  • Улучшение точности на 4-5% без дополнительных батчей

5. Особенности на практике

Во время обучения:

  • Используются статистика текущего батча (mean, var)
  • Нормализация добавляет небольшой шум

Во время инфиренса:

  • Используются скользящие средние (exponential moving average) из всего обучения
  • Полностью детерминировано
class BatchNormLayer:
    def __init__(self, num_features, momentum=0.1):
        self.gamma = np.ones(num_features)  # learnable scale
        self.beta = np.zeros(num_features)  # learnable shift
        self.running_mean = np.zeros(num_features)
        self.running_var = np.ones(num_features)
        self.momentum = momentum
    
    def forward(self, x, training=True):
        if training:
            mean = np.mean(x, axis=0)
            var = np.var(x, axis=0)
            # Обновляем скользящие средние
            self.running_mean = self.momentum * self.running_mean + (1 - self.momentum) * mean
            self.running_var = self.momentum * self.running_var + (1 - self.momentum) * var
        else:
            mean = self.running_mean
            var = self.running_var
        
        x_norm = (x - mean) / np.sqrt(var + 1e-5)
        return self.gamma * x_norm + self.beta

Вывод

BatchNorm ускоряет сходимость через комбинацию факторов: стабилизация распределения активаций, уменьшение взрывов/затухания градиентов, увеличение допустимого learning rate и слабая регуляризация. Это одна из самых простых и эффективных техник в глубоком обучении.

Почему сеть с BatchNorm сходится быстрее? | PrepBro