Kurs uczenia maszynowego od zera · Lekcja 7.1 · 32 z 33 gotowych lekcji · 12 min
Sieci neuronowe: wiele prostych elementów razem
W skrócie
Sieć neuronowa łączy proste elementy, z których każdy rysuje jedną linię i ją zagina. Więcej neuronów ukrytych pozwala granicom oplatać kwiaty irysa.
Rozgrzewka Dwa pytania z wcześniejszych lekcji. Minuta, a lekcji nie blokuje.
Regresja logistyczna z lekcji 5 umie narysować tylko prostą granicę. Drzewa rysują tylko prostokąty. A co, jeśli klasy owijają się wokół siebie? Można by próbować wymyślać właściwą krzywą ręcznie przy każdym problemie — albo zbudować model z elementów tak prostych, że każdy umie narysować tylko prostą, i pozwolić, żeby ich połączenie narysowało cokolwiek. Na tym zakładzie opierają się sieci neuronowe.
Wybierz odpowiedź i pewność.
Odpowiedz, żeby odblokować lab.
Eksperyment
Ten interaktywny eksperyment działa w przeglądarce z włączonym JavaScriptem. Tekst wokół opisuje, co w nim widać.
Pokaż odpowiedź
Poprawna odpowiedź: Nie wzrośnie, a nawet spadnie, choć na treningu będzie lepsza
Dwa neurony dają 81,3% na teście, a 32 neurony 70,7%, chociaż dokładność treningowa rośnie z 81,3% do 94,7%. Większa sieć dopasowuje się do przypadkowych szczegółów 75 kwiatów treningowych. Dwa z trzech gatunków nakładają się w tych dwóch pomiarach, więc bezbłędnego podziału i tak nie ma.
Spróbuj
- Ustaw suwak neuronów ukrytych na najmniejszą wartość i naciśnij Trenuj. Spójrz na obszary decyzji: ile prostych krawędzi widzisz?
- Zwiększ liczbę neuronów ukrytych i znowu naciśnij Trenuj. Patrz, jak granice się wyginają, i porównaj trafność.
- Ustaw suwak neuronów ukrytych na największą wartość i wytrenuj sieć. Czy obszary zaczynają się wyginać wokół pojedynczych kwiatów? Zastanów się, czy nowy kwiat w takiej zatoczce naprawdę należałby do tego gatunku.
- Spójrz na kwiaty, w których dwa gatunki na siebie zachodzą. Czy jakakolwiek granica rozdzieli je tylko na podstawie tych dwóch pomiarów?
Gdy już sprawdzisz to w labie, zobaczmy, co się tam właściwie działo.
Pomysł w prostych słowach
Sieć neuronowa składa się z małych elementów zwanych neuronami. Każdy neuron robi coś, co już znamy: liczy ważoną sumę wejść, dodaje wyraz wolny i przepuszcza wynik przez prostą funkcję zginającą, zwaną funkcją aktywacji. Pojedynczy neuron to prawie regresja logistyczna; dzieli płaszczyznę jedną prostą.
Neurony układa się w warstwy. Wejścia (tutaj dwa pomiary kwiatu) trafiają do warstwy ukrytej, w której każdy neuron rysuje własną prostą i melduje, jak daleko i po której stronie leży punkt. Warstwa wyjściowa łączy te meldunki w ostateczną decyzję. Ponieważ każdy neuron ukryty zagina swój sygnał, ich połączenie daje granice z narożnikami i łukami.
Wyobraź sobie drużynę bardzo prostych wartowników pilnujących pola. Każdy umie powiedzieć tylko „intruz jest po lewej” albo „po prawej” od jednego prostego płotu. Jeden wartownik na wiele się nie zda. Ale dowódca, który słucha wielu wartowników, każdego z płotem w innym miejscu, potrafi wskazać obszar niemal dowolnego kształtu.
Dlaczego to działa
Jeden neuron liczy
wyjście = f(w · x + b)
gdzie x to lista wejść, w to wagi, b to wyraz wolny, a f to funkcja aktywacji. Bez f układanie warstw nie miałoby sensu: ważona suma ważonych sum to wciąż jedna ważona suma, więc cała sieć rysowałaby jedną prostą. Aktywacja to zagięcie, które zostaje. Dzięki niej każdy neuron ukryty dokłada jedno zgięcie, a odpowiednio wiele zgięć przybliży każdą rozsądną granicę. Więcej neuronów ukrytych to więcej możliwych zgięć — więcej elastyczności, która, jak nauczyła nas lekcja 7, działa w obie strony.
Wagi uczy się narzędziami z lekcji 4 i 5. Sieć przewiduje, strata logarytmiczna mierzy, jak bardzo się myli, a spadek gradientu przesuwa każdą wagę w dół. Jedyna nowa sztuczka dotyczy tego, jak znaleźć gradient dla wag ukrytych głęboko w sieci: algorytm propagacji wstecznej stosuje regułę łańcuchową z rachunku różniczkowego od wyjścia wstecz, warstwa po warstwie, i mówi każdej wadze, ile dołożyła do błędu.
Przykładem w tej lekcji jest zbiór Iris: 150 kwiatów trzech gatunków, po 50 z każdego, rozsławiony przez artykuł Ronalda Fishera z 1936 roku. Bierzemy dwa z czterech pomiarów, więc każdy kwiat to punkt na płaszczyźnie, a nauczona sieć przypisuje przewidywany gatunek każdemu miejscu tej płaszczyzny.
Pomysł jest stary — Frank Rosenblatt zbudował perceptron, pojedynczy uczący się neuron, w 1958 roku — ale sieci zdominowały dziedzinę dopiero wtedy, gdy dane, moc obliczeniowa i sztuczki treningowe urosły na tyle, żeby trenować wiele warstw.
Częsty błąd
„Neuronowa” sugeruje mózg i ta sugestia wprowadza w błąd. Sztuczny neuron to ważona suma ze zgięciem, a nie model biologicznej komórki, a sieć nie rozumie kwiatów; dopasowuje funkcję do przykładów. Praktyczny błąd to założenie, że większa sieć jest zawsze lepsza. Sieć z wieloma neuronami ukrytymi na małym zbiorze potrafi uczyć się na pamięć dokładnie tak jak głębokie drzewo albo wielomian wysokiego stopnia. Jej rozmiar trzeba dobierać na danych walidacyjnych, a w czasie treningu pilnować tej samej różnicy między wynikiem treningowym a testowym, którą poznaliśmy w lekcji 7.
Ułóż dość warstw, nakarm je dość dużą ilością tekstu, a jedno zadanie przewidywania zamieni się w coś, co pisze. W ostatniej lekcji zobaczymy, jak sieć uczy się języka, zgadując następne słowo.
Chcesz głębiej? Kurs NN zaczyna od jednego neuronu.
Quiz
Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.
Najważniejsze wnioski
- Neuron to ważona suma plus zginająca funkcja aktywacji.
- Warstwa ukryta łączy wiele prostych linii w zakrzywione granice.
- Wagi uczy się spadkiem gradientu; propagacja wsteczna dostarcza gradient dla każdej warstwy.
- Więcej neuronów ukrytych to więcej elastyczności, którą trzeba kontrolować danymi walidacyjnymi.
Głębiej: wzór, kod, praktyka
Matematyka
Jeden neuron liczy a = f(w·x + b), gdzie x to wejścia, w wagi, b wyraz wolny, a f aktywacja. Warstwa ukryta z h neuronami to to samo w zapisie macierzowym: a = f(W₁x + b₁). Warstwa wyjściowa liczy potem ŷ = softmax(W₂a + b₂).
- Bez
fwarstwy się zapadają:W₂(W₁x + b₁) + b₂ = (W₂W₁)x + (W₂b₁ + b₂), czyli jedno przekształcenie liniowe. To aktywacja sprawia, że głębokość się opłaca. - Trening minimalizuje stratę logarytmiczną
L = −(1/n) Σ log ŷᵢ,yᵢ, gdzieŷᵢ,yᵢto prawdopodobieństwo, jakie model dał prawdziwemu gatunkowi kwiatu i. - Propagacja wsteczna to reguła łańcuchowa stosowana od wyjścia do tyłu:
∂L/∂W₁ = ∂L/∂ŷ · ∂ŷ/∂a · ∂a/∂W₁. - Spadek gradientu aktualizuje potem każdą wagę:
w ← w − η · ∂L/∂w, gdzieηto współczynnik uczenia.
W kodzie (Python)
Mała sieć na danych z laba: dwa pomiary działki kielicha, połowa kwiatów do treningu (75), standaryzowane wejścia, neurony tanh, 2 i 32 neurony ukryte. To trener scikit-learn, a nie labowy:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
X, y = load_iris(return_X_y=True)
X = X[:, :2] # długość i szerokość działki kielicha, jak w labie
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.5, stratify=y, random_state=1)
for h in (2, 32):
net = make_pipeline(StandardScaler(), MLPClassifier(hidden_layer_sizes=(h,), activation="tanh", solver="lbfgs", max_iter=5000, random_state=0))
net.fit(X_tr, y_tr)
print(f"{h:2d} hidden units: train {net.score(X_tr, y_tr):.1%}, test {net.score(X_te, y_te):.1%}")
Wynik
2 hidden units: train 84.0%, test 74.7%
32 hidden units: train 96.0%, test 66.7%
Wzór jest ten z lekcji: większa sieć lepiej dopasowuje się do kwiatów treningowych i gorzej radzi sobie z testowymi. Własny trener laba (spadek gradientu z pędem) daje 81,3% i 70,7% na teście dla 2 i 32 neuronów, więc liczby się różnią, ale wzór nie.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
Dla praktyka
- Standaryzuj wejścia przed treningiem (odejmij średnią treningową, podziel przez odchylenie treningowe). Nieprzeskalowane cechy spowalniają spadek gradientu albo czynią go niestabilnym.
- Liczbę neuronów ukrytych wybieraj na danych walidacyjnych, nie po trafności treningowej. Większa sieć prawie zawsze lepiej dopasowuje się do zbioru treningowego (96,0% wobec 84,0% wyżej).
- Małe zbiory, jak 75 kwiatów treningowych, łatwo zapamiętać. Zanim dodasz neurony, spróbuj mniejszej sieci, regularyzacji wag albo wczesnego zatrzymania.
- Różne losowe wagi początkowe dają różne sieci. Dla uczciwego porównania ustal używane ziarna i porównuj po kilku z nich.
- Na danych tabelarycznych mocniejszą bazą bywa wzmacnianie gradientowe drzew (gradient boosting). Wypróbuj go, zanim sięgniesz po sieć.
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.
Więcej w Atlasie
Hasła encyklopedii o pojęciach z tej lekcji: