ML Atlas

06 · Sieci · 5 min czytania · Interaktywne · aktualizacja

Czym jest perceptron wielowarstwowy (MLP) i jak działa?

W skrócie

MLP to sieć neuronowa z warstwami ukrytymi: każda składa sumy ważone i nieliniowość, dzięki czemu sieć uczy się zależności, których model liniowy nie uchwyci.

Co to jest

Perceptron wielowarstwowy (MLP, ang. multilayer perceptron) to sieć neuronowa złożona z warstwy wejściowej, jednej lub kilku warstw ukrytych i warstwy wyjściowej, w której każdy neuron jednej warstwy jest połączony z każdym neuronem następnej. Każdy neuron liczy sumę ważoną swoich wejść, dodaje wyraz wolny i przepuszcza wynik przez nieliniową funkcję aktywacji. Wagi dobiera się, minimalizując funkcję straty metodą spadku gradientu z propagacją wsteczną.

Intuicja: pojedynczy neuron to prosta reguła typu „ważę dowody i przekraczam próg”. Warstwa ukryta to kilkadziesiąt takich reguł naraz, a każda wykrywa inny prosty wzorzec, np. „jest pionowa kreska po lewej”. Następna warstwa nie patrzy już na piksele, tylko na te wzorce, i składa z nich decyzję „to raczej czwórka”. MLP uczy się więc nie tylko odpowiedzi, ale też własnych cech pośrednich.

Nazwa jest historyczna i trochę myląca: współczesny MLP nie używa progowej funkcji perceptronu, tylko gładkich lub odcinkowo liniowych aktywacji (ReLU, tanh), bo próg ma zerową pochodną i nie da się go trenować gradientem. W literaturze używa się też nazw „sieć jednokierunkowa” (feedforward) i „warstwy w pełni połączone” (dense, fully connected).

Mechanizm — dlaczego tak działa

Jedna warstwa to przekształcenie h = f(W·x + b): macierz W obraca, rozciąga i rzutuje przestrzeń wejść, b ją przesuwa, a f (np. ReLU(z) = max(0, z)) „zgina” wynik. Bez nieliniowości kilka warstw nie dawałoby nic nowego, bo złożenie przekształceń liniowych jest znowu liniowe: W₂(W₁x) = (W₂W₁)x. To właśnie aktywacja sprawia, że głębokość ma sens.

Z ReLU każdy neuron ukryty dzieli przestrzeń wejść hiperpłaszczyzną na część, gdzie milczy, i część, gdzie odpowiada liniowo. Suma wielu takich „zagiętych płaszczyzn” daje funkcję odcinkowo liniową o wielu kawałkach. Im więcej neuronów, tym więcej kawałków i tym dokładniej sieć może przybliżyć dowolny gładki kształt. To intuicja stojąca za twierdzeniem o uniwersalnej aproksymacji: już jedna wystarczająco szeroka warstwa ukryta może przybliżyć dowolną funkcję ciągłą na ograniczonym obszarze.

Twierdzenie mówi jednak tylko, że odpowiednie wagi istnieją. Nie mówi, ile neuronów trzeba, czy gradient je znajdzie ani czy wynik uogólni się na nowe dane. W praktyce głębsze sieci często potrzebują znacznie mniej neuronów niż płytkie, bo mogą wielokrotnie wykorzystywać cechy z niższych warstw.

Trening przebiega w pętli: przejście w przód liczy predykcję i stratę, propagacja wsteczna liczy gradient straty względem każdej wagi (reguła łańcuchowa), a optymalizator przesuwa wagi o mały krok przeciw gradientowi. Funkcja straty MLP nie jest wypukła, więc wynik zależy od losowej inicjalizacji, współczynnika uczenia i skali cech.

Ograniczenia: MLP ignoruje strukturę danych. Dla niego obraz to płaski wektor, w którym piksel (0, 0) i (0, 1) nie są „sąsiadami”. Dlatego dla obrazów lepsze są sieci konwolucyjne, dla sekwencji sieci rekurencyjne i transformery. Na danych tabelarycznych MLP zwykle przegrywa z gradient boostingiem drzew, choć bywa użyteczny w zespołach modeli.

Na przykładzie

Zbiór Digits 8×8 ma 1797 obrazków cyfr, każdy to 64 piksele o jasności od 0 do 16. Po podziale 75/25 (1347 obrazków treningowych, 450 testowych, random_state=0) i standaryzacji cech regresja logistyczna osiąga 96,9% trafności na zbiorze testowym. MLP z jedną warstwą ukrytą 64 neuronów (MLPClassifier, random_state=0) ma 4810 parametrów i osiąga 97,3%, czyli myli się na 12 zamiast 14 obrazkach. W 5-krotnej walidacji krzyżowej różnica jest podobnie skromna: 97,2% wobec 96,9%.

To uczciwa lekcja: cyfry 8×8 w 64 wymiarach są prawie liniowo rozdzielne, więc MLP nie ma tu wiele do dodania. Wyraźnie widać za to rolę szerokości warstwy ukrytej. Z 1 neuronem sieć trafia w 29,1% przypadków testowych, z 2 w 73,8%, z 4 w 87,3%, z 16 w 96,0%, a z 32 w 98,0%. Zbyt wąska warstwa jest „wąskim gardłem”, przez które nie przeciśnie się informacja o dziesięciu klasach.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: sieć 64→32→10 uczy się rozpoznawać ręcznie pisane cyfry 8×8 w przeglądarce; po 10 epokach trafia w około 95% cyfr testowych, a macierz pomyłek pokazuje, które cyfry myli.

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

W praktyce

  • scikit-learn: MLPClassifier i MLPRegressor (hidden_layer_sizes=(64,), domyślnie activation='relu', solver='adam'). Zawsze w Pipeline ze StandardScaler, bo MLP jest wrażliwy na skalę cech.
  • PyTorch: nn.Sequential(nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, 10)); na wyjściu surowe logity, a nn.CrossEntropyLoss sama dokłada softmax.
  • Na start: 1–2 warstwy ukryte po 32–256 neuronów, ReLU, Adam z lr=1e-3, wczesne zatrzymanie (early_stopping=True w scikit-learn).
  • Zawsze porównaj z prostym punktem odniesienia (regresja logistyczna, gradient boosting). Jeśli MLP nie wygrywa wyraźnie, prostszy model jest lepszym wyborem.
  • Typowe błędy: brak skalowania, za mało iteracji (ostrzeżenie ConvergenceWarning), ocena tylko na zbiorze treningowym, na którym MLP łatwo osiąga 100%.

Najczęstsze pytania

Czym MLP różni się od perceptronu?
Perceptron to jeden neuron z funkcją progową, który potrafi rozdzielić klasy tylko prostą (hiperpłaszczyzną). MLP ma warstwy ukryte i różniczkowalne aktywacje, więc buduje nieliniowe granice decyzyjne i da się go trenować propagacją wsteczną.
Ile warstw i neuronów wybrać?
Nie ma wzoru. Zacznij od jednej lub dwóch warstw ukrytych po kilkadziesiąt neuronów i zwiększaj, dopóki rośnie wynik na zbiorze walidacyjnym. Zbyt duża sieć bez regularyzacji zapamięta zbiór treningowy.
Czy MLP to już „deep learning”?
MLP z wieloma warstwami ukrytymi jest głęboką siecią w ścisłym sensie. W praktyce nazwa „deep learning” kojarzy się jednak z architekturami wykorzystującymi strukturę danych, jak sieci konwolucyjne czy transformery, w których bloki MLP są tylko jednym z elementów.
Dlaczego MLP na danych tabelarycznych często przegrywa z drzewami?
Drzewa dobrze radzą sobie z cechami o różnych skalach, progami i nieistotnymi kolumnami, a MLP wymaga starannego skalowania i strojenia. Przy kilku tysiącach wierszy przewaga elastyczności sieci zwykle nie zdąży się ujawnić.

Źródła

  • Goodfellow I., Bengio Y., Courville A., „Deep Learning”, MIT Press, 2016, rozdz. 6 „Deep Feedforward Networks”.
  • Rumelhart D. E., Hinton G. E., Williams R. J., „Learning representations by back-propagating errors”, Nature 323, 1986, s. 533–536.
  • Hornik K., Stinchcombe M., White H., „Multilayer feedforward networks are universal approximators”, Neural Networks 2(5), 1989, s. 359–366.
  • Géron A., „Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow”, 3rd ed., O’Reilly, 2022, rozdz. 10.
  • Dokumentacja scikit-learn, „Neural network models (supervised)”: https://scikit-learn.org/stable/modules/neural_networks_supervised.html

Zobacz też