Co się psuje: zanikający gradient, przeuczenie, regularyzacja
🎯 Po co Ci to?
Po 1986 roku wydawało się, że sprawa jest zamknięta: mamy metodę trenowania sieci o dowolnej liczbie warstw, wystarczy dodawać warstwy i dane. Minęło jednak ponad dwadzieścia lat, zanim ktokolwiek wytrenował sieć naprawdę głęboką. Powód nie był ani filozoficzny, ani sprzętowy — był matematyczny i bardzo konkretny: sygnał błędu wracający przez wiele warstw po drodze wygasa. Ta jednostka jest o trzech rzeczach, które psują trening (zanikanie gradientu, jego eksplozja, przeuczenie), i o narzędziach, którymi się z nimi walczy. Bez niej historia z Działu 13 — dlaczego przełom nastąpił dopiero w 2012 roku — pozostałaby niezrozumiała.
✅ Czego się nauczysz
Po tej lekcji potrafisz:
- wyjaśnić mechanizm zanikającego gradientu i wskazać, kto go opisał;
- wyjaśnić zjawisko odwrotne — eksplodujący gradient — i podać na nie proste lekarstwo;
- wymienić trzy sposoby, którymi udało się zanikanie gradientu obejść;
- rozpoznać przeuczenie z pary krzywych straty i wskazać, w którym punkcie przerwać trening;
- opisać cztery techniki regularyzacji: karę za duże wagi, porzucanie neuronów, augmentację danych i wczesne zatrzymanie;
- odróżnić problem „czego sieć nie potrafi obliczyć" od problemu „jak ją wytrenować".
🔁 Przypomnij sobie
Z Jednostki 11.3 wiesz, że propagacja wsteczna przekazuje błąd wstecz warstwa po warstwie, a na każdym kroku mnoży go przez lokalny wpływ danego ogniwa. Zapamiętaj to słowo: mnoży. Z Jednostki 10.2 pamiętasz, że sigmoida ma wykres niemal płaski dla wejść bardzo dużych i bardzo małych — a „płaski" znaczy „pochodna prawie zero". Z Jednostki 9.3 masz przeuczenie i wczesne zatrzymanie. Te trzy rzeczy złożą się tutaj w jedną całość.
📘 Zanikający gradient
Sieci rekurencyjne (Jednostka 15.3) przetwarzają dane krok po kroku, przekazując same sobie „pamięć" poprzednich kroków — a to znaczy, że sygnał błędu musi wracać przez bardzo długi łańcuch. Podobnie w sieci po prostu głębokiej, o wielu warstwach. I właśnie tam, w 1991 roku, niemiecki badacz Sepp Hochreiter opisał problem, który na dwie dekady zablokował głębokość sieci.
Mechanizm jest prosty i nieuchronny. Przy każdym kroku wstecz sygnał błędu jest mnożony przez pewną liczbę — pochodną funkcji aktywacji w tym miejscu. Dla sigmoidy ta liczba jest zawsze mniejsza od 1 (co najwyżej 0,25), a zwykle znacznie mniejsza. Pomnóż wiele takich liczb przez siebie i wynik szybko staje się prawie zerem. Sygnał błędu dociera do najwcześniejszych warstw tak osłabiony, że nie niesie już żadnej użytecznej informacji: te warstwy w praktyce przestają się uczyć. Sieć ma dwadzieścia warstw, ale trenuje się w niej realnie kilka ostatnich.
💭 Pomyśl: Wyobraź sobie grę w głuchy telefon, w której wiadomość przechodzi przez dwadzieścia osób z rzędu, a każda osoba — nawet starając się jak najdokładniej — nieznacznie ją zniekształca. Co dzieje się z pierwotną wiadomością po przejściu przez wszystkie dwadzieścia osób? Jak to się ma do sygnału błędu „cofającego się" przez wiele warstw sieci?
Sprawdź odpowiedź
Nawet jeśli każde pojedyncze zniekształcenie jest niewielkie, po dwudziestu kolejnych powtórzeniach pierwotna wiadomość zwykle staje się nierozpoznawalna — drobne błędy kumulują się (a właściwie mnożą) na każdym kolejnym etapie. Dokładnie ten sam mechanizm dotyczy sygnału błędu w propagacji wstecznej: przy każdym kroku wstecz przez kolejną warstwę (albo krok czasowy w sekwencji) sygnał jest mnożony przez małą liczbę, więc po wielu takich krokach staje się praktycznie zerowy — „zanika", zanim dotrze do najwcześniejszych wag, które w efekcie w ogóle przestają się skutecznie uczyć.
Metafora ma jedno ograniczenie, o którym warto wiedzieć: w głuchym telefonie wiadomość się przekręca, a w sieci cichnie. Nie jest tak, że pierwsze warstwy dostają błędną instrukcję — one nie dostają żadnej.
📐 DEFINICJA — problem zanikającego gradientu: zjawisko, w którym sygnał błędu przekazywany przez propagację wsteczną słabnie wykładniczo w miarę przechodzenia przez kolejne warstwy (lub kroki czasowe sekwencji), sprawiając, że najwcześniejsze warstwy (lub najdawniejsze elementy sekwencji) praktycznie przestają się uczyć. Opisany przez Seppa Hochreitera (1991).
Po ludzku: im dłuższa „droga" musi przebyć sygnał błędu wstecz przez sieć, tym bardziej „cichnie" po drodze — jak wiadomość w głuchym telefonie.
📘 Eksplodujący gradient — ten sam mechanizm w drugą stronę
Jeśli liczby, przez które mnożymy sygnał wstecz, są konsekwentnie większe od 1, dzieje się rzecz odwrotna: gradient rośnie wykładniczo. Do pierwszych warstw dociera wskazówka „zmień tę wagę o milion", trening wykonuje gigantyczny krok i rozsypuje się dokładnie tak, jak przy zbyt dużym kroku uczenia z Jednostki 11.4 — ze NaN w miejscu straty.
Lekarstwo jest tu na szczęście prymitywne i skuteczne: obcinanie gradientów (ang. gradient clipping). Przed wykonaniem korekty sprawdzamy długość wektora gradientu i jeśli przekracza ustalony próg, skracamy go do tego progu, zachowując kierunek. Kierunek zmiany zostaje, nadmierna wielkość — nie. Przy sieciach rekurencyjnych obcinanie było przez lata standardem.
📘 Trzy sposoby, którymi obeszło się zanikanie
Zanikającego gradientu nie da się „usunąć" — to nie błąd, a właściwość mnożenia. Można natomiast zadbać, żeby liczby, przez które mnożymy, nie były systematycznie małe. Trzy pomysły okazały się przełomowe.
1. Inna funkcja aktywacji. Sigmoida wygasza sygnał przez swoje płaskie ogony; ReLU (Jednostka 10.2) dla wejść dodatnich ma pochodną dokładnie 1 — mnożenie przez 1, ile razy chcesz, nic nie psuje. To główny powód, dla którego ReLU wygrała z sigmoidą około 2011 roku i dlaczego jej upowszechnienie było jednym z warunków przełomu z 2012 roku (Jednostka 13.2). Cena: dla wejść ujemnych pochodna ReLU to zero, więc neuron może „umrzeć" na stałe — stąd późniejsze warianty przepuszczające trochę sygnału i po ujemnej stronie.
2. Rozsądna inicjalizacja i normalizacja w środku sieci. Skoro wszystko zależy od skali sygnałów, warto ją kontrolować: wagi startowe losuje się z rozkładu dopasowanego do liczby wejść neuronu (a nie „byle małe"), a między warstwami wstawia się normalizację wsadową (ang. batch normalization, 2015) — przeskalowanie sygnałów w obrębie wsadu do wspólnej skali. Efekt: sygnał ani nie gaśnie, ani nie rośnie lawinowo w miarę przechodzenia przez warstwy, a trening znosi większy krok uczenia.
3. Skróty przez warstwy. Najprostszy i najskuteczniejszy pomysł: obok zwykłej drogi przez warstwę prowadzi się połączenie pomijające ją w całości, a wyniki obu dróg sumuje. Dzięki temu gradient ma „autostradę" wstecz, na której nie jest mnożony przez pochodne kolejnych warstw. Architektury z takimi połączeniami (ResNet, 2015) pozwoliły trenować sieci o setkach warstw; ten sam pomysł siedzi też w każdym transformatorze (Dział 16).
Dla danych sekwencyjnych osobnym rozwiązaniem tego samego problemu okazała się architektura LSTM (Hochreiter i Schmidhuber, 1997), która wprowadza „bramki" decydujące, co zachować w pamięci, a co odrzucić — dzięki temu ważna informacja i sygnał błędu przetrwają znacznie więcej kroków. Rozbierzemy ją w Jednostce 15.4.
📘 Przeuczenie: choroba drugiego rodzaju
Zanikanie gradientu to problem „model nie chce się nauczyć". Przeuczenie jest odwrotnością: model uczy się zbyt dobrze, tylko nie tego, co trzeba. Zapamiętuje konkretne przykłady treningowe razem z ich przypadkowymi szczegółami, zamiast uchwycić regułę.
Rozpoznaje się je z pary krzywych, dokładnie tak, jak w Jednostce 9.3. Krzywa straty treningowej spada monotonicznie — i będzie spadać niemal do zera, jeśli model ma dość parametrów. Krzywa straty walidacyjnej spada tylko do pewnego momentu, a potem zaczyna rosnąć. Ten punkt zwrotny to najlepszy model, jaki w tym treningu powstał; wszystko po nim to już zapamiętywanie szczegółów.
Zbiór narzędzi, które temu przeciwdziałają, nazywa się regularyzacją. Cztery z nich warto znać.
Kara za duże wagi (regularyzacja L2, w praktyce zwana weight decay). Do funkcji straty dodaje się składnik proporcjonalny do sumy kwadratów wag. Od tej chwili model minimalizuje nie tylko błąd, ale też własną złożoność — duże wagi trzeba „opłacić" wzrostem straty, więc pojawiają się tylko wtedy, gdy naprawdę poprawiają predykcje. Efekt: model wybiera rozwiązania gładsze, mniej dopasowane do pojedynczych punktów.
Porzucanie neuronów (ang. dropout, Hinton i współpracownicy, 2012). W każdej korekcie losowo wyłącza się pewien procent neuronów (typowo 20–50%) — sieć musi poradzić sobie bez nich. Konsekwencja jest głębsza, niż się wydaje: model nie może polegać na jednym „ekspercie", bo w każdej iteracji część ekspertów jest nieobecna, więc informacja rozkłada się nadmiarowo na wiele neuronów. W praktyce działa to jak uczenie wielu lekko różnych sieci naraz i uśrednianie ich decyzji. Podczas używania modelu porzucania się nie stosuje — wszystkie neurony pracują.
Augmentacja danych. Skoro przeuczenie wynika z niedostatku przykładów, sztucznie się je mnoży: zdjęcie obraca się o kilka stopni, przycina, odbija, rozjaśnia. Model widzi wtedy „to samo, ale inaczej" i uczy się cechy zamiast konkretnego układu pikseli. Augmentacja jest zwykle najtańszym i najskuteczniejszym z narzędzi — ale wymaga zdrowego rozsądku: odbicie lustrzane zdjęcia kota daje kota, natomiast odbicie zdjęcia znaku drogowego z napisem albo litery „b" daje coś, czego w rzeczywistości nie ma.
Wczesne zatrzymanie (Jednostka 9.3). Najprostsze i najtańsze: przerwać trening w punkcie, w którym strata walidacyjna przestała spadać. Nic nie trzeba dokładać do modelu — wystarczy patrzeć na właściwą krzywą.
📐 DEFINICJA — regularyzacja: dowolna technika ograniczająca dopasowanie modelu do przypadkowych szczegółów danych treningowych, kosztem nieznacznie gorszego wyniku na treningu, ale lepszego na danych nowych. Najczęstsze: kara za duże wagi, porzucanie neuronów, augmentacja danych, wczesne zatrzymanie.
Po ludzku: celowe utrudnianie modelowi zapamiętywania, żeby musiał szukać reguły.
⚠️ Uwaga, pułapka
Nie myl problemu zanikającego gradientu z ograniczeniem separowalności liniowej Perceptronu (Jednostka 8.4) — to dwa zupełnie różne problemy matematyczne, z różnych epok. Ograniczenie Perceptronu dotyczyło tego, jakiego rodzaju funkcje w ogóle da się obliczyć jedną warstwą neuronów — i było rozwiązywalne przez samo dodanie kolejnych warstw. Zanikający gradient dotyczy czegoś innego: jak skutecznie wytrenować sieć, która już ma wystarczająco dużo warstw. Problem nie w tym, co sieć teoretycznie potrafi obliczyć, lecz w tym, czy algorytm uczenia potrafi ją do tego doprowadzić w praktyce. Pierwsze pytanie należy do teorii obliczalności, drugie — do inżynierii i numeryki.
Druga pułapka, dotycząca regularyzacji: nie zastępuje ona danych. Porzucanie neuronów i kara za duże wagi zmniejszają przeuczenie przy danym zbiorze, ale model wytrenowany na 200 zdjęciach z jednego szpitala nie stanie się przez żadną regularyzację modelem ogólnym. Dlatego przy diagnozie „przeuczenie" pierwszym pytaniem nie jest „jaką regularyzację dodać", ale „czy mogę zdobyć więcej i bardziej różnorodnych danych".
🌍 Powiązania
Ta jednostka domyka wątek, który biegnie przez cały dział: co się dzieje, gdy piękny mechanizm z Jednostek 11.1–11.3 spotyka się z rzeczywistością liczb zmiennoprzecinkowych i skończonych zbiorów danych. Wyjaśnia też, dlaczego przełom nie mógł nastąpić w 1986 roku: brakowało ReLU, normalizacji, połączeń pomijających, kart graficznych (Jednostka 13.1) i milionów opisanych zdjęć. Dopiero wszystkie te rzeczy razem dały AlexNet (Jednostka 13.2). Dla danych sekwencyjnych ten sam problem doprowadził do LSTM (15.4), a potem — gdy okazało się, że nawet LSTM nie wystarcza dla długiego tekstu — do transformatora (16.1).
📐 Definicje tej lekcji
- Problem zanikającego gradientu — wykładnicze słabnięcie sygnału błędu w miarę cofania się przez kolejne warstwy lub kroki sekwencji (Hochreiter, 1991).
- Eksplodujący gradient — zjawisko odwrotne: wykładniczy wzrost sygnału błędu, rozsypujący trening.
- Obcinanie gradientów (gradient clipping) — skrócenie zbyt długiego wektora gradientu do ustalonego progu z zachowaniem kierunku.
- Normalizacja wsadowa (batch normalization) — przeskalowanie sygnałów w obrębie wsadu do wspólnej skali, stabilizujące trening (2015).
- Połączenie pomijające (rezydualne) — droga omijająca warstwę, dająca gradientowi „autostradę" wstecz (ResNet, 2015).
- Regularyzacja — techniki ograniczające dopasowanie do szczegółów danych treningowych.
- Kara za duże wagi (L2, weight decay) — składnik straty proporcjonalny do sumy kwadratów wag.
- Porzucanie neuronów (dropout) — losowe wyłączanie części neuronów w każdej korekcie (Hinton i in., 2012).
- Augmentacja danych — sztuczne mnożenie przykładów przez przekształcenia zachowujące etykietę.
📌 Najważniejsze w pigułce
- Propagacja wsteczna mnoży sygnał błędu na każdym kroku wstecz — stąd oba problemy tego działu.
- Zanikający gradient (Hochreiter, 1991): mnożenie przez liczby < 1 sprawia, że pierwsze warstwy nie dostają sygnału uczącego i przestają się uczyć.
- Eksplodujący gradient: mnożenie przez liczby > 1 rozsypuje trening; lekarstwem jest obcinanie gradientów.
- Zanikanie obeszły trzy rzeczy: ReLU (pochodna 1), normalizacja i sensowna inicjalizacja, połączenia pomijające. Dla sekwencji — LSTM (15.4).
- Przeuczenie to choroba przeciwna: model zapamiętuje zamiast generalizować. Rozpoznaje się je z rozjazdu krzywej treningowej i walidacyjnej.
- Cztery narzędzia regularyzacji: kara za duże wagi, porzucanie neuronów, augmentacja, wczesne zatrzymanie.
- Regularyzacja nie zastępuje danych — pierwszym lekarstwem na przeuczenie są liczniejsze i bardziej różnorodne przykłady.
- „Czego sieć nie potrafi obliczyć" (8.4) i „jak ją wytrenować" (ten dział) to dwa osobne problemy — mieszanie ich zaciemnia całą historię sieci neuronowych.
🎒 Zadania
Zadanie 11.5.1. Sygnał błędu przy każdym kroku wstecz jest mnożony przez 0,5. Oblicz w przybliżeniu, jaka część pierwotnego sygnału pozostanie po dziesięciu takich krokach, a jaka po trzydziestu. Następnie policz to samo dla mnożnika 1,5 i wyjaśnij, dlaczego oba wyniki opisują ten sam mechanizm.
Pokaż rozwiązanie
Dla 0,5: po dziesięciu krokach 0,5¹⁰ ≈ 0,001, czyli około 0,1% pierwotnego sygnału; po trzydziestu 0,5³⁰ ≈ 0,000000001 — praktycznie nic. Dla 1,5: 1,5¹⁰ ≈ 58, a 1,5³⁰ ≈ 192 000, czyli sygnał prawie dwustutysięczokrotnie silniejszy niż na wyjściu.
Oba wyniki to ten sam mechanizm: mnożenie powtórzone wiele razy działa wykładniczo. Nie ma tu bezpiecznej strefy „prawie 1" — wystarczy stałe odchylenie w jedną albo drugą stronę, a po dwudziestu, trzydziestu krokach sygnał albo znika, albo eksploduje. Dokładnie dlatego stabilny trening głębokich sieci wymaga aktywnego dbania o to, by mnożniki trzymały się blisko 1 (ReLU z pochodną 1, normalizacja, połączenia pomijające), a nie „dobrej wartości początkowej".
Zadanie 11.5.2. Model rozpoznający zmiany skórne osiąga po 40 epokach: strata treningowa 0,02, trafność treningowa 99,8%; strata walidacyjna 0,74, trafność walidacyjna 71%. Zdiagnozuj sytuację i zaproponuj cztery różne działania, uporządkowane od najbardziej do najmniej obiecującego. Uzasadnij kolejność.
Pokaż rozwiązanie
Diagnoza: podręcznikowe przeuczenie — ogromny rozjazd między treningiem (99,8%) a walidacją (71%) znaczy, że model zapamiętał konkretne zdjęcia, a nie cechy zmiany skórnej.
Kolejność działań (uzasadniona tym, że wcześniejsze punkty atakują przyczynę, a późniejsze tylko objaw):
- Sprawdzić dane, zanim cokolwiek zmienisz w modelu. Czy zdjęcia tego samego pacjenta nie trafiły do treningu i walidacji naraz (przeciek danych)? Czy etykiety są poprawne? Bez tego reszta pracy może być bezcelowa.
- Zdobyć więcej i bardziej różnorodnych danych — z różnych aparatów, oświetleń, odcieni skóry. To jedyne działanie, które faktycznie zwiększa wiedzę modelu, a nie tylko ogranicza jego zapamiętywanie.
- Augmentacja (obroty, przycięcia, zmiany jasności) — najtańszy substytut punktu 2, o ile przekształcenia zachowują sens medyczny zdjęcia.
- Regularyzacja i mniejszy model: dodać porzucanie neuronów i karę za duże wagi, ewentualnie zmniejszyć liczbę warstw; niezależnie od tego zastosować wczesne zatrzymanie, bo model najlepszy powstał zapewne kilkanaście epok przed czterdziestą.
Warto dodać, że przy 71% trafności na walidacji sam wynik nie mówi jeszcze wszystkiego — przy diagnostyce medycznej trzeba spojrzeć na czułość i precyzję osobno (Jednostka 9.4).
Zadanie 11.5.3. Wyjaśnij, dlaczego losowe wyłączanie połowy neuronów w trakcie treningu — działanie, które na pierwszy rzut oka po prostu psuje sieć — poprawia jej działanie na nowych danych. Odwołaj się do pojęcia nadmiarowości.
Pokaż rozwiązanie
Kiedy wszystkie neurony są zawsze dostępne, sieć może wykształcić „specjalistów jednego zadania": jeden neuron zapamiętuje szczegół obecny w kilku zdjęciach treningowych, a pozostałe uczą się mu bezwarunkowo ufać. Taka struktura znakomicie działa na treningu i zawodzi na nowych danych, bo zapamiętany szczegół tam nie występuje.
Porzucanie neuronów to uniemożliwia: w każdej korekcie losowa połowa neuronów jest nieobecna, więc żaden nie może być niezastąpiony i żaden nie może polegać na obecności konkretnego kolegi. Sieć jest zmuszona zapisać każdą ważną informację nadmiarowo, w kilku miejscach naraz i przez różne kombinacje neuronów — a nadmiarowa, rozproszona reprezentacja jest z natury odporniejsza na nowe, nieco inne dane.
Jest też drugie, równoważne wyjaśnienie: każda iteracja z inną losową połową neuronów to w praktyce trening innej, lekko okrojonej sieci. Model końcowy zachowuje się jak uśrednienie wielu takich sieci, a uśrednianie wielu niedoskonałych modeli od dawna wiadomo, że wypada lepiej niż jeden dopasowany do danych (dokładnie jak las losowy z Jednostki 9.5). Dlatego podczas używania modelu porzucania się nie stosuje — chcemy wtedy „całego zespołu" naraz.
🔍 Sprawdź, czy umiesz
- [ ] Wyjaśnić mechanizm zanikającego gradientu i wskazać, kto go opisał i kiedy.
- [ ] Wyjaśnić eksplodujący gradient i podać na niego lekarstwo.
- [ ] Wymienić trzy sposoby obejścia zanikania i powiedzieć, na czym każdy polega.
- [ ] Rozpoznać przeuczenie z pary krzywych straty i wskazać, gdzie przerwać trening.
- [ ] Opisać cztery techniki regularyzacji i wyjaśnić, dlaczego porzucanie neuronów działa.
- [ ] Odróżnić problem zanikającego gradientu od ograniczenia separowalności liniowej Perceptronu.