ML Atlas

06 · Sieci · 4 min czytania · Interaktywne · aktualizacja

Po co sieci neuronowej warstwa ukryta i ile neuronów wybrać?

W skrócie

Warstwa ukryta to neurony między wejściem a wyjściem sieci. Każdy uczy się cechy pośredniej, dzięki czemu sieć rysuje granice, których jedna prosta nie da.

Co to jest

Warstwa ukryta to zbiór neuronów położonych między wejściem a wyjściem sieci; „ukryta”, bo jej wartości nie są ani danymi, ani odpowiedzią. Każdy neuron ukryty liczy sumę ważoną wejść i przepuszcza ją przez nieliniową aktywację, a warstwa wyjściowa składa te pośrednie cechy w decyzję.

Sieć z co najmniej jedną warstwą ukrytą to perceptron wielowarstwowy (MLP). Głębokie sieci i duże modele językowe mają takich warstw dziesiątki.

Intuicja: lekarz nie diagnozuje prosto z surowych wyników badań. Najpierw składa je w pojęcia pośrednie — „stan zapalny”, „odwodnienie” — a dopiero z nich wyciąga wniosek. Neurony ukryte robią to samo, tylko pojęcia pośrednie wymyślają same z danych.

Mechanizm — dlaczego tak działa

Pojedynczy neuron tnie przestrzeń cech jedną hiperpłaszczyzną. Reguła XOR — „spełniony warunek A albo B, ale nie oba naraz” — wymaga dwóch cięć, bo pozytywne przykłady leżą po przekątnej. Dwa neurony ukryte robią po jednym cięciu, a neuron wyjściowy łączy ich odpowiedzi, np. „w pierwszej półpłaszczyźnie, ale nie w drugiej”. Warstwa ukryta uczy się więc nowych cech, w których problem staje się liniowo separowalny — to ta sama idea co ręczna inżynieria cech, tylko wyuczona z danych.

Warunek konieczny: nieliniowość między warstwami. Bez niej złożenie dwóch warstw liniowych W₂(W₁x) = (W₂W₁)x jest nadal jedną warstwą liniową, niezależnie od liczby warstw — głębokość nic by nie dawała.

Twierdzenie o uniwersalnej aproksymacji (Cybenko 1989, Hornik 1991): sieć z jedną warstwą ukrytą i nieliniową aktywacją może przybliżyć dowolną funkcję ciągłą na zbiorze zwartym z dowolną dokładnością. Twierdzenie nie mówi jednak, ile neuronów potrzeba (bywa wykładniczo wiele) ani czy spadek gradientu je znajdzie. Montúfar i in. (2014) pokazali, że liczba regionów liniowych, jakie może wyciąć sieć ReLU, rośnie wykładniczo z głębokością, a tylko wielomianowo z szerokością — dlatego głębokie sieci są oszczędniejsze niż płytkie i szerokie.

Zastrzeżenie: więcej neuronów to większa pojemność, czyli większa zdolność do zapamiętania szumu. Na małych danych tabelarycznych ograniczają to liczba neuronów, regularyzacja i wczesne zatrzymanie, a nie samo twierdzenie o aproksymacji.

Na przykładzie

Najpierw XOR: 100 punktów (po 25 kopii czterech narożników kwadratu). Regresja logistyczna, czyli sieć bez warstwy ukrytej, osiąga dokładnie 50% — nie istnieje prosta, która zrobi lepiej. MLPClassifier z czterema neuronami ukrytymi tanh (solver lbfgs) osiąga 100%.

Potem Digits 8×8 (1347 obrazów treningowych, 450 testowych, random_state=0). Regresja logistyczna daje na teście 96,9% — cyfry są w 64 wymiarach w dużej mierze liniowo separowalne. Sieć z jednym neuronem ukrytym: 34,0% (wąskie gardło — cała informacja musi przejść przez jedną liczbę). Z 2 neuronami: 75,6%, z 5: 94,9%, z 10: 96,4%, z 50 i 100: 98,0%, z 300: 97,6%. Warstwa ukryta pomaga, gdy jest dość szeroka; powyżej pewnej szerokości zysk znika. Sieć ze 100 neuronami bez nieliniowości (activation='identity') daje 96,0% — tyle co model liniowy, bo nim właśnie jest.

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

  • scikit-learn: MLPClassifier(hidden_layer_sizes=(100,)) — domyślnie jedna warstwa ze 100 neuronami i aktywacją ReLU.
  • PyTorch: nn.Sequential(nn.Linear(d, h), nn.ReLU(), nn.Linear(h, k)); zapomnienie o nn.ReLU() między warstwami Linear to sieć liniowa w przebraniu.
  • Dane tabelaryczne: 1–2 warstwy po kilkadziesiąt–kilkaset neuronów zwykle wystarczają, a boosting drzew często wygrywa. Obrazy i tekst: dziesiątki warstw, bo struktura jest hierarchiczna.
  • LLM: każdy blok transformera ma warstwę MLP, zwykle 4 razy szerszą niż wymiar modelu.
  • Typowy błąd: dokładanie warstw do małego zbioru i wynik 100% na treningu przy spadku na walidacji — to pojemność, nie zrozumienie.

Najczęstsze pytania

Po co sieci neuronowej warstwa ukryta?
Żeby rysować granice złożone z kilku cięć zamiast jednej prostej. Neurony ukryte uczą się cech pośrednich, w których problem staje się liniowo separowalny. Bez warstwy ukrytej sieć jest regresją logistyczną i nie nauczy się XOR.
Ile warstw ukrytych i neuronów wybrać?
Na danych tabelarycznych zacznij od jednej warstwy z 32–128 neuronami i sprawdź walidację; dokładaj, dopóki wynik walidacji rośnie. Głębokość opłaca się przy strukturze hierarchicznej (obrazy, tekst). Więcej neuronów niż potrzeba kosztuje czas i wymaga regularyzacji.
Czy jedna warstwa ukryta wystarczy do wszystkiego?
Teoretycznie tak (twierdzenie o uniwersalnej aproksymacji), ale liczba neuronów może być astronomiczna, a gradient nie musi ich znaleźć. Głębsze sieci reprezentują te same funkcje wykładniczo oszczędniej, dlatego w praktyce wygrywa głębokość, nie szerokość.

Źródła

  • Goodfellow, Bengio, Courville (2016). Deep Learning, rozdz. 6.1 "Example: learning XOR", 6.4.1 "Universal approximation properties and depth". https://www.deeplearningbook.org/contents/mlp.html
  • Cybenko, G. (1989). "Approximation by superpositions of a sigmoidal function". Mathematics of Control, Signals and Systems 2, 303–314. doi:10.1007/BF02551274
  • Hornik, K. (1991). "Approximation capabilities of multilayer feedforward networks". Neural Networks 4(2), 251–257.
  • Montúfar, Pascanu, Cho, Bengio (2014). "On the number of linear regions of deep neural networks". NeurIPS. arXiv:1402.1869
  • Zhang i in. Dive into Deep Learning, rozdz. 5.1 "Multilayer perceptrons". https://d2l.ai/chapter_multilayer-perceptrons/mlp.html

Zobacz też