01 · Podstawy · 4 min czytania · Interaktywne · aktualizacja
Czym jest entropia krzyżowa (log loss) i dlaczego to podstawowa strata w klasyfikacji?
W skrócie
Entropia krzyżowa karze model ujemnym logarytmem prawdopodobieństwa danego poprawnej odpowiedzi. Nagradza uczciwe prawdopodobieństwa, nie same trafienia.
Co to jest
Entropia krzyżowa (cross-entropy, w klasyfikacji nazywana też log loss) to funkcja straty równa średniemu ujemnemu logarytmowi prawdopodobieństwa, jakie model przypisał prawidłowej klasie: L = −(1/n) · Σ log q(yᵢ). Model, który poprawnej odpowiedzi daje prawdopodobieństwo 1, ma stratę 0; model, który daje jej prawdopodobieństwo bliskie 0, dostaje stratę dążącą do nieskończoności. To standardowa strata dla regresji logistycznej, sieci z softmaksem i modeli językowych.
Intuicja: entropia krzyżowa ocenia nie to, czy model zgadł, ale jak bardzo był przygotowany na prawdę. Prognoza „90% deszczu” w dzień deszczowy kosztuje 0,11, prognoza „50%” kosztuje 0,69, a „1% deszczu” — 4,6. Pewność siebie jest tania, gdy się sprawdza, i bardzo droga, gdy zawodzi.
Mechanizm — dlaczego tak działa
Nazwa pochodzi z teorii informacji. Dla prawdziwego rozkładu P i modelu Q entropia krzyżowa to H(P, Q) = −Σ p(x) · log q(x) — średnia długość kodu, gdy kodujemy wyniki z P kodem zbudowanym dla Q. Rozkłada się na H(P) + D_KL(P ‖ Q): niepewność samych danych plus koszt błędu modelu. H(P) nie zależy od modelu, więc minimalizując entropię krzyżową, minimalizujemy dywergencję KL do prawdy. W klasyfikacji P to rozkład „jedynkowy” (one-hot) na prawdziwej klasie, więc suma redukuje się do −log q(prawdziwa klasa).
Ta sama wielkość wynika z metody największej wiarygodności: ujemna log-wiarygodność danych przy modelu kategorycznym to dokładnie suma −log q(yᵢ). Trening z entropią krzyżową to więc szukanie parametrów, przy których obserwowane etykiety są najbardziej prawdopodobne.
Entropia krzyżowa jest właściwą regułą oceny (proper scoring rule): jej wartość oczekiwana jest najmniejsza, gdy model podaje prawdziwe prawdopodobieństwa. Model nie zyska, zawyżając pewność ani ją zaniżając. Trafność tej własności nie ma — zależy tylko od tego, po której stronie progu 0,5 leży prognoza, więc nie odróżnia uczciwego „60%” od aroganckiego „99,99%”.
Z softmaksem strata ma wyjątkowo wygodny gradient: pochodna po logicie klasy k to qₖ − yₖ, czyli po prostu różnica między przewidywanym a prawdziwym prawdopodobieństwem. Gradient nie zanika, gdy model myli się pewnie — w odróżnieniu od błędu kwadratowego na wyjściu sigmoidy, gdzie nasycenie spowalnia naukę. Dlatego biblioteki łączą softmax i logarytm w jedną numerycznie stabilną operację na logitach.
Ograniczenia. Logarytm sprawia, że pojedynczy pewny błąd może zdominować średnią — to cecha, nie defekt, ale przy szumie w etykietach model jest karany za „prawdziwe” odpowiedzi, które są błędnie oznaczone. Pomaga wygładzanie etykiet (label smoothing) albo przycinanie prawdopodobieństw. Niska strata na zbiorze treningowym przy wysokiej na walidacyjnym to klasyczny objaw przeuczenia i przesadnej pewności.
Na przykładzie
Breast Cancer Wisconsin, podział 75/25 (143 guzy w zbiorze testowym, 63% łagodnych). Model stały, który każdemu guzowi podaje odsetek łagodnych ze zbioru treningowego, ma log loss 0,659 nata — w przybliżeniu entropia etykiety (0,95 bita) i punkt odniesienia dla każdego modelu. Regresja logistyczna na standaryzowanych cechach (C = 1) osiąga trafność 95,8% i log loss 0,086. Najgorszy pojedynczy przypadek, któremu model dał tylko 9% szans na prawdziwą klasę, odpowiada za 20% całej straty testowej.
Teraz to samo z praktycznie wyłączoną regularyzacją (C = 10 000). Na zbiorze treningowym log loss spada do 0,001 — model jest niemal pewny każdej odpowiedzi. Na testowym trafność wciąż wynosi przyzwoite 93,0%, ale log loss rośnie do 1,71, czyli jest gorszy niż model stały. Powód: jeden z dziesięciu błędów został popełniony z prawdopodobieństwem prawdziwej klasy rzędu 10⁻²⁴, co kosztuje 54,5 nata. Trafność tego nie widzi; entropia krzyżowa — tak.
Dane: Breast Cancer Wisconsin (diagnostyka raka piersi)
W praktyce
sklearn.metrics.log_loss(y_true, y_proba)— liczy w natach; podziel przez ln 2 ≈ 0,693, by dostać bity.- PyTorch:
nn.CrossEntropyLossprzyjmuje surowe logity (softmax jest w środku), nie prawdopodobieństwa; dla klasyfikacji binarnejnn.BCEWithLogitsLoss. Podanie softmaksu na wejście to częsty błąd. nn.CrossEntropyLoss(label_smoothing=0.1)łagodzi przesadną pewność;weight=przeważa rzadkie klasy.- Punkt odniesienia: log loss modelu stałego to entropia rozkładu klas (ln 2 ≈ 0,693 dla dwóch równych klas). Model powyżej tej wartości jest gorszy niż zgadywanie częstości.
- W modelach językowych e^(strata) to perplexity — średnia liczba „równie prawdopodobnych” kandydatów na następny token.
Najczęstsze pytania
- Dlaczego nie używać błędu kwadratowego do klasyfikacji?
- Można, ale entropia krzyżowa wynika z wiarygodności modelu kategorycznego, daje silny gradient przy pewnych błędach i mocniej karze prawdopodobieństwa bliskie zera. Błąd kwadratowy na wyjściu sigmoidy ma gradient zanikający w nasyceniu, więc uczy wolniej.
- Czym różni się entropia krzyżowa od dywergencji KL?
- Różnią się o entropię prawdziwego rozkładu: H(P, Q) = H(P) + D_KL(P ‖ Q). Przy stałych danych H(P) jest stałą, więc minimalizacja obu daje ten sam model. Entropia krzyżowa nie spada do zera, jeśli same etykiety są niepewne.
- Jaka wartość log loss jest dobra?
- Zależy od problemu, dlatego porównuj z modelem stałym (entropią rozkładu klas). Dla dwóch równych klas zgadywanie daje 0,693; wynik 0,1 oznacza, że model przypisuje prawdzie średnio (w sensie geometrycznym) około 90%.
Źródła
- Goodfellow, I., Bengio, Y., Courville, A. (2016). Deep Learning. MIT Press, rozdz. 3.13 i 6.2.2.
- Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer, rozdz. 4.3.2 i 4.3.4.
- Murphy, K. P. (2022). Probabilistic Machine Learning: An Introduction. MIT Press, rozdz. 6 i 10.
- scikit-learn:
log_loss, https://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html - PyTorch:
CrossEntropyLoss, https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html