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.
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
MLPClassifierma tylkorelu,tanh,logisticiidentity— przy martwych neuronach zmniejszlearning_rate_init, wystandaryzuj wejścia lub użyjtanh. - 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".