Poradniki
Poradniki · 10 min czytania · 5 kwietnia 2026

Jak wybrać funkcję straty dla modelu ML – przewodnik po 5 typach

Jak wybrać funkcję straty dla modelu ML – przewodnik po 5 typach

Źródło: Link

Darmowy webinar AI

90 minut praktyki. Co tydzień na żywo.

Zapisz się →

Powiązane tematy

Trenowanie modelu uczenia maszynowego to proces prób i błędów. Model przewiduje wynik, porównuje go z rzeczywistością, oblicza błąd i koryguje parametry. Ale kto decyduje, jak bardzo ten błąd boli? Funkcja straty.

To ona tłumaczy różnicę między przewidywaniem a prawdą na sygnał, który model rozumie — i na którym może się uczyć. Różne funkcje straty zachowują się zupełnie inaczej. Jedna karze duże błędy jak młotem, inna pozostaje spokojna nawet przy szumie w danych. Wybór niewłaściwej funkcji? Model może się uczyć w złym kierunku.

Poniżej znajdziesz praktyczny przewodnik po pięciu najważniejszych typach funkcji straty — kiedy ich używać, jak działają i dlaczego wybór ma znaczenie.

Zanim zaczniesz: co powinieneś wiedzieć

Ten przewodnik zakłada, że masz podstawową wiedzę o uczeniu maszynowym — wiesz, czym jest model, trening i predykcja. Nie musisz znać matematyki na poziomie akademickim, ale pomoże Ci zrozumienie, że:

  • Funkcja straty (loss function) to sposób mierzenia, jak bardzo model się myli
  • Trening to proces minimalizowania tej straty poprzez dostosowywanie wag modelu
  • Typ zadania (regresja, klasyfikacja, ranking) determinuje wybór funkcji

Jeśli dopiero zaczynasz przygodę z ML, zerknij na nasz przewodnik dla początkujących w Data Science — tam znajdziesz podstawy.

Funkcja straty mierzy odległość między przewidywaniem a rzeczywistością — im mniejsza, tym lepiej model się uczy
Funkcja straty mierzy odległość między przewidywaniem a rzeczywistością — im mniejsza, tym lepiej model się uczy

Mean Squared Error (MSE) — klasyk regresji, który karze duże błędy

MSE to najpopularniejsza funkcja straty w zadaniach regresji. Działa prosto: bierze różnicę między przewidywaniem a rzeczywistą wartością, podnosi ją do kwadratu i uśrednia po wszystkich przykładach.

Jak to wygląda w praktyce?

Załóżmy, że Twój model przewiduje ceny mieszkań. Jeśli pomyli się o 10 000 zł, błąd wynosi 100 000 000 (10 000²). Jeśli pomyli się o 100 000 zł, błąd to 10 000 000 000. Różnica? Stukrotna. MSE karze duże błędy nieproporcjonalnie mocno.

Kiedy używać MSE:

  • Gdy duże błędy są bardziej kosztowne niż małe (np. prognozowanie popytu — lepiej przeszacować niż nie mieć towaru)
  • Gdy dane są czyste, bez outlierów (bo jeden ekstremalny punkt może zdominować całą stratę)
  • Gdy chcesz gładkiej, różniczkowalnej funkcji (MSE jest wszędzie ciągła, co ułatwia optymalizację)

Kiedy NIE używać MSE:

  • Gdy w danych są wartości odstające — jeden outlier może zepsuć cały trening
  • Gdy chcesz, żeby model traktował wszystkie błędy równo (wtedy użyj MAE)

Przykład kodu w Pythonie

W bibliotece Keras MSE to domyślna funkcja dla regresji:

model.compile(optimizer='adam', loss='mean_squared_error')

W PyTorch:

import torch.nn as nn
criterion = nn.MSELoss()

Mean Absolute Error (MAE) — odporny na szum i outliery

MAE to bardziej wyrozumiała wersja MSE. Zamiast podnosić błąd do kwadratu, po prostu bierze jego wartość bezwzględną. Błąd o 10 000 zł to błąd o 10 000 zł — nie 100 000 000.

Dlaczego to ma znaczenie?

Jeśli w Twoich danych pojawi się wartość odstająca (np. mieszkanie sprzedane za 10 mln zł w dzielnicy, gdzie średnia to 500 tys.), MSE wpadnie w panikę. MAE wzruszy ramionami i potraktuje to jak kolejny błąd.

Kiedy używać MAE:

  • Gdy dane zawierają outliery, których nie możesz usunąć
  • Gdy wszystkie błędy mają podobną wagę (np. prognoza temperatury — pomyłka o 2°C to po prostu pomyłka o 2°C)
  • Gdy chcesz interpretowalnej metryki (MAE = średni błąd w jednostkach oryginalnych)

Kiedy NIE używać MAE:

  • Gdy duże błędy są krytyczne (MAE ich nie karze mocniej)
  • Gdy potrzebujesz szybkiej optymalizacji (MAE nie jest różniczkowalna w zerze, co spowalnia gradient descent)

Przykład kodu

Keras:

model.compile(optimizer='adam', loss='mean_absolute_error')

PyTorch:

criterion = nn.L1Loss()
MSE karze duże błędy kwadratowo, MAE traktuje je liniowo — różnica widoczna szczególnie przy outlierach
MSE karze duże błędy kwadratowo, MAE traktuje je liniowo — różnica widoczna szczególnie przy outlierach

Binary Cross-Entropy — dla klasyfikacji binarnej

Kiedy Twój model ma odpowiedzieć "tak" lub "nie" (spam/nie-spam, chory/zdrowy, kliknie/nie-kliknie), potrzebujesz funkcji, która mierzy, jak bardzo pewny jest model swojej odpowiedzi.

Binary Cross-Entropy (BCE) robi dokładnie to. Karze model nie tylko za błędną odpowiedź, ale też za brak pewności przy poprawnej.

Jak to działa?

Model nie mówi "to spam" — mówi "jestem w 87% pewien, że to spam". BCE porównuje tę pewność z rzeczywistością (0 lub 1) i karze za rozbieżność. Im bardziej model się myli, tym większa strata.

Kiedy używać BCE:

  • Klasyfikacja binarna (dwie klasy)
  • Gdy potrzebujesz prawdopodobieństw, nie tylko etykiet (np. "prawdopodobieństwo, że klient kupi")
  • Gdy klasy są mniej więcej zbalansowane (jeśli masz 99% jednej klasy, użyj focal loss lub ważonej BCE)

Pułapka dla początkujących:

BCE wymaga, żeby ostatnia warstwa modelu miała funkcję aktywacji sigmoid (która zwraca wartości 0-1). Jeśli zapomnisz o sigmoid, model zwróci dowolne liczby i strata będzie bez sensu.

Przykład kodu

Keras:

model.compile(optimizer='adam', loss='binary_crossentropy')

PyTorch:

criterion = nn.BCELoss() # wymaga sigmoid w ostatniej warstwie
# lub
criterion = nn.BCEWithLogitsLoss() # sigmoid wbudowany

Categorical Cross-Entropy — dla wielu klas

Masz więcej niż dwie kategorie? (np. rozpoznawanie cyfr 0-9, klasyfikacja gatunków zwierząt, sentiment analysis z 3 opcjami). Categorical Cross-Entropy to rozszerzenie BCE na wiele klas.

Jak to działa?

Model zwraca wektor prawdopodobieństw dla każdej klasy (np. [0.7, 0.2, 0.1] dla trzech kategorii). CCE porównuje ten wektor z rzeczywistą klasą (zakodowaną jako one-hot: [1, 0, 0]) i karze za rozbieżność.

Kiedy używać CCE:

  • Klasyfikacja wieloklasowa (3+ klas)
  • Gdy klasy się wzajemnie wykluczają (obiekt może być ALBO kotem, ALBO psem, nie oboma naraz)
  • Gdy potrzebujesz rozkładu prawdopodobieństw na wyjściu

Wariant: Sparse Categorical Cross-Entropy

Jeśli Twoje etykiety są liczbami (0, 1, 2...) zamiast wektorów one-hot ([1,0,0], [0,1,0]...), użyj sparse CCE. Robi to samo, ale oszczędza pamięć.

Przykład kodu

Keras (one-hot labels):

model.compile(optimizer='adam', loss='categorical_crossentropy')

Keras (integer labels):

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')

PyTorch (integer labels, softmax wbudowany):

criterion = nn.CrossEntropyLoss()

Jeśli chcesz lepiej zrozumieć, jak uruchomić gotowy model w aplikacji webowej, mamy osobny przewodnik.

Categorical Cross-Entropy porównuje rozkład prawdopodobieństw z rzeczywistą klasą — im większa rozbieżność, tym wyższa strata
Categorical Cross-Entropy porównuje rozkład prawdopodobieństw z rzeczywistą klasą — im większa rozbieżność, tym wyższa strata

Huber Loss — kompromis między MSE a MAE

MSE karze duże błędy za mocno. MAE karze je za słabo. Huber Loss to złoty środek — zachowuje się jak MSE przy małych błędach (gładka optymalizacja) i jak MAE przy dużych (odporność na outliery).

Jak to działa?

Huber ma parametr delta (δ), który definiuje próg. Poniżej δ funkcja zachowuje się jak MSE (kwadratowa), powyżej — jak MAE (liniowa). Typowa wartość δ to 1.0, ale możesz ją dostosować do swoich danych.

Kiedy używać Huber Loss:

  • Gdy masz outliery, ale nie chcesz ich całkowicie ignorować
  • Gdy potrzebujesz stabilnego treningu (Huber jest wszędzie różniczkowalny, w przeciwieństwie do MAE)
  • Gdy chcesz kontrolować, jak mocno karać duże błędy (przez dostrojenie δ)

Kiedy NIE używać Huber Loss:

  • Gdy dane są czyste i MSE działa dobrze (Huber dodaje niepotrzebną złożoność)
  • Gdy nie masz czasu na tuning δ (trzeba go dobrać eksperymentalnie)

Przykład kodu

Keras:

model.compile(optimizer='adam', loss='huber')

PyTorch:

criterion = nn.HuberLoss(delta=1.0)

Jak wybrać funkcję straty dla swojego projektu

Decyzja sprowadza się do trzech pytań:

  1. Jaki masz typ zadania?
    • Regresja (przewidywanie liczby) → MSE, MAE lub Huber
    • Klasyfikacja binarna → Binary Cross-Entropy
    • Klasyfikacja wieloklasowa → Categorical Cross-Entropy
  2. Czy w danych są outliery?
    • Tak → MAE lub Huber
    • Nie → MSE
  3. Czy duże błędy są krytyczne?
    • Tak → MSE (karze mocno)
    • Nie → MAE (traktuje równo)
    • Zależy → Huber (kompromis)

Przykład: budujesz model przewidujący ceny nieruchomości. Dane zawierają kilka luksusowych apartamentów (outliery), ale duże błędy w przewidywaniu mogą kosztować klienta tysiące. Rozwiązanie? Huber Loss z δ=0.5 — będzie karał duże błędy, ale nie da się zdominować przez pojedyncze ekstremalne wartości.

Testuj i porównuj

Teoria to jedno, praktyka drugie. Najlepszy sposób na wybór funkcji straty? Przetestuj kilka i porównaj wyniki na zbiorze walidacyjnym. W Keras możesz łatwo zmienić funkcję straty bez przebudowy modelu:

# Test 1: MSE
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
history_mse = model.fit(X_train, y_train, validation_split=0.2, epochs=50)

# Test 2: MAE
model.compile(optimizer='adam', loss='mae', metrics=['mse'])
history_mae = model.fit(X_train, y_train, validation_split=0.2, epochs=50)

# Porównaj wyniki na validation set

Jeśli dopiero zaczynasz pracę z modelami, sprawdź nasz przewodnik po ChatGPT">ChatGPT w codziennej pracy — AI może pomóc Ci debugować kod i tłumaczyć błędy.

Pułapki, o których musisz wiedzieć

1. Niezbalansowane klasy w klasyfikacji

Jeśli masz 95% przykładów klasy A i 5% klasy B, standardowa Cross-Entropy pozwoli modelowi nauczyć się "zawsze mów A" i osiągnąć 95% accuracy. Rozwiązanie? Użyj ważonej funkcji straty:

# PyTorch
weights = torch.tensor([0.05, 0.95]) # odwrotność częstości
criterion = nn.CrossEntropyLoss(weight=weights)

2. Zapomnienie o normalizacji danych

MSE jest wrażliwa na skalę. Jeśli przewidujesz ceny w złotych (0-1 000 000) bez normalizacji, błędy będą ogromne i model będzie się męczył. Zawsze normalizuj dane wejściowe i wyjściowe do zakresu [0, 1] lub [-1, 1].

3. Użycie złej funkcji aktywacji na wyjściu

Binary Cross-Entropy wymaga sigmoid. Categorical Cross-Entropy wymaga softmax. Jeśli zapomnisz, model zwróci nonsens. Keras czasem dodaje to automatycznie (np. from_logits=True), ale w PyTorch musisz to kontrolować ręcznie.

FAQ — najczęstsze pytania

Czy mogę użyć kilku funkcji straty jednocześnie?

Tak, to się nazywa multi-task learning. Możesz zdefiniować własną funkcję, która łączy np. MSE dla regresji i BCE dla klasyfikacji. W Keras:

def combined_loss(y_true, y_pred):
 mse = tf.keras.losses.MSE(y_true[:, 0], y_pred[:, 0])
 bce = tf.keras.losses.BinaryCrossentropy(y_true[:, 1], y_pred[:, 1])
 return mse + bce

model.compile(optimizer='adam', loss=combined_loss)

Dlaczego mój model nie uczy się mimo niskiej straty?

Niska strata na zbiorze treningowym ≠ dobry model. Sprawdź stratę na zbiorze walidacyjnym. Jeśli rośnie, masz overfitting. Jeśli obie są niskie, ale model działa słabo, problem leży gdzie indziej (np. złe dane, zła architektura, zły preprocessing).

Czy powinienem optymalizować tę samą metrykę, którą używam jako funkcję straty?

Niekoniecznie. Funkcja straty musi być różniczkowalna (żeby gradient descent działał). Metryka ewaluacji może być dowolna (np. accuracy, F1-score). Przykład: w klasyfikacji używasz Cross-Entropy jako loss, ale mierzysz sukces przez accuracy.

Co to jest focal loss i kiedy jej używać?

Focal Loss to wariant Cross-Entropy zaprojektowany dla ekstremalnie niezbalansowanych klas (np. detekcja obiektów, gdzie 99.9% pikseli to tło). Karze mocniej błędy na trudnych przykładach, ignorując łatwe. Używaj, gdy masz bardzo rzadką klasę pozytywną.

Czy mogę napisać własną funkcję straty?

Tak. W Keras i PyTorch możesz zdefiniować dowolną funkcję, która przyjmuje y_true i y_pred i zwraca skalar. Upewnij się tylko, że jest różniczkowalna (używa operacji tensorowych, nie pętli Pythona).

Chcesz opanować AI od podstaw?

Ten poradnik to dopiero początek. W naszym kursie "Praktyczna AI" nauczysz się korzystać z ChatGPT, Claude i innych narzędzi AI w sposób systematyczny — od zera do zaawansowanego poziomu.

Sprawdź kurs →

Testuj, porównuj, ucz się na wynikach

Wybór funkcji straty to nie czarna magia — to decyzja oparta na typie zadania, charakterystyce danych i tym, co chcesz osiągnąć. MSE karze duże błędy, MAE traktuje wszystkie równo, Huber łączy oba podejścia. Cross-Entropy działa dla klasyfikacji, z wariantami dla dwóch lub wielu klas.

Nie ma jednej uniwersalnej odpowiedzi. Najlepszy sposób na naukę? Weź swój dataset, przetestuj trzy funkcje straty i porównaj wyniki. Zobaczysz różnicę w praktyce — nie w teorii.

Otwórz swój ostatni projekt ML. Sprawdź, jakiej funkcji straty używasz. Czy to świadomy wybór, czy domyślna wartość z tutoriala? Jeśli drugie — przetestuj alternatywę. Może właśnie odkryjesz, dlaczego model nie działał tak dobrze, jak chciałeś.

Na podstawie: Analytics Vidhya

Informacje o artykule

Ten temat omawiam szerzej na webinarze

90 minut praktycznej wiedzy o AI. Pokaze Ci krok po kroku, jak zaczac oszczedzac 10 godzin tygodniowo dzieki sztucznej inteligencji.

Zapisz sie na webinar
Udostępnij:
Jan Gajos

Ekspert AI & Founder, AI Evolution

Pasjonat sztucznej inteligencji, który od 18 lat działa z sukcesem biznesowo i szkoleniowo. Wprowadzam AI do swoich firm oraz codziennego życia. Fascynują mnie nowe technologie, gry wideo i składanie klocków Lego – tam też widzę logikę i kreatywność, które AI potrafi wzmacniać. Wierzę, że dobrze użyta sztuczna inteligencja to nie ogłupiające ułatwienie, lecz prawdziwy przełom w sposobie, w jaki myślimy, tworzymy i pracujemy.