loss function: los fankšnTakéúčelová funkce, cost function, objective function, chybová funkce, kriteriální funkcePokročilý

Definice

Ztrátová funkce je předpis, který převádí rozdíl mezi předpovědí modelu a skutečnou hodnotou na jediné číslo vyjadřující, jak moc se model spletl. Trénink strojového učení pak spočívá v hledání parametrů, které tuto hodnotu minimalizují. Volba ztrátové funkce určuje, jaké chyby model považuje za drahé, a tím i jeho výsledné chování.

Kategorie: Strojové učeníAktualizováno

Nezaměňujte: Ve strojovém učení jde o měřítko chyby modelu; v pojistné matematice a teorii rozhodování označuje ztrátová funkce obdobný, ale samostatně vyvinutý koncept ocenění důsledků rozhodnutí.

Co ztrátová funkce vlastně měří

Ztrátová funkce dostane dvě věci: predikci modelu a správnou odpověď z trénovacích dat. Vrátí nezáporné číslo, které je tím větší, čím horší predikce byla. Pro jeden vzorek se často mluví o ztrátě (loss), pro průměr přes celou dávku nebo dataset o nákladové funkci (cost). Rozdíl je terminologický, princip je stejný.

Trénink je pak optimalizační úloha: hledají se parametry, při kterých je průměrná ztráta co nejmenší. Aby to šlo dělat gradientně, musí být ztráta vzhledem k parametrům diferencovatelná (aspoň skoro všude). Gradient říká, kterým směrem parametry posunout, a neuronová síť ho počítá zpětným šířením chyby.

Proč na volbě záleží víc, než se čeká

Ztrátová funkce je místo, kde se do modelu vkládá definice úspěchu. Model nemá žádnou vlastní představu o tom, co je „dobře“: má jen tohle číslo. Když se u predikce ceny použije střední kvadratická chyba (MSE), model se bude extrémně bát velkých odchylek, protože ty umocňuje. Absolutní chyba (MAE) je vůči odlehlým hodnotám mnohem klidnější, ale hůř se derivuje v nule a trestá malé chyby lineárně.

U klasifikace hraje stejnou roli křížová entropie: netrestá jen špatnou třídu, ale i sebejistotu. Model, který si je jistý na 99 % a mýlí se, dostane mnohem větší ztrátu než model, který váhá.

Typické volby podle úlohy

  • Regrese: MSE, MAE, Huber (kompromis mezi oběma).
  • Binární klasifikace: binární křížová entropie (log loss).
  • Vícetřídní klasifikace: kategorická křížová entropie, obvykle nad softmax výstupem.
  • Jazykové modely: křížová entropie nad slovníkem tokenů, reportovaná často jako perplexita.
  • Metrické učení a embeddingy: contrastive, triplet nebo InfoNCE ztráta.

Ztráta versus metrika

Ztrátová funkce a hodnoticí metrika nejsou totéž. Metrika (přesnost, F1, ROC AUC, tržba) měří to, co skutečně zajímá zadavatele, ale bývá nespojitá nebo nediferencovatelná, takže se podle ní nedá optimalizovat gradientně. Ztrátová funkce je její hladká náhrada. Když se obě rozejdou, klesající ztráta nemusí znamenat lepší produkt.

Regularizace jako součást cíle

K základní ztrátě se běžně přičítá penalizační člen: L2 (weight decay) trestá velké váhy, L1 tlačí část vah k nule. Celkový cíl pak není jen „netrefovat se vedle“, ale „netrefovat se vedle jednoduchým modelem“. Podobně se přidávají váhy tříd, když jsou data nevyvážená, nebo se chyby vzácné třídy zdraží ručně.

Kde to v praxi drhne

Nejčastější zdroj problémů je nesoulad mezi tvarem výstupu a ztrátou: sigmoid aplikovaný dvakrát, křížová entropie krmená pravděpodobnostmi místo logitů, chybějící numericky stabilní varianta. Výsledkem bývá NaN nebo trénink, který se zastaví na plató. Druhý zdroj je optimalizace čísla, které nikoho nezajímá: ztráta krásně klesá a konverzní poměr se nehne.

Příklady z praxe

  1. Křížová entropie z logitů v PyTorchi

    Klasifikátor deseti tříd vrací surové logity, ne pravděpodobnosti. Funkce CrossEntropyLoss si softmax počítá sama a numericky stabilně, takže přidat softmax do modelu je klasická chyba: ztráta pak klesá pomalu a model je podivně nejistý. Následující kód ukazuje správné zapojení.

    import torch, torch.nn as nn
    
    logits = torch.randn(8, 10)          # dávka 8 vzorků, 10 tříd
    targets = torch.randint(0, 10, (8,)) # indexy správných tříd
    
    criterion = nn.CrossEntropyLoss()
    loss = criterion(logits, targets)    # softmax je uvnitř
    loss.backward()
  2. Detekce podvodů, kde MSE selže

    V datasetu plateb je 0,3 % podvodných transakcí. Model trénovaný na nevážené ztrátě se naučí předpovídat vždy „v pořádku“, protože tím dosáhne nejnižší průměrné chyby i 99,7% přesnosti. Přiřazení vyšší váhy podvodné třídě ve ztrátové funkci (nebo focal loss) změní cenu chyby a model začne rizikové platby vůbec označovat.

    weights = torch.tensor([1.0, 50.0])   # podvod je 50x dražší
    criterion = nn.CrossEntropyLoss(weight=weights)

Časté omyly

MýtusKdyž ztráta klesá, model se zlepšuje.
Ve skutečnostiKlesající trénovací ztráta znamená jen lepší shodu s trénovacími daty. Při přeučení validační ztráta zároveň roste. A i klesající validační ztráta nemusí odpovídat lepší obchodní metrice, pokud ztráta měří něco jiného než to, na čem záleží.
MýtusZtrátová funkce je vlastnost modelu, takže pro danou architekturu je daná.
Ve skutečnostiZtrátová funkce je součást zadání úlohy, ne architektury. Tutéž síť lze trénovat na MSE, křížovou entropii i triplet loss a chová se pak úplně jinak.
MýtusHodnota ztráty se dá porovnávat mezi projekty, nižší je lepší.
Ve skutečnostiAbsolutní hodnota ztráty závisí na škále dat, počtu tříd i redukci (průměr versus součet). Porovnávat má smysl jen běhy nad stejnými daty a stejnou ztrátovou funkcí.

Časté dotazy

Jak vybrat ztrátovou funkci pro konkrétní úlohu?
Volba ztrátové funkce vychází z typu výstupu a z toho, které chyby jsou v praxi drahé. Pro spojitý výstup se začíná u MSE, a pokud data obsahují odlehlé hodnoty, přechází se na MAE nebo Huber. Pro klasifikaci je výchozí volbou křížová entropie nad logity. Teprve když standardní ztráta nedává výsledky odpovídající obchodnímu cíli, přidávají se váhy tříd, focal loss nebo vlastní penalizace. Vždy platí, že ztrátová funkce má být hladkou náhradou metriky, podle které se projekt hodnotí.
Proč ztráta při tréninku najednou skočí na NaN?
Hodnota NaN ve ztrátě obvykle vzniká numerickým přetečením nebo logaritmem z nuly. Typické příčiny jsou příliš vysoká learning rate, křížová entropie počítaná z pravděpodobností místo logitů, dělení nulou v normalizaci nebo chybějící clipping gradientů. Řešením bývá snížit learning rate, používat vestavěné stabilní varianty ztrát (například CrossEntropyLoss místo ručního log softmaxu), oříznout gradienty a zkontrolovat vstupní data na chybějící hodnoty. Pomáhá také trénovat v mixed precision se správným škálováním gradientů.
Jde ztrátovou funkci napsat vlastní?
Vlastní ztrátovou funkci lze v PyTorchi i TensorFlow napsat jako běžnou funkci nad tenzory: stačí, aby byla složená z diferencovatelných operací, protože automatické derivování si gradient odvodí samo. Používá se to tam, kde standardní ztráty nevystihují cenu chyby, například když je podhodnocení poptávky dražší než nadhodnocení. Riziko je numerická stabilita a nechtěná plochá místa, kde gradient zmizí. Vlastní ztrátu je proto vhodné otestovat na malé dávce a porovnat s referenční implementací.
Jaký je vztah mezi ztrátovou funkcí a gradientním sestupem?
Gradientní sestup potřebuje ztrátovou funkci jako krajinu, ve které hledá minimum. Ztráta určuje hodnotu v každém bodě prostoru parametrů, gradient udává směr nejrychlejšího růstu a optimalizátor posouvá parametry proti němu. Bez diferencovatelné ztráty nemá gradientní sestup co počítat, proto se nediferencovatelné metriky jako přesnost nahrazují hladkými ztrátami. Tvar ztrátové funkce zároveň ovlivňuje, jak snadno trénink konverguje: strmé oblasti vedou k explodujícím gradientům, ploché k učení, které se prakticky zastaví.

Zdroje

  1. torch.nn documentation(otevře se v novém okně)PyTorch
  2. tf.keras.losses(otevře se v novém okně)TensorFlow
  3. Loss function(otevře se v novém okně)Wikipedia
  4. Cross entropy(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.