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

Как рассчитывается Batch Normalization?

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

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

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

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

Batch Normalization: Расчёт и Механизм

Определение

Batch Normalization (BN) — это техника нормализации входных данных каждого слоя нейронной сети во время обучения. Она стабилизирует процесс обучения и позволяет использовать более высокие скорости обучения.

Математическая формула

Для batch размером m и признака x в слое:

1. Вычисляем среднее batch:
   μ_B = (1/m) * Σ(x_i)

2. Вычисляем дисперсию batch:
   σ²_B = (1/m) * Σ(x_i - μ_B)²

3. Нормализуем:
   x̂_i = (x_i - μ_B) / √(σ²_B + ε)

4. Масштабируем и сдвигаем (learnable параметры):
   y_i = γ * x̂_i + β

где:

  • ε (epsilon) — малая константа для стабильности (обычно 1e-5)
  • γ (gamma) — learnable scale параметр
  • β (beta) — learnable shift параметр

Пример на Python

import numpy as np

def batch_normalization(x, gamma=None, beta=None, eps=1e-5):
    """Batch Normalization вперёд"""
    # x shape: (batch_size, features)
    batch_size = x.shape[0]
    
    # 1. Вычисляем статистику по batch
    mean = np.mean(x, axis=0)  # (features,)
    var = np.var(x, axis=0)    # (features,)
    
    # 2. Нормализуем
    x_normalized = (x - mean) / np.sqrt(var + eps)
    
    # 3. Масштабируем и сдвигаем
    if gamma is None:
        gamma = np.ones(x.shape[1])
    if beta is None:
        beta = np.zeros(x.shape[1])
    
    y = gamma * x_normalized + beta
    
    return y, mean, var, x_normalized

Running Mean и Variance (для инференса)

Делаю инференс (тестирование), не используем batch статистику, а используем running статистику:

class BatchNormLayer:
    def __init__(self, features, momentum=0.9, eps=1e-5):
        self.gamma = np.ones(features)
        self.beta = np.zeros(features)
        self.eps = eps
        self.momentum = momentum
        
        # Running statistics для инференса
        self.running_mean = np.zeros(features)
        self.running_var = np.ones(features)
    
    def forward_train(self, x):
        """Training режим — используем batch статистику"""
        batch_mean = np.mean(x, axis=0)
        batch_var = np.var(x, axis=0)
        
        # Обновляем running statistics (Exponential Moving Average)
        self.running_mean = (self.momentum * self.running_mean + 
                            (1 - self.momentum) * batch_mean)
        self.running_var = (self.momentum * self.running_var + 
                           (1 - self.momentum) * batch_var)
        
        # Нормализуем
        x_norm = (x - batch_mean) / np.sqrt(batch_var + self.eps)
        return self.gamma * x_norm + self.beta
    
    def forward_test(self, x):
        """Test режим — используем running статистику"""
        x_norm = (x - self.running_mean) / np.sqrt(self.running_var + self.eps)
        return self.gamma * x_norm + self.beta

Ключевые преимущества

  • Стабильность обучения: меньше зависимость от инициализации весов
  • Более высокие learning rates: можно использовать больший шаг обучения
  • Регуляризация: имеет эффект, похожий на dropout (снижает переобучение)
  • Ускорение: сокращает внутреннее ковариативное смещение

Важные особенности

  1. Разные поведения: во время обучения используется batch статистика, во время инференса — running статистика
  2. Параметры: γ и β обучаются с помощью обратного распространения
  3. Масштаб batch: эффективность зависит от размера батча (small batch размеры могут привести к нестабильности)
  4. Layer Normalization альтернатива: для RNN часто используется Layer Norm вместо Batch Norm

Batch Normalization стала одной из самых важных техник в глубоком обучении, значительно упрощая тренировку глубоких сетей.

Как рассчитывается Batch Normalization? | PrepBro