Normalizacja wsadowa

Technika stabilizująca i przyspieszająca trening sieci przez normalizowanie wyjść warstw w obrębie mini-partii danych.

Normalizacja wsadowa (ang. Batch Normalization, w skrócie BatchNorm albo BN) to technika, która w trakcie treningu sieci neuronowej normalizuje aktywacje (wyjścia warstw) w obrębie mini-partii danych — tak, żeby w przybliżeniu miały średnią 0 i wariancję 1, a potem przeskalowuje je dwoma uczonymi parametrami. Brzmi jak kosmetyka, a w praktyce potrafi zamienić trening, który nie chce ruszyć, w taki, który zbiega się szybko i stabilnie. Pomysł opisali Sergey Ioffe i Christian Szegedy z Google w 2015 roku i od tej pory BatchNorm jest na stałe w standardowym zestawie narzędzi sieci głębokich.

Jak to działa i po co

Problem, który BN rozwiązuje, autorzy nazwali internal covariate shift: w miarę jak zmieniają się wagi wcześniejszych warstw, rozkład danych wchodzących do kolejnych warstw cały czas się przesuwa, więc każda warstwa goni ruchomy cel. BatchNorm stabilizuje ten rozkład. Dla danej mini-partii liczy średnią i wariancję każdej cechy, normalizuje wartości, a potem stosuje dwa uczone parametry: gamma (skala) i beta (przesunięcie). Dzięki temu sieć może, jeśli chce, „odkręcić” normalizację — nie tracisz zdolności wyrażania dowolnego rozkładu.

Efekt praktyczny: możesz używać wyższego learning rate, sieć jest mniej wrażliwa na inicjalizację wag, a sam proces działa też lekko regularyzująco (bo statystyki partii wnoszą trochę szumu). Uwaga na tryby: w czasie treningu BN korzysta ze statystyk bieżącej partii, ale w czasie inferencji używa uśrednionych statystyk z całego treningu (running mean i running variance).

Przykład z praktyki

W PyTorchu wrzucasz to jedną linijką między warstwę a aktywację: nn.BatchNorm2d(64) po warstwie konwolucyjnej o 64 kanałach, albo nn.BatchNorm1d(128) po warstwie liniowej. Typowy blok to Conv2d -> BatchNorm2d -> ReLU. Kluczowy szczegół: model.train() i model.eval() przełączają, czy BN liczy statystyki z partii, czy używa tych zapamiętanych. Zapomnisz o model.eval() przy testowaniu i nagle wyniki skaczą bez sensu.

Częste błędy i mity

  • Małe partie = kłopot. Przy batch_size rzędu 1-2 statystyki partii są szumowe i BN potrafi zaszkodzić. Wtedy sięgnij po GroupNorm albo LayerNorm.
  • BN + Dropout w jednej warstwie bywa kapryśne — kolejność i interakcja statystyk potrafią pogorszyć wynik.
  • Zapomniany tryb eval to klasyk: model „działa” na treningu, a na produkcji daje losowe wyniki.
  • Mit, że BN całkowicie usuwa covariate shift — późniejsze badania pokazują, że realny zysk bierze się raczej z wygładzenia krajobrazu funkcji straty niż z samego przesunięcia rozkładów.

Pojęcia powiązane: Layer Normalization, Group Normalization, internal covariate shift, gradient descent, learning rate, regularyzacja, dropout, inicjalizacja wag.