ML Atlas

06 · Sieci · 4 min czytania · Interaktywne · aktualizacja

Co to jest dying ReLU i nasycenie sigmoidu i jak im zapobiec?

W skrócie

Neuron nasycony (sigmoid lub tanh na skraju) albo martwy (ReLU zawsze poniżej zera) ma gradient bliski zeru, więc przestaje się uczyć, choć zajmuje miejsce.

Co to jest

Martwy neuron i neuron nasycony to dwa pokrewne stany, w których gradient przestaje docierać do neuronu. Nasycenie (saturation): sigmoid lub tanh dostaje bardzo dużą co do modułu sumę ważoną i pracuje na płaskim odcinku, gdzie pochodna jest praktycznie zerem. Martwy ReLU (dying ReLU): suma ważona jest ujemna dla każdego przykładu, więc wyjście i pochodna wynoszą dokładnie 0.

W obu przypadkach neuron nie uczy się, choć nadal liczy się do rozmiaru sieci i kosztu obliczeń. Problem dotyczy warstw ukrytych każdej sieci neuronowej.

Intuicja: neuron ReLU to drzwi otwierane tylko w jedną stronę. Jeśli wagi ustawią się tak, że dla każdego przykładu drzwi są zamknięte, przez nie nie przejdzie ani sygnał w przód, ani informacja zwrotna o błędzie — więc nikt ich już nie otworzy.

Mechanizm — dlaczego tak działa

Gradient wag neuronu to gradient z góry pomnożony przez pochodną aktywacji w punkcie, w którym neuron pracuje. Dla sigmoidu σ'(z) = σ(z)(1 − σ(z)): najwyżej 0,25 w zerze, a dla |z| > 5 poniżej 0,007. Neuron, którego suma ważona dla wszystkich wejść leży poza przedziałem ±5, dostaje gradient kilkadziesiąt razy mniejszy niż sąsiedzi i w praktyce zamiera. Tanh ma pochodną 1 w zerze, ale też nasyca się dla |z| > 3.

ReLU ma pochodną 1 po prawej i 0 po lewej stronie zera. Jeśli wagi i bias ustawią się tak, że z < 0 dla każdego przykładu w danych, neuron wypuszcza 0 i dostaje gradient 0 — a bez gradientu jego wagi nie zmienią się już nigdy. To stan trwały, nie przejściowy: neuron jest martwy do końca treningu.

Przyczyny są trzy. Za duży learning rate: jeden duży krok wyrzuca bias głęboko na minus lub wagi daleko w nasycenie. Zła skala inicjalizacji: za duże wagi startowe dają od razu duże sumy ważone (Glorot i Bengio 2010 pokazali nasycanie się górnych warstw sigmoidowych już na starcie). Brak normalizacji wejść: cechy o dużych wartościach dają duże sumy. Lu i in. (2019) pokazali, że prawdopodobieństwo śmierci neuronów ReLU rośnie z głębokością sieci.

Lekarstwa: Leaky ReLU (nachylenie 0,01 po lewej, więc gradient nigdy nie jest dokładnie zerem), ELU, GELU, inicjalizacja He, batch normalization, mniejszy learning rate, standaryzacja wejść. Zastrzeżenie: odrobina nasycenia na wyjściu jest pożądana (pewne decyzje); problemem jest nasycenie w warstwach ukrytych, bo blokuje gradient płynący w głąb sieci.

Na przykładzie

Na Digits 8×8 (1347 obrazów treningowych, 450 testowych, piksele podzielone przez 16, random_state=0) trenowałem MLPClassifier ze 100 neuronami ReLU przez 50 epok i liczyłem neurony, które dla wszystkich 450 obrazów testowych dają dokładnie 0. Przy Adamie z lr = 0,001 martwych było 9%, przy 0,01 — 21%, przy 0,1 — 77%, przy 0,3 — 95%. Trafność testowa spadła przy tym z 96–98% do 87,8%: sieć z pięcioma żywymi neuronami wciąż coś umie, ale jest wielokrotnie mniejsza, niż się wydaje.

Brak skalowania wejść działa tak samo. Na surowych pikselach (wartości 0–16) przy lr = 0,01 martwych było 44% neuronów, a przy lr = 0,1 — 98%, z trafnością testową 40,2%. Po podzieleniu przez 16 ten sam lr = 0,1 dawał 77% martwych i 97,1% trafności.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: pięć funkcji aktywacji (sigmoida, tanh, ReLU, Leaky ReLU, GELU) i ich pochodne — pochodna sigmoidy nie przekracza 0,25 — oraz ta sama sieć 2 → 8 → 2 uczona z każdą z nich na dwóch księżycach: po 1000 epokach ReLU ma stratę 0,052, a sigmoida 0,269.

Dane: Digits (ręcznie pisane cyfry 8×8)

W praktyce

  • Mierz udział martwych neuronów: odsetek jednostek ReLU, które dla całego batcha walidacyjnego dają 0 (albo |tanh| > 0,99). Kilka procent to norma; 30–50% to problem.
  • PyTorch: nn.LeakyReLU(0.01), nn.GELU, nn.init.kaiming_normal_, nn.BatchNorm1d; hooki na aktywacje do monitoringu.
  • scikit-learn MLPClassifier ma tylko relu, tanh, logistic i identity — przy martwych neuronach zmniejsz learning_rate_init, wystandaryzuj wejścia lub użyj tanh.
  • Leaky ReLU nie umiera, ale nie ma sufitu — przy za dużym learning rate wagi mogą wybuchnąć zamiast zamrzeć.
  • Typowy błąd: ReLU plus learning rate 0,1 bez normalizacji — po kilku krokach większość sieci jest martwa, a strata „stoi”.

Najczęstsze pytania

Co to jest dying ReLU i jak temu zapobiec?
Neuron ReLU, którego suma ważona jest ujemna dla wszystkich przykładów, daje zawsze 0 i ma gradient 0 — nie nauczy się już niczego. Zapobiegają: mniejszy learning rate, inicjalizacja He, batch norm, standaryzacja wejść albo Leaky ReLU i GELU, które mają niezerową pochodną po lewej.
Dlaczego sigmoid powoduje zanikanie gradientu?
Pochodna sigmoidu wynosi najwyżej 0,25, a na skrajach praktycznie 0. Gradient mnoży się przez tę pochodną na każdej warstwie, więc po kilku warstwach jest tysiące razy mniejszy. Dodatkowo duże wejścia wpychają neuron na płaski odcinek, gdzie w ogóle nie dostaje sygnału.
Jak sprawdzić, czy neurony w sieci są martwe?
Przepuść zbiór walidacyjny przez sieć i dla każdego neuronu ukrytego policz, w jakim odsetku przykładów daje dokładnie 0 (ReLU) lub wartość bliską ±1 (tanh, sigmoid). Neuron ze 100% jest martwy; kilkadziesiąt procent martwych w warstwie oznacza za duży learning rate lub złą inicjalizację.

Źródła

  • Glorot, X., Bengio, Y. (2010). "Understanding the difficulty of training deep feedforward neural networks". AISTATS, PMLR 9, 249–256.
  • Lu, L., Shin, Y., Su, Y., Karniadakis, G. (2019). "Dying ReLU and initialization: theory and numerical examples". arXiv:1903.06733
  • Maas, A., Hannun, A., Ng, A. (2013). "Rectifier nonlinearities improve neural network acoustic models". ICML Workshop on Deep Learning for Audio.
  • Goodfellow, Bengio, Courville (2016). Deep Learning, rozdz. 6.3.1 "Rectified linear units and their generalizations", 6.3.2 "Logistic sigmoid and hyperbolic tangent". https://www.deeplearningbook.org/contents/mlp.html
  • Géron, A. (2022). Hands-On Machine Learning, 3rd ed., rozdz. 11 "The vanishing/exploding gradients problems".

Zobacz też