Kurs: sieci neuronowe od środka · Lekcja 4 z 12 · 13 min
Wyjście i strata: softmax i entropia krzyżowa
W skrócie
Softmax zamienia wyniki sieci w prawdopodobieństwa, a entropia krzyżowa mierzy, jak bardzo się mylą. Czemu sieć uczy się na niej, a nie na trafności?
Rozgrzewka Dwa pytania z kursu ML, na których ta lekcja się opiera. Minuta, a lekcji nie blokuje.
Ostatnia warstwa sieci daje po jednej liczbie na klasę. Mogą być ujemne, mogą być ogromne i nie sumują się do niczego konkretnego. Żeby je czytać jak prawdopodobieństwa i żeby sieć miała się z czego uczyć, potrzebne są dwa klocki: softmax na wyjściu i entropia krzyżowa jako strata.
Wybierz odpowiedź i pewność.
Odpowiedz, żeby odblokować lab.
Pokaż odpowiedź
Poprawna odpowiedź: Około 4,6
Entropia krzyżowa to minus logarytm naturalny prawdopodobieństwa prawdziwej klasy: −ln 0,01 ≈ 4,61. Przy 0,4 byłoby tylko 0,92. W labie to ta sama strata, uśredniona po biopsjach testowych: wklęsłe punkty konturu dają trafność 92,4% i log-loss 0,222, a tekstura 70,2% i 0,595.
Spróbuj
- Obejrzyj wszystkie trzy cechy i zostań przy tej, której log-loss na walidacji jest poniżej 0,25. To cel labu. Liczy go na 5 częściach zbioru treningowego (398 biopsji), bez zaglądania w 171 testowych.
- Przesuń próg z 0,5 na 0,1, a potem na 0,9. Trafność się zmienia, log-loss stoi w miejscu, bo liczy się z prawdopodobieństw, zanim jakikolwiek próg je przetnie.
- Porównaj teksturę z wklęsłymi punktami: krzywa tekstury rośnie łagodnie, więc model rzadko jest pewny i często się myli.
Pomysł w prostych słowach
Surowe wyniki ostatniej warstwy to logity. Softmax robi z nich prawdopodobieństwa w dwóch ruchach: każdy logit podnosi do potęgi e, co daje liczby dodatnie, a potem dzieli przez ich sumę, więc wszystko sumuje się do 1. Kolejność zostaje: największy logit dostaje największe prawdopodobieństwo. Przy dwóch klasach softmax to dokładnie sigmoida z regresji logistycznej, którą widzisz w labie.
Entropia krzyżowa ocenia jeden przykład jedną liczbą: minus logarytm prawdopodobieństwa, które model dał prawdziwej klasie. Pewna i trafna odpowiedź (0,99) kosztuje 0,01. Niepewna (0,4) kosztuje 0,92. Pewna i błędna (0,01) kosztuje 4,61. Log-loss z kursu ML to ta sama strata dla dwóch klas.
Softmax ma też pokrętło, temperaturę: dzieli logity przez T przed potęgowaniem. W widżecie hasła Softmax dla zdania „Kot siedzi na …” słowo „parapecie” ma przy T = 1 prawdopodobieństwo 35%, a przy T = 0,1 już 95%. Niska temperatura wyostrza rozkład, wysoka go spłaszcza.
Dlaczego to działa
Spadek gradientu potrzebuje odpowiedzi na pytanie: w którą stronę przesunąć wagę, żeby strata spadła? Trafność tej odpowiedzi nie daje. Zmienia się skokami: mała zmiana wagi zwykle nie przestawia żadnej decyzji, więc trafność stoi w miejscu, a jej nachylenie wynosi zero prawie wszędzie. W kodzie niżej nachylenie trafności to 0,0, a entropii krzyżowej 0,059.
Entropia krzyżowa zmienia się płynnie przy każdej zmianie prawdopodobieństw, więc gradient jest zawsze. Do tego ma prostą postać: po logitach to po prostu prawdopodobieństwo minus prawdziwa etykieta. Im bardziej pewna pomyłka, tym większy gradient, a tym mocniej sieć poprawia wagi. Kara rośnie bez końca, gdy prawdopodobieństwo prawdziwej klasy dąży do zera, więc sieć uczy się nie być pewna bez powodu.
Częsty błąd
Prawda czy fałsz: „Wystarczy uczyć sieć na trafności, bo to ją i tak mierzymy.” Fałsz. Trafność zmienia się skokami, więc jej gradient prawie wszędzie wynosi zero i spadek gradientu nie wie, dokąd iść. Trafność nie widzi też, jak bardzo model się myli: odpowiedź 0,4 i odpowiedź 0,01 dla prawdziwej klasy to dla niej ta sama pomyłka, a dla entropii krzyżowej 0,92 wobec 4,61. Dlatego sieć uczy się na entropii krzyżowej, a trafność liczymy na walidacji, gdy chcemy wiedzieć, ile przykładów model trafia.
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
- Softmax zamienia logity w prawdopodobieństwa: dodatnie, sumują się do 1, kolejność zostaje; przy dwóch klasach to sigmoida.
- Entropia krzyżowa to −ln prawdopodobieństwa prawdziwej klasy: pewna pomyłka kosztuje dużo, pewna trafna odpowiedź prawie nic.
- Sieć uczy się na entropii krzyżowej, bo zawsze ma gradient; trafność zmienia się skokami i gradientu nie daje.
- Temperatura softmaxu wyostrza rozkład, gdy jest niska, i spłaszcza, gdy jest wysoka.
Głębiej: wzór, kod, praktyka
Matematyka
Softmax logitów z₁, …, z_K: p_k = e^(z_k) / Σ_j e^(z_j). Entropia krzyżowa jednego przykładu z prawdziwą klasą y: L = −ln p_y.
- Gradient po logitach:
∂L/∂z_k = p_k − 1dla prawdziwej klasy ip_kdla pozostałych, czyli prawdopodobieństwo minus etykieta. - Dla dwóch klas z logitami
zi0:p = e^z / (e^z + 1) = 1 / (1 + e^(−z)), czyli sigmoida. - Temperatura:
p_k = e^(z_k / T) / Σ_j e^(z_j / T). GdyTmaleje do 0, rozkład zmierza do jedynki przy największym logicie. - Odjęcie tej samej liczby od wszystkich logitów nie zmienia softmaxu; w praktyce odejmuje się maksimum, żeby potęgi nie przepełniły pamięci.
W kodzie (Python)
Softmax i entropia krzyżowa w numpy, logity z widżetu „Kot siedzi na …” i nachylenie trafności wobec nachylenia entropii krzyżowej:
import numpy as np
def softmax(z, T=1.0):
e = np.exp((z - z.max()) / T) # odjęcie maksimum nie zmienia wyniku, chroni przed przepełnieniem
return e / e.sum()
# entropia krzyżowa jednego przykładu: −ln(prawdopodobieństwo prawdziwej klasy)
for p in [0.99, 0.4, 0.01]:
print(f"p(true class) = {p}: cross-entropy {-np.log(p):.2f}")
# logity „Kot siedzi na …” z widżetu softmax-temperature
z = np.array([3.1, 2.8, 2.2, 1.9, 1.5, 0.9, 0.6, -0.4])
for T in [1.0, 0.1]:
print(f"T = {T}: top word {softmax(z, T)[0]:.0%}")
# trafność a entropia krzyżowa przy małej zmianie wagi w
x, y = np.array([-2.0, -1.0, 0.5, 1.0, 2.0]), np.array([0, 1, 0, 1, 1])
p = lambda w: 1 / (1 + np.exp(-w * x)) # neuron z sigmoidą
accuracy = lambda w: np.mean((p(w) > 0.5) == y)
cross_entropy = lambda w: -np.mean(y * np.log(p(w)) + (1 - y) * np.log(1 - p(w)))
h = 1e-3
print(f"accuracy {accuracy(1.0):.1f}, slope {(accuracy(1 + h) - accuracy(1 - h)) / (2 * h):.1f}")
print(f"cross-entropy {cross_entropy(1.0):.3f}, slope {(cross_entropy(1 + h) - cross_entropy(1 - h)) / (2 * h):.3f}")
Wynik
p(true class) = 0.99: cross-entropy 0.01
p(true class) = 0.4: cross-entropy 0.92
p(true class) = 0.01: cross-entropy 4.61
T = 1.0: top word 35%
T = 0.1: top word 95%
accuracy 0.6, slope 0.0
cross-entropy 0.571, slope 0.059
Nachylenie trafności to zero, więc nie mówi, dokąd przesunąć wagę. Dodatnie nachylenie entropii krzyżowej mówi: zmniejsz w, a strata spadnie. Uruchomione w numpy 2.1.3.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
Dla praktyka
- Ostatnia warstwa sieci zwraca logity, a softmax i entropię krzyżową licz razem jedną funkcją straty z biblioteki: liczy logarytm softmaxu stabilnie, bez przepełnienia.
- Do wyboru modelu porównuj log-loss na walidacji, a próg decyzji ustaw osobno, na końcu, według kosztów pomyłek.
- Strata treningowa, która dalej spada, gdy walidacyjna już rośnie, to znak przeuczenia: zatrzymaj trening tam, gdzie walidacyjna była najniższa.
- Prawdopodobieństwa z softmaxu bywają zbyt pewne. Gdy mają znaczyć częstość, a nie tylko kolejność, sprawdź kalibrację na walidacji.
Więcej w Atlasie
Hasła encyklopedii o pojęciach z tej lekcji: