06 · Sieci · 4 min czytania · Interaktywne · aktualizacja
Czym jest batch normalization i czym różni się od layer normalization?
W skrócie
Normalizacja wsadowa i warstwowa sprowadzają aktywacje neuronów do średniej 0 i wariancji 1, co stabilizuje i przyspiesza trening głębokich sieci.
Co to jest
Normalizacja wsadowa (ang. batch normalization, BatchNorm, BN) to warstwa sieci, która dla każdego neuronu osobno odejmuje średnią i dzieli przez odchylenie standardowe jego aktywacji, policzone na bieżącym mini-batchu, a potem przeskalowuje wynik dwoma uczonymi parametrami. Normalizacja warstwowa (layer normalization, LayerNorm, LN) robi to samo, ale statystyki liczy po wszystkich neuronach jednej warstwy dla jednego przykładu, niezależnie od reszty batcha. Obie techniki stabilizują i przyspieszają trening głębokich sieci.
Idea jest przedłużeniem standaryzacji cech. Wiadomo, że model uczy się łatwiej, gdy cechy wejściowe mają podobną skalę. W głębokiej sieci każda warstwa jest jednak „wejściem” dla następnej, a skala jej aktywacji zmienia się w trakcie treningu, bo zmieniają się wagi. Normalizacja przywraca porządek wewnątrz sieci, przed każdą kolejną warstwą.
BatchNorm (Ioffe i Szegedy, 2015) zrewolucjonizowała trening sieci konwolucyjnych. LayerNorm (Ba, Kiros i Hinton, 2016) stała się standardem w sieciach rekurencyjnych i transformerach, gdzie batch bywa mały, a sekwencje mają różne długości.
Mechanizm — dlaczego tak działa
Wzór jest ten sam dla obu: x̂ = (x − μ) / √(σ² + ε), a potem y = γ·x̂ + β. Parametry γ i β są uczone, więc sieć może przywrócić dowolną skalę i przesunięcie, jeśli się to opłaca, łącznie z cofnięciem normalizacji. Mała stała ε chroni przed dzieleniem przez zero. Różnica dotyczy tylko tego, skąd biorą się μ i σ: w BN z batcha dla każdego neuronu, w LN z neuronów dla każdego przykładu.
Autorzy BN uzasadniali ją redukcją „wewnętrznego przesunięcia rozkładu” (internal covariate shift): każda warstwa nie musi nadążać za zmieniającą się skalą wyjść poprzedniej. Późniejsze badania (Santurkar i in., 2018) podważyły to wyjaśnienie. Pokazały, że BN pomaga nawet wtedy, gdy celowo dodaje się szum zmieniający rozkład, i że jej główny efekt to wygładzenie krajobrazu straty: gradient zmienia się łagodniej, więc można stosować większy krok bez ryzyka rozbiegnięcia.
Drugi efekt to ochrona przed nasyceniem aktywacji. Sigmoida i tanh mają niemal zerową pochodną dla dużych wartości. Jeśli sumy ważone urosną, neurony się nasycają, a gradient zanika. Normalizacja utrzymuje sumy w okolicy zera, gdzie pochodna jest największa. Ponadto BN czyni sieć mniej wrażliwą na skalę wag i inicjalizację: przemnożenie wag warstwy przez stałą nie zmienia wyniku normalizacji.
BN ma kosztowne konsekwencje. Wynik dla jednego przykładu zależy od innych przykładów w batchu, co działa jak lekka regularyzacja, ale psuje się przy batchach rzędu kilku przykładów. W predykcji nie ma batcha, więc BN używa średniej i wariancji zebranych podczas treningu (średnie kroczące). Rozbieżność między trybem treningowym a ewaluacyjnym jest częstym źródłem błędów. LN tych problemów nie ma, bo każdy przykład normalizuje się sam, identycznie w treningu i w predykcji.
Wyjaśnienie, dlaczego normalizacja działa tak dobrze, wciąż nie jest kompletne. Pewne jest tylko to, że empirycznie pozwala trenować głębsze sieci z większym współczynnikiem uczenia.
Na przykładzie
Normalizacja wsadowa jednego neuronu, który dla batcha czterech przykładów dał aktywacje 2, 4, 6 i 8. Średnia wynosi 5, wariancja 5, odchylenie standardowe 2,236. Po normalizacji: −1,342; −0,447; 0,447; 1,342. Normalizacja warstwowa jednego przykładu, dla którego cztery neurony warstwy dały 1, 2, 3 i 10: średnia 4, wariancja 12,5, odchylenie 3,536, wynik −0,849; −0,566; −0,283; 1,697. W pierwszym przypadku porównujemy przykłady ze sobą, w drugim neurony ze sobą.
Na zbiorze Digits 8×8 (piksele podzielone przez 16) wytrenowano sieć z trzema warstwami ukrytymi po 64 neurony z sigmoidą, zwykłym SGD z krokiem 0,1, batch 32, przez 20 epok, z pięcioma ziarnami. Bez normalizacji wszystkie pięć sieci utknęło na poziomie zgadywania: 9,6–10,0% trafności testowej, strata treningowa 2,33. Z BatchNorm po każdej warstwie mediana trafności wyniosła 95,1% (jedna sieć skończyła na 73,3%, pozostałe 94,7–96,4%). Z LayerNorm mediana wyniosła 94,7%, przy rozrzucie 93,8–96,4%. Ta sama architektura, ten sam krok i ta sama liczba epok: różnica wynika wyłącznie z utrzymania aktywacji w rozsądnej skali.
Dane: Digits (ręcznie pisane cyfry 8×8)
W praktyce
- PyTorch:
nn.BatchNorm1d(64)dla warstw gęstych,nn.BatchNorm2d(c)dla konwolucji,nn.LayerNorm(64)dla transformerów i MLP; scikit-learn nie ma normalizacji wewnątrz sieci. - BatchNorm wymaga
model.train()w treningu imodel.eval()w predykcji; zapomnienie oeval()daje wyniki zależne od składu batcha. - Przy batchach mniejszych niż ok. 8–16 BatchNorm traci stabilność; wtedy wybierz LayerNorm lub GroupNorm.
- Warstwa liniowa przed BatchNorm nie potrzebuje wyrazu wolnego (
bias=False), bo i tak zostanie odjęty przez normalizację, a jego rolę przejmuje β. - W transformerach dominuje wariant pre-norm (normalizacja przed blokiem uwagi i MLP), który trenuje się stabilniej niż oryginalny post-norm; popularny jest też uproszczony RMSNorm.
Najczęstsze pytania
- Normalizacja przed czy po funkcji aktywacji?
- Oryginalna praca umieszczała BN przed aktywacją i to wciąż najczęstszy wybór. Wariant po aktywacji też działa i bywa nieco lepszy w niektórych zadaniach. Różnice są zwykle niewielkie, ważniejsza jest konsekwencja w całej sieci.
- Czy BatchNorm zastępuje dropout?
- Częściowo. Szum wynikający z losowego składu batcha działa jak regularyzacja, więc w sieciach konwolucyjnych z BN dropout bywa zbędny. Łączenie obu wymaga ostrożności, bo dropout zmienia statystyki, które BN zapamiętuje do predykcji.
- Dlaczego transformery używają LayerNorm, a nie BatchNorm?
- W modelach językowych batch zawiera sekwencje różnej długości, statystyki po batchu są mocno zaszumione, a generowanie odbywa się po jednym przykładzie. LayerNorm normalizuje każdy token niezależnie, więc działa identycznie w treningu i w generowaniu.
Źródła
- Ioffe S., Szegedy C., „Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”, ICML 2015.
- Ba J. L., Kiros J. R., Hinton G. E., „Layer Normalization”, arXiv:1607.06450, 2016.
- Santurkar S., Tsipras D., Ilyas A., Madry A., „How Does Batch Normalization Help Optimization?”, NeurIPS 2018.
- Goodfellow I., Bengio Y., Courville A., „Deep Learning”, MIT Press, 2016, podrozdz. 8.7.1 „Batch Normalization”.
- Dokumentacja PyTorch,
torch.nn.BatchNorm1d: https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm1d.html