03 · Nadzorowane · 4 min czytania · Interaktywne · aktualizacja
Czym jest funkcja straty i co oznacza loss równy 0,69?
W skrócie
Funkcja straty to jedna liczba mierząca, jak bardzo przewidywania modelu odbiegają od prawdy na danych treningowych. Trening polega na jej minimalizowaniu.
Co to jest
Funkcja straty (loss, funkcja kosztu) przypisuje przewidywaniom modelu jedną liczbę: im większa, tym gorzej model odpowiada na danych treningowych. Trening gradientowy to minimalizacja tej liczby.
W klasyfikacji standardem jest entropia krzyżowa (cross-entropy), w regresji błąd kwadratowy. Duże modele językowe trenuje się entropią krzyżową na następnym tokenie, a boosting drzew minimalizuje stratę krok po kroku kolejnymi drzewami.
Intuicja: strata to rachunek za pomyłki. Ale nie każda pomyłka kosztuje tyle samo — ostrożne „chyba tak” przy złej odpowiedzi kosztuje mało, a pewne „na pewno tak” przy złej odpowiedzi kosztuje bardzo dużo. To właśnie ta asymetria kształtuje, czego model się uczy.
Mechanizm — dlaczego tak działa
Entropia krzyżowa dla jednego przykładu to −log p, gdzie p jest prawdopodobieństwem, jakie model przypisał poprawnej klasie. Strata całego zbioru to średnia: L = −(1/N) Σ log p(yᵢ | xᵢ). Pewna i trafna odpowiedź (p bliskie 1) kosztuje prawie 0; pewna i błędna kosztuje bardzo dużo: p = 0,01 daje 4,6, p = 0,0001 daje 9,2, a przy p → 0 strata dąży do nieskończoności. Dlatego strata karze przede wszystkim pewne pomyłki, nie pomyłki jako takie — i dlatego w implementacjach liczy się log-softmax albo obcina p, by uniknąć log 0.
Dla porównania błąd kwadratowy (1 − p)² przy p = 0,01 wynosi 0,98, a przy p = 0,33 — 0,45 (entropia krzyżowa: 1,11). Ma sufit, więc pewne pomyłki nie są karane szczególnie mocno, a po sigmoidzie jego gradient prawie znika właśnie wtedy, gdy model jest pewny i w błędzie.
Punkt odniesienia: model zgadujący po równo między K klasami ma stratę ln K — 0,69 dla dwóch klas, 1,10 dla trzech. Loss powyżej tej wartości oznacza „gorzej niż rzut monetą”.
Dlaczego właśnie ten wzór? Minimalizacja entropii krzyżowej jest dokładnie maksymalizacją wiarygodności danych pod modelem (maximum likelihood). Stąd dwie konsekwencje. Po pierwsze, model uczony tą stratą odtwarza częstości klas z treningu — jeśli 90% przykładów to klasa A, model nauczy się mówić „A” z prawdopodobieństwem około 0,9, gdy cechy nic nie wnoszą. Po drugie, entropia krzyżowa jest właściwą regułą oceny (proper scoring rule): osiąga minimum wtedy i tylko wtedy, gdy model podaje prawdziwe prawdopodobieństwa. Opłaca się więc być skalibrowanym, nie przesadnie pewnym.
Zastrzeżenie: entropia krzyżowa jest zawsze co najmniej równa entropii prawdziwego rozkładu etykiet; różnica to dywergencja KL. Jeśli te same cechy prowadzą do różnych odpowiedzi, nawet idealny model ma stratę większą od zera. Strata nie jest też miarą zadania: optymalizujemy ją, bo jest gładka i różniczkowalna, ale oceniamy trafność, balanced accuracy czy AUC.
Na przykładzie
Na Breast Cancer Wisconsin (podział 75/25 z warstwowaniem, random_state=0, cechy standaryzowane) wytrenowałem LogisticRegression. Strata testowa (log_loss) wynosi 0,086, treningowa 0,048. Dwa punkty odniesienia: rzut monetą to ln 2 = 0,693, a model, który zawsze podaje tylko proporcje klas z treningu (37% złośliwych), ma na teście 0,659. Model jest więc daleko poniżej obu progów.
Ciekawsze jest to, skąd ta strata się bierze. Model myli się w 6 ze 143 przypadków testowych. Mediana straty pojedynczego przykładu to 0,0008, ale trzy najgorsze przykłady — pewne pomyłki — mają straty 2,41, 2,09 i 1,13 i odpowiadają razem za 46% całej sumy. Strata średnia jest w praktyce zdominowana przez garstkę pewnych błędów.
Dane: Breast Cancer Wisconsin (diagnostyka raka piersi)
W praktyce
- PyTorch:
nn.CrossEntropyLossprzyjmuje surowe logity (softmax jest w środku); podanie już zsoftmaksowanych wartości to częsty błąd. Dla dwóch klasnn.BCEWithLogitsLoss. - scikit-learn:
log_lossjako metryka;LogisticRegressionminimalizuje ją z regularyzacją L2. XGBoost:objective='binary:logistic'lub'multi:softprob'. - W LLM strata na token wynosi zwykle ~2–3 nat; perplexity = exp(straty). Spadek straty o 0,1 to zauważalna różnica jakości.
- Strata może spadać, gdy trafność stoi (model staje się pewniejszy tych samych decyzji), i rosnąć na walidacji, gdy trafność jeszcze rośnie (przesadna pewność w pomyłkach) — to normalne.
- Typowy błąd: porównywanie wartości straty między zbiorami o różnej liczbie klas bez odniesienia do ln K.
Najczęstsze pytania
- Co oznacza wartość loss, np. 0,69?
- Dla dwóch klas 0,69 ≈ ln 2 to strata modelu, który zgaduje po równo — czyli nic nie wie. Dla trzech klas tym punktem odniesienia jest 1,10. Wartości wyraźnie poniżej oznaczają, że model przypisuje poprawnej klasie więcej niż 1/K.
- Dlaczego używa się entropii krzyżowej, a nie błędu kwadratowego w klasyfikacji?
- Entropia krzyżowa odpowiada maksymalizacji wiarygodności i daje duży gradient przy pewnych pomyłkach, więc szybko je koryguje. Błąd kwadratowy po sigmoidzie ma gradient prawie zerowy właśnie wtedy, gdy model jest pewny i w błędzie — uczenie grzęźnie.
- Czy loss może spadać, a trafność nie rosnąć?
- Tak. Trafność patrzy tylko, czy największe prawdopodobieństwo trafia w dobrą klasę; strata patrzy, jak duże ono jest. Model może stawać się pewniejszy tych samych poprawnych decyzji (strata spada) albo pewniejszy tych samych pomyłek (strata rośnie) bez zmiany trafności.
Źródła
- Goodfellow, Bengio, Courville (2016). Deep Learning, rozdz. 5.5 "Maximum likelihood estimation", 6.2.1 "Cost functions". https://www.deeplearningbook.org/contents/mlp.html
- Bishop (2006). Pattern Recognition and Machine Learning, rozdz. 4.3.2 "Logistic regression", 1.6 "Information theory".
- Murphy, K. (2022). Probabilistic Machine Learning: An Introduction, rozdz. 4.2 i 6.1–6.2. https://probml.github.io/pml-book/book1.html
- Gneiting, T., Raftery, A. (2007). "Strictly proper scoring rules, prediction, and estimation". JASA 102(477), 359–378. doi:10.1198/016214506000001437
- Zhang i in. Dive into Deep Learning, rozdz. 4.1.3 "Loss function". https://d2l.ai/chapter_linear-classification/softmax-regression.html