06 · Sieci · 4 min czytania · Interaktywne · aktualizacja
Czym jest funkcja aktywacji i dlaczego ReLU wyparło sigmoid?
W skrócie
Funkcja aktywacji to nieliniowość nakładana na sumę ważoną neuronu. Bez niej sieć wielowarstwowa jest liniowa, a jej kształt decyduje o przepływie gradientu.
Co to jest
Funkcja aktywacji to nieliniowe przekształcenie nałożone na sumę ważoną neuronu, zanim wynik trafi do następnej warstwy. Najczęstsze to sigmoid (ściska do przedziału 0–1), tanh (od −1 do 1), ReLU (zero dla ujemnych, tożsamość dla dodatnich) i jej warianty: Leaky ReLU, ELU, GELU, SiLU.
Funkcja aktywacji występuje w każdej warstwie ukrytej sieci neuronowej; w transformerach i dużych modelach językowych standardem są GELU lub SwiGLU.
Intuicja: same warstwy liniowe to jak składanie kartki tylko wzdłuż prostych linii, które zaraz się rozprostowują — po dowolnej liczbie złożeń kartka jest znów płaska. Aktywacja to zagięcie, które zostaje. Dopiero z wielu takich zagięć da się ułożyć dowolny kształt.
Mechanizm — dlaczego tak działa
Pierwsza rola: nieliniowość. Złożenie warstw liniowych jest nadal liniowe, więc bez aktywacji sieć o dowolnej głębokości rysowałaby jedną hiperpłaszczyznę. Aktywacja „wygina” odpowiedź, co pozwala składać z neuronów krzywe i regiony. Sieć ReLU jest funkcją kawałkami liniową: każdy neuron dokłada jedno załamanie.
Druga rola, mniej oczywista: przepuszczanie gradientu. Backpropagation mnoży gradient przez pochodną aktywacji na każdej warstwie. Pochodna sigmoidu to σ(z)(1 − σ(z)), co najwyżej 0,25 (w zerze), a dla |z| > 5 praktycznie zero. Przy L warstwach sigmoidowych sam ten czynnik skaluje gradient najwyżej jak 0,25ᴸ — przy sześciu warstwach to co najmniej 4000 razy mniej. To zanikający gradient: wczesne warstwy prawie nie dostają sygnału i się nie uczą. Tanh ma pochodną do 1 w zerze, więc jest lepszy, ale też nasyca się na skrajach.
ReLU ma pochodną dokładnie 1 dla dodatnich wejść, więc nie tłumi gradientu w aktywnych neuronach; jest też tania obliczeniowo i daje rzadkie aktywacje. Cena: dla ujemnych wejść pochodna wynosi 0, więc neuron, który dla wszystkich przykładów ma ujemną sumę, przestaje się uczyć na stałe (dying ReLU). Leaky ReLU daje małe nachylenie (zwykle 0,01) po lewej, by to złagodzić; GELU i SiLU są gładkimi wersjami.
Zastrzeżenie: gradient mnoży się też przez wagi, więc ReLU nie gwarantuje stabilności — potrzebna jest dopasowana inicjalizacja (He) i często normalizacja. Na wyjściu aktywacja zależy od zadania: sigmoid lub softmax dla prawdopodobieństw, brak aktywacji dla regresji.
Na przykładzie
Na Digits 8×8 (1347 obrazów treningowych, 450 testowych, random_state=0, piksele podzielone przez 16) porównałem MLPClassifier z różnymi aktywacjami. Przy jednej warstwie ukrytej ze 100 neuronami różnice są małe: bez aktywacji (identity, czyli model liniowy) 96,0% na teście, sigmoid 97,6%, tanh 96,9%, ReLU 98,0%. Sigmoid potrzebował jednak 596 epok do zbieżności, ReLU — 295.
Głębokość zmienia obraz. Sieć z ośmioma warstwami ukrytymi po 32 neurony (Adam, lr = 0,001) z sigmoidem w ogóle się nie nauczyła: trafność 10,2% i strata 2,303 = ln 10, czyli równe zgadywanie wśród 10 cyfr — gradient nie dotarł do wczesnych warstw. Ta sama sieć z tanh osiągnęła 96,9%, a z ReLU 93,1%.
Dane: Digits (ręcznie pisane cyfry 8×8)
W praktyce
- Domyślna dla warstw ukrytych: ReLU (
MLPClassifier(activation='relu'),nn.ReLU). Transformery: GELU (nn.GELU), w nowszych LLM SwiGLU. - Sigmoid i tanh zostały na wyjściu, w bramkach LSTM i GRU oraz tam, gdzie wartość musi mieścić się w przedziale.
- Z ReLU idź w parze z inicjalizacją He (
kaiming_normal_); z sigmoidem i tanh — Xavier. - Monitoruj udział neuronów dających zawsze zero (martwe ReLU); kilka procent to norma, 30–50% to problem — zmniejsz learning rate lub zmień aktywację na Leaky ReLU.
- Typowy błąd: sigmoid w głębokiej sieci bez normalizacji — trening „stoi”, choć kod jest poprawny.
Najczęstsze pytania
- Dlaczego ReLU jest lepsze od sigmoidu?
- Pochodna sigmoidu wynosi najwyżej 0,25, więc gradient maleje co najmniej czterokrotnie na każdej warstwie i w głębokiej sieci znika. ReLU ma pochodną 1 dla dodatnich wejść, jest tanie i daje rzadkie aktywacje. Sigmoid został na wyjściu, gdzie potrzebne jest prawdopodobieństwo.
- Co to jest zanikający gradient (vanishing gradient)?
- Sytuacja, w której gradient dla wczesnych warstw jest bliski zera, bo został pomnożony przez wiele małych pochodnych aktywacji (i małych wag). Wczesne warstwy przestają się uczyć. Lekarstwa: ReLU, inicjalizacja He lub Xaviera, batch norm albo layer norm, połączenia residualne.
- Czy sieć bez funkcji aktywacji może się czegoś nauczyć?
- Tylko funkcji liniowej. Złożenie macierzy to jedna macierz, więc wielowarstwowa sieć bez aktywacji to regresja liniowa lub logistyczna z dziwnie sparametryzowanymi wagami. Nie nauczy się XOR ani żadnej granicy z załamaniem.
Źródła
- Goodfellow, Bengio, Courville (2016). Deep Learning, rozdz. 6.3 "Hidden units". https://www.deeplearningbook.org/contents/mlp.html
- Nair, V., Hinton, G. (2010). "Rectified linear units improve restricted Boltzmann machines". ICML.
- Glorot, X., Bordes, A., Bengio, Y. (2011). "Deep sparse rectifier neural networks". AISTATS, PMLR 15.
- Hendrycks, D., Gimpel, K. (2016). "Gaussian error linear units (GELUs)". arXiv:1606.08415
- Zhang i in. Dive into Deep Learning, rozdz. 5.1.2 "Activation functions". https://d2l.ai/chapter_multilayer-perceptrons/mlp.html