DL

Batch Normalization

Batch Normalization (BN) — это техника, используемая в глубоком обучении для ускорения и стабилизации обучения нейросетей. Она нормализует активации (значения нейронов) внутри каждого мини-пакета (batch), уменьшая внутреннее ковариационное смещение (internal covariate shift).

Основная идея

В ходе обучения нейросети параметры слоев постоянно меняются, и активации (выходы нейронов) могут принимать слишком большие или маленькие значения. Это приводит к замедлению обучения, поскольку оптимизатору становится сложнее подстраиваться под изменяющееся распределение данных.

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

Как работает Batch Normalization?

Допустим, у нас есть выходное значение нейрона перед активационной функцией:

 x = W \cdot input + b 

Нормализация входных данных:

Для каждого нейрона в мини-пакете вычисляются среднее значение и стандартное отклонение:

 mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i 
 sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2 

Где m — количество примеров в мини-пакете.

Стандартное нормирование:

Каждое значение hat{x}_i ​ нормализуется по формуле:

 hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} 

ϵ\epsilonϵ — маленькое число для предотвращения деления на ноль. Теперь все значения hat{x}_i имеют среднее 0 и дисперсию 1.

Масштабирование и сдвиг (trainable parameters):

Чтобы модель не теряла своей выразительности, вводятся параметры γ\gammaγ и β\betaβ:

 y_i = \gamma \hat{x}_i + \beta 

Где:

  • γ\gammaγ (scale) — параметр масштабирования
  • β\betaβ (shift) — параметр сдвига

Эти параметры позволяют модели восстанавливать нужное распределение признаков, если это необходимо.

Почему Batch Normalization работает?

Уменьшает внутреннее ковариационное смещение

Каждый слой получает входные данные с более стабильным распределением, что облегчает обучение.

Позволяет использовать более высокие скорости обучения

Так как нормализация делает веса более устойчивыми, можно использовать больший шаг обучения (learning rate), что ускоряет оптимизацию.

Добавляет небольшой регуляризационный эффект

Так как BN немного изменяет активации случайным образом (зависит от мини-батча), это похоже на Dropout и уменьшает переобучение.

Снижает зависимость от начальной инициализации весов

Модель менее чувствительна к начальному выбору весов, что делает обучение более стабильным.

Где применяется Batch Normalization?

До или после активационной функции?

  • Чаще всего BN вставляют перед активационной функцией (например, перед ReLU).
  • В некоторых случаях (например, для сигмоиды или гиперболического тангенса) BN может быть после активации.

В сверточных сетях

  • Применяют отдельно к каждому каналу (channel-wise).
  • Усреднение идет по всем пространственным позициям (HW-оси).

В рекуррентных сетях (RNN, LSTM)

  • Используется реже из-за зависимости от временных шагов.

Код на Python (PyTorch)

Пример нейросети с Batch Normalization:

import torch
import torch.nn as nn

# Определяем нейросеть с BatchNorm
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(10, 50)  # Полносвязный слой
        self.bn1 = nn.BatchNorm1d(50)  # Batch Normalization
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(50, 1)  # Выходной слой

    def forward(self, x):
        x = self.fc1(x)
        x = self.bn1(x)  # Применяем нормализацию
        x = self.relu(x)  # Активация
        x = self.fc2(x)
        return x

# Создаем модель и передаем случайные данные
model = SimpleNN()
x = torch.randn(32, 10)  # Мини-пакет из 32 примеров
output = model(x)
print(output.shape)

В этом коде BatchNorm1d(50) применяется к 50-мерному вектору, уменьшая переобучение и ускоряя обучение.

Итог

  • Batch Normalization помогает стабилизировать обучение нейросетей, ускоряет оптимизацию и уменьшает зависимость от начальных параметров.
  • Чаще всего BN добавляют перед активацией, а в сверточных слоях — отдельно для каждого канала.
  • В современных архитектурах BN используется почти во всех глубинных моделях, но для небольших сетей он не всегда нужен.

Вставить формулу как
Блок
Строка
Дополнительные настройки
Цвет формулы
Цвет текста
#333333
Используйте LaTeX для набора формулы
Предпросмотр
\({}\)
Формула не набрана
Вставить