← Назад к вопросам
Как рассчитывается 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 (снижает переобучение)
- Ускорение: сокращает внутреннее ковариативное смещение
Важные особенности
- Разные поведения: во время обучения используется batch статистика, во время инференса — running статистика
- Параметры: γ и β обучаются с помощью обратного распространения
- Масштаб batch: эффективность зависит от размера батча (small batch размеры могут привести к нестабильности)
- Layer Normalization альтернатива: для RNN часто используется Layer Norm вместо Batch Norm
Batch Normalization стала одной из самых важных техник в глубоком обучении, значительно упрощая тренировку глубоких сетей.