# Эндрю Ын о Batch Norm: почему смещение «b» становится лишним?

Источник: https://www.youtube.com/watch?v=em6dfRxYkYU
Канал: DeepLearning.AI
Опубликовано: 25.08.2017

---

Внедрение пакетной нормализации (Batch Normalization, BN) в архитектуру глубоких нейронных сетей кардинально меняет процесс обучения, делая его более стабильным и быстрым. В данном материале на основе туториала от DeepLearning.AI разбирается механика интеграции BN между вычислительными этапами внутри слоя, а также объясняется, почему классический параметр смещения (bias) становится избыточным при использовании этой техники.

## 🏗️ Анатомия слоя: куда вставить Batch Norm
[[JUMP:0:00]]

Обычно работа скрытого узла нейронной сети представляется как двухэтапный процесс: сначала вычисляется линейное значение $Z$, а затем к нему применяется функция активации для получения значения $A$ [0:13]. В глубоких сетях эта последовательность повторяется от слоя к слою.

При внедрении Batch Normalization алгоритм претерпевает изменения:

*   **Линейный расчет:** Сначала вычисляется значение $Z$ на основе весов $W$ и входных данных $X$ [0:44].
*   **Этап нормализации:** Полученное значение $Z$ не передается сразу в функцию активации. Вместо этого применяется операция Batch Norm, регулируемая новыми параметрами — $\beta$ (бета) и $\gamma$ (гамма) [1:14].
*   **Результат:** На выходе получается нормализованное значение $\tilde{Z}$ (Z-тильда).
*   **Активация:** Именно $\tilde{Z}$, а не исходное $Z$, подается на вход функции активации (например, ReLU или сигмоиду) для получения $A$ [1:29].

Таким образом, пакетная нормализация происходит «между» вычислением линейной части и применением нелинейности [2:26]. Вместо ненормированных значений сеть оперирует средним и дисперсией, которые жестко контролируются алгоритмом.

## ⚙️ Параметры и путаница в терминологии
[[JUMP:2:52]]

Внедрение BN добавляет в нейронную сеть новые обучаемые параметры для каждого слоя: $\beta^{[l]}$ и $\gamma^{[l]}$. Важно не путать параметр $\beta$ из Batch Norm с гиперпараметром $\beta$, который используется в алгоритмах Momentum или Adam для расчета экспоненциально взвешенного среднего [3:19]. 

Эндрю Ын отмечает, что авторы оригинальных статей использовали одни и те же греческие буквы для разных сущностей:

*   Авторы Adam использовали $\beta$ для моментов.
*   Авторы Batch Norm использовали $\beta$ для обозначения сдвига (shift).

Несмотря на одинаковое название, это абсолютно разные величины, и в контексте пакетной нормализации $\beta$ — это обучаемый параметр, который обновляется с помощью градиентного спуска [3:45].

## ❌ Почему параметр b (bias) больше не нужен
[[JUMP:7:34]]

Одним из самых интересных последствий внедрения Batch Norm является исключение традиционного параметра смещения $b^{[l]}$ из расчетов. В классическом слое уравнение выглядит как $Z = WA + b$. Однако Batch Norm на первом этапе нормализации вычитает среднее значение из всех примеров в мини-батче [8:05].

Любая константа (которой и является $b$), добавленная к вектору $Z$, будет просто аннулирована при вычитании среднего [8:18]. Если вы добавите 100 к каждому значению, среднее тоже увеличится на 100, и после вычитания результат останется прежним. 

Следовательно:

1.  Параметр $b$ можно исключить или навсегда зафиксировать на нуле [8:45].
2.  Роль управления «сдвигом» (bias) полностью переходит к параметру $\beta^{[l]}$.
3.  Размерность параметров $\beta^{[l]}$ и $\gamma^{[l]}$ соответствует количеству скрытых юнитов в слое ($n^{[l]} \times 1$) [9:43].

## 📦 Работа с мини-батчами и программная реализация
[[JUMP:5:47]]

В реальных задачах Batch Norm применяется не ко всему тренировочному набору сразу, а к отдельным мини-батчам. Для каждого мини-батча $X^{\{t\}}$ вычисляются собственные среднее и дисперсия, на основе которых происходит масштабирование [6:14].

С точки зрения программирования, современные фреймворки значительно упрощают жизнь разработчикам:

*   В TensorFlow реализация пакетной нормализации может занимать всего одну строку кода (например, через функцию `tf.nn.batch_normalization`) [5:07].
*   Хотя понимать внутреннюю математику полезно для отладки, вручную реализовывать вычисление средних и дисперсий в современных средах разработки обычно не требуется [5:19].

## 🔄 Обновленный алгоритм обучения
[[JUMP:10:23]]

Полный цикл итерации mini-batch gradient descent с использованием Batch Norm выглядит следующим образом:

1.  **Forward Prop:** Для каждого слоя вычисляется $Z$, затем применяется Batch Norm для получения $\tilde{Z}$, и только потом — функция активации [10:38].
2.  **Backprop:** Вычисляются градиенты для весов $dW$, а также для новых параметров $d\beta$ и $d\gamma$. Градиент $db$ больше не вычисляется, так как $b$ исключен [11:13].
3.  **Параметры:** Обновление происходит привычным образом: 
    *   $\beta = \beta - \alpha \cdot d\beta$ 
    *   $\gamma = \gamma - \alpha \cdot d\gamma$ [11:42].

Этот процесс отлично сочетается не только с обычным градиентным спуском, но и с более продвинутыми оптимизаторами, такими как Momentum, RMSprop или Adam [11:55].