Přeskočit na obsah
4/30Kapitola 4 z 30

Klasifikace, křížová entropie a jak neobelhat sami sebe

Sestavte logistický klasifikátor a zjistěte, proč 98 % přesnost může znamenat model, který nenajde vůbec nic.

Na této stránce

Model, který o každém dílu sjíždějícím z pásu odpoví tahle součástka je v pořádku, má pravdu v 98,15 % případů. Zároveň je k ničemu: ze 74 vadných dílů v testovací sadě nezachytí ani jeden.

Obě věty popisují tentýž model. Vzdálenost mezi nimi je tato kapitola.

První polovina klasifikátor sestaví. Nepotřebuje skoro nic nového: kapitola 2 dala recept, jak převést předpoklad o tom, jak data vznikají, na ztrátovou funkci, a kapitola 3 dala aparát pro sestup z kopce po jakékoli ztrátě, kterou vám tento recept předá. Použijte obojí na otázku ano/ne a vypadne z toho logistická regrese plus jedna nová myšlenka — logit — ke které se znovu vrátíme v kapitole 17.

Druhá polovina je ta těžší. Všechno od tohoto místa v kurzu se posuzuje podle čísla, které někdo změřil, a pokud nedokážete rozlišit skutečné zlepšení od artefaktu měření, každá další kapitola je jen ozdoba. Takže: matice záměn, precision a recall, tři splity, leakage a otázka, na kterou skoro nikdo neodpovídá poctivě — kolik testovacích příkladů vlastně potřebuji?

Výpočty zde běží přes 20 000 řádků, takže jsou celé vektorizované — NumPy dělá práci už od kapitoly 2 a odteď už nestojí za to na to upozorňovat.

Stejná továrna jako v kapitole 1, těžší otázka. Místo přijmout, nebo vyřadit zní otázka je tento díl vadný — a vady jsou vzácné, což dělá měřicí polovinu této kapitoly těžkou a modelovací polovinu klamně snadnou.

belt.pyPYTHON
import numpy as np

rng = np.random.default_rng(4)
N = 20_000
width  = rng.normal(22.0, 0.9, N)      # millimetres
weight = rng.normal(57.0, 3.0, N)      # grams

z_true = -5.90 + 1.90 * (width - 22.0) + 0.42 * (weight - 57.0)
y = (rng.random(N) < 1 / (1 + np.exp(-z_true))).astype(float)

perm = rng.permutation(N)
train, val, test = perm[:12_000], perm[12_000:16_000], perm[16_000:]
TEXT
N = 20000  defects = 337  base rate = 0.0169
defects per split = 203 60 74

Tři splity, ne dva. Důvod si zaslouží vlastní oddíl a jeden níže dostane; prozatím trénujte na prvním, laděte na druhém a na třetí se nedívejte.

Features jsou standardizované — odečtený průměr, vydělené směrodatnou odchylkou — za použití pouze statistik trénovací sady, z důvodu, který kapitola 1 ukázala na konvergenční mezi perceptronu: necentrovaná data dělají geometrii nepřátelskou. Z kterých řádků tento průměr smíte počítat, se později v této kapitole stane živá otázka.

Perceptron vracel znaménko. Znaménko nedokáže rozlišit vyřadit od vyřadit, ale jen těsně, a přesně tento rozdíl továrna potřebuje, aby rozhodla, které díly má člověk znovu zkontrolovat jako první.

Držte se tedy doslova receptu z kapitoly 2. Zapište, co tvrdíte o tom, jak vzniká label, vezměte likelihood, vezměte logaritmus, změňte znaménko a máte ztrátu. Pro výsledek ano/ne je tím tvrzením Bernoulliho rozdělení: existuje pravděpodobnost pp, že díl je vadný, a

P(yp)=py(1p)1yP(y \mid p) = p^{\,y}\,(1-p)^{\,1-y}

což je jen kompaktní způsob, jak napsat „pp pokud y=1y = 1, a 1p1-p pokud y=0y = 0“. Vezměte z toho logaritmus a změňte znaménko; ztráta pro jeden příklad je

L=[ylogp+(1y)log(1p)]L = -\big[\,y \log p + (1 - y)\log(1 - p)\,\big]

To je binární křížová entropie. Nebyla vybrána proto, že je pohodlná; je to záporný log-likelihood jediného rozdělení, které může mít hod mincí. Nic jiného k dispozici nebylo.

Stále chybí, odkud se bere pp. Model počítá vážený součet s=wx+bs = \mathbf{w}\cdot\mathbf{x} + b, což je reálné číslo v celém rozsahu přímky, zatímco pravděpodobnost musí ležet v (0,1)(0,1). Funkce, která mezi nimi převádí, je logistický sigmoid:

σ(s)=11+es\sigma(s) = \frac{1}{1 + e^{-s}}
TEXT
logit -4.0  ->  p = 0.0180        loss when y=1 and p=0.9  : 0.1054
logit -1.0  ->  p = 0.2689        loss when y=1 and p=0.5  : 0.6931
logit  0.0  ->  p = 0.5000        loss when y=1 and p=0.01 : 4.6052
logit  4.0  ->  p = 0.9820

Pravý sloupec čtěte jako ceník. Mít pravdu s 90% jistotou stojí 0,105. Odmítnout se rozhodnout stojí 0,693 — což je log2\log 2, cena pokrčení rameny. Mýlit se sebejistě stojí 4,6, čtyřiačtyřicetkrát víc, a cena roste bez omezení, jak si model je svou chybou jistější. Cross-entropy chyby jen nepočítá: účtuje si za aroganci.

Kapitola 3 říkala: chcete-li cokoli trénovat, získejte derivaci ztráty podle každého parametru. Udělejte to pro jeden příklad. S s=wx+bs = \mathbf{w}\cdot\mathbf{x} + b a p=σ(s)p = \sigma(s):

Ls=py,Lw=(py)x,Lb=py\frac{\partial L}{\partial s} = p - y, \qquad \frac{\partial L}{\partial \mathbf{w}} = (p - y)\,\mathbf{x}, \qquad \frac{\partial L}{\partial b} = p - y
Zobrazit podrobnosti

Dva řádky, díky kterým se nepořádek vyruší. Sigmoid má neobvykle příjemnou derivaci, σ(s)=σ(s)(1σ(s))=p(1p)\sigma'(s) = \sigma(s)\,(1 - \sigma(s)) = p(1-p). A ztráta se derivuje na

Lp=yp+1y1p=pyp(1p)\frac{\partial L}{\partial p} = -\frac{y}{p} + \frac{1-y}{1-p} = \frac{p - y}{p\,(1-p)}

Vynásobte obojí podle řetězového pravidla a p(1p)p(1-p) se objeví jednou nahoře a jednou dole. Přesně se vyruší a přežije pyp - y. Toto vyrušení není náhoda — děje se vždy, když je ztráta záporný log-likelihood rozdělení a výstupní funkce je ta, kterou toto rozdělení přirozeně používá. Tato dvojice má jméno — generalizovaný lineární model — a úhledný gradient je její otisk prstu.1

Aktualizace je tedy predikce minus pravda, krát vstup. Nic víc. Tady je celý trainer, tedy descent z kapitoly 3 s jedním změněným řádkem:

logistic.pyPYTHON
def sigmoid(z):
    return np.where(z >= 0, 1.0 / (1.0 + np.exp(-z)),
                    np.exp(np.minimum(z, 0)) / (1.0 + np.exp(np.minimum(z, 0))))


def fit_logistic(X, y, lr=0.5, epochs=4000):
    w, b = np.zeros(X.shape[1]), 0.0
    for _ in range(epochs):
        p = sigmoid(X @ w + b)
        g = p - y                        
        w -= lr * (X.T @ g) / len(y)     
        b -= lr * g.sum() / len(y)       
    return w, b

np.where v sigmoid není kosmetika. Přímý výpočet 1/(1+es)1/(1+e^{-s}) přeteče pro velké záporné ss; větev vybere tu algebraicky totožnou podobu, která udrží exponent záporný. To si floating-point krabice z kapitoly 2 vybírá svůj první dluh a o dva oddíly dál si vybere větší.

Proč ne čtvercovou chybu a proč odpověď souvisí s gradientem

Odkaz na sekci: Proč ne čtvercovou chybu a proč odpověď souvisí s gradientem

Standardní vysvětlení, proč dát přednost cross-entropy před čtvercovou chybou, je likelihood argument výše: čtvercová chyba je to, co dostanete při předpokladu gaussovského šumu, labels gaussovské nejsou, tedy to nedělejte. Je to správně a nikoho to nepřesvědčí, protože můžete napsat L=(py)2L = (p - y)^2 přes sigmoid a bude se to trénovat.

Argument, který dopadne, je o gradientu. Položte čtvercovou chybu na sigmoid a řetězové pravidlo dá

Ls=2(py)p(1p)\frac{\partial L}{\partial s} = 2\,(p - y)\,p\,(1-p)

To dodatečné p(1p)p(1-p) je člen, který se předtím vyrušil. Teď se nevyruší a jde k nule vždy, když je model sebejistý — včetně situace, kdy se model sebejistě mýlí. Vyhodnoťte obojí pro několik skóre, pro příklad, jehož skutečný label je 1:

skóre ssppcross-entropy L/s\partial L/\partial sčtvercová chyba L/s\partial L/\partial spoměr
8-80.0003350.999665-0.9996650.000670-0.0006701 491
4-40.0179860.982014-0.9820140.034690-0.03469028.3
2-20.1192030.880797-0.8807970.184956-0.1849564.8
000.5000000.500000-0.5000000.250000-0.2500002.0
+2+20.8807970.119203-0.1192030.025031-0.0250314.8

Při s=8s = -8 se model mýlí tak moc, jak je vůbec možné, a čtvercová chyba odpoví gradientem 1 491krát menším než cross-entropy. Čím horší chyba, tím méně se z ní model učí. Gradient cross-entropy se mezitím saturuje na 1-1: maximálně špatně znamená maximálně velký signál, a ne větší.

Spusťte závod. Dva tisíce vyvážených bodů, identické počáteční váhy zvolené tak, aby byly sebejistě špatně (w=[6,6]\mathbf{w} = [-6, -6]), identická learning rate, liší se jen ztráta. Obě běhy jsou skórovány pomocí cross-entropy, aby byly sloupce srovnatelné.

epochacross-entropy lossaccuracysquared-error lossaccuracy
15.48650.23005.94990.2290
101.55250.24605.90420.2290
500.46420.77805.69130.2320
1000.46390.77705.39550.2410
2000.46390.77704.63110.2745
5000.46390.77700.52910.7660
1,0000.46390.77700.46400.7765

Cross-entropy je hotová v epoše 50. Čtvercová chyba je v epoše 100 pořád na 24 % accuracy — a od epochy 10 se nepohnula z 23 % — hůř než hádání, protože začala sebejistě špatně a gradient, který by ji zachránil, byl vynásoben 0,0007. Uteče z toho kolem epochy 500 a skončí na stejném místě. Poctivé shrnutí tedy zní: čtvercová chyba nad sigmoidem není nesprávná; je pomalá přesně tam, kde na rychlosti záleží nejvíc. Na modelu se dvěma parametry ztratíte 450 epoch. Na síti se sto vrstvami, kde je nějaká jednotka někde vždy sebejistě špatně, ztratíte celý trénovací běh.

Entropie, cross-entropy a KL na jedné stránce

Odkaz na sekci: Entropie, cross-entropy a KL na jedné stránce

Tři veličiny, které budete pořádně potřebovat v kapitole 8 pro perplexity a v kapitole 11 pro penalizaci, která drží fine-tuned politiku blízko její reference. Jsou snazší, než jakou mají pověst.2

Entropie je průměrný počet bitů, které musíte utratit, abyste sdělili losování z rozdělení, pokud pro něj použijete nejlepší možný kód:

H(p)=ipilog2piH(p) = -\sum_i p_i \log_2 p_i

Cross-entropy je to, co utratíte, když použijete kód postavený pro qq na data, která ve skutečnosti pocházejí z pp:

H(p,q)=ipilog2qiH(p, q) = -\sum_i p_i \log_2 q_i

KL divergence je přebytek — plýtvání v bitech způsobené tím, že věříte qq, když pravda je pp:

DKL(pq)=H(p,q)H(p)D_{\mathrm{KL}}(p \parallel q) = H(p,q) - H(p)

Ověřte všechny tři na pásu:

TEXT
test defect rate                                = 0.0185
entropy of that coin                            = 0.1329 bits
cross-entropy of the constant predictor on test = 0.1330 bits
KL(test coin || fair coin)                      = 0.8671 bits
H + KL                                          = 1.0000 bits
cross-entropy of the p=0.5 predictor on test    = 1.0000 bits

Jsou tam vidět dvě věci. Za prvé, model, který prostě hlásí základní míru z tréninku, 1,69 %, dosáhne cross-entropy 0,1330 bitu, téměř přesně entropie testovacích labels — jak musí, protože má správné rozdělení a žádnou další informaci. Entropie je podlaha, kterou vám koupí neznalost jednotlivce. Za druhé, model, který pokrčí rameny a řekne 0,5, zaplatí přesně 1 bit, a rozdíl mezi nimi, 0,8671 bitu, je přesně KL divergence. H+DKL=H(p,q)H + D_{\mathrm{KL}} = H(p,q) není identita k zapamatování; je to účet, který můžete sledovat, jak se sčítá.

A spojení zpět k trénování: když je label jedna známá třída, „skutečné“ rozdělení je one-hot, jeho entropie je nula a cross-entropy se rovná KL divergenci. Minimalizace cross-entropy a přitahování rozdělení modelu k pravdě jsou tentýž čin.

Více než dvě odpovědi: softmax a posun, který nic nestojí

Odkaz na sekci: Více než dvě odpovědi: softmax a posun, který nic nestojí

Vadný neznamená jednu věc. Při vstřikování může díl vyjít jako nedostřik (málo materiálu), přetok (příliš mnoho, vytlačené z formy), nebo spálenina. Čtyři výsledky, tedy čtyři logits, a ty se musí stát čtyřmi pravděpodobnostmi se součtem jedna. To je softmax:

softmax(z)i=ezijezj\operatorname{softmax}(\mathbf{z})_i = \frac{e^{z_i}}{\sum_j e^{z_j}}

Má vlastnost, která vypadá jako náhoda a ve skutečnosti je celou implementací:

softmax(z+c)=softmax(z)\operatorname{softmax}(\mathbf{z} + c) = \operatorname{softmax}(\mathbf{z})

pro libovolnou konstantu cc, protože ezi+c=ecezie^{z_i + c} = e^{c} e^{z_i} a ece^c se vyruší nahoře i dole. Význam mají jen rozdíly mezi logits. Absolutní úroveň není informace.

Naštěstí, protože absolutní úroveň je to, co rozbije počítač:

TEXT
logits            = [800. 801. 799.]
naive softmax     = [nan nan nan]
shifted by -max   = [0.2447 0.6652 0.09  ]
same softmax after adding 1000 to every logit: True

e800e^{800} přeteče 64bitový float, součet se stane nekonečnem a nekonečno dělené nekonečnem je nan — žádná chyba, žádný pád, jen tichá díra tam, kde dřív byly tři pravděpodobnosti. Odečtení maximálního logit matematicky nezmění nic a numericky všechno, protože největší exponent se stane přesně e0=1e^0 = 1. Je to trik logsumexp z kapitoly 2 v pracovním oděvu a dělá to každá seriózní implementace:

softmax.pyPYTHON
def softmax(Z):
    Z = Z - Z.max(axis=1, keepdims=True)   
    E = np.exp(Z)
    return E / E.sum(axis=1, keepdims=True)


def fit_softmax(X, Y, lr=1.0, epochs=6000):
    W, b = np.zeros((X.shape[1], Y.shape[1])), np.zeros(Y.shape[1])
    for _ in range(epochs):
        G = (softmax(X @ W + b) - Y) / len(X)   
        W -= lr * (X.T @ G)
        b -= lr * G.sum(0)
    return W, b

Gradient je znovu predikce minus pravda, nyní s YY one-hot. Binární případ byl celou dobu jen speciální případ.

Natrénováno na 3 000 dílech a otestováno na 1 000, se třemi měřeními pro každý (šířka, hmotnost, teplota taveniny), dosáhne 94,00 % accuracy. Tady je, co toto číslo skrývá:

pravda ↓ / predikce →oknedostřikpřetokspáleninarecall
ok8505900.984
nedostřik2221000.488
přetok2003010.588
spálenina300390.929
precision0.9500.8080.7690.975

Model najde méně než polovinu nedostřiků. Accuracy to nevidí, protože 86 % dílů je v pořádku a správně trefit tyto díly stačí k utažení průměru. Macro F1 — průměr F1 skóre po třídách, který vzácné třídě dává stejnou váhu jako běžné — je 0,7983, oproti micro F1 0,9400, které je z definice totožné s accuracy. Kdykoli někdo nahlásí jedno číslo F1, zeptejte se které.

Tím končí modelování. Zbytek kapitoly je o číslech.

Vezměte natrénovaný binární model a vytvořte dvě varianty vynásobením každého logit konstantou: 0,35 pro váhavou verzi, 4 pro přehnaně sebejistou. Násobení kladným číslem nemůže změnit žádné znaménko, takže všechny tři modely predikují přesně stejný label pro všech 4 000 testovacích dílů. Accuracy je nerozliší. Cross-entropy s tím nemá žádný problém:

modelaccuracycross-entropyprůměrná ztráta při správné odpovědiprůměrná ztráta při chyběnejhorší jednotlivá ztráta
váhavý (logits × 0.35)0.98300.15490.13691.19902.80
jak byl natrénován0.98300.05640.01472.46897.82
přehnaně sebejistý (logits × 4)0.98300.15630.00099.142727.63

Váhavý model platí malou daň za každý díl, včetně tisíců těch, které trefí správně. Přehnaně sebejistý je při správné odpovědi téměř zdarma a při chybě katastrofální — jeden díl v této testovací sadě ho sám o sobě stojí 27,63 nats. Ty dva skončí skoro na stejném součtu opačnými cestami a natrénovaný model, jehož pravděpodobnosti jsou kalibrované na data, sedí třikrát níž než oba.

To je nejostřejší způsob, jak vyjádřit rozdíl mezi ztrátou a metrikou. Ztráta je to, co optimalizujete: musí být diferencovatelná a vidí všechno, co model řekl, včetně toho, jak si byl jistý. Metrika je to, podle čeho jste souzeni: může to být schodová funkce, obchodní pravidlo, počet přehlédnutých vad. Nejsou to stejné objekty a ne vždy se shodnou — proto obojí definujete předem a nikdy nenecháte ztrátu zastupovat metriku jen proto, že se zrovna zobrazuje na obrazovce.

Před jakýmkoli modelem požadavek: jaké skóre má nejlínější možná odpověď? Na tomto pásu vždy řekněte v pořádku:

TEXT
always-say-fine baseline: accuracy = 0.9815
confusion (tn, fp, fn, tp) = (3926, 0, 74, 0)

98,15 %. Teď natrénovaný logistický model při výchozím threshold 0,5:

TEXT
logistic @0.5: accuracy=0.9830 precision=0.8000 recall=0.1081 F1=0.1905
confusion (tn, fp, fn, tp) = (3924, 2, 66, 8)

98,30 %. Porazil baseline o 0,15 procentního bodu a každá zpráva, která skončí u accuracy, to označí za vítězství. Matice záměn říká, co se skutečně stalo:

predikováno v pořádkupredikováno vadné
skutečně v pořádku3,9242
skutečně vadné668

Našel 8 vadných dílů ze 74 a 66 pustil dál. Tři čísla pojmenovávají tři způsoby, jak tuto tabulku číst:

  • Precision =TP/(TP+FP)=8/10=0.800= \mathrm{TP}/(\mathrm{TP}+\mathrm{FP}) = 8/10 = 0.800. Z dílů, které označil, kolik bylo skutečně vadných. To je cena zbytečných kontrol.
  • Recall =TP/(TP+FN)=8/74=0.108= \mathrm{TP}/(\mathrm{TP}+\mathrm{FN}) = 8/74 = 0.108. Z vadných dílů, kolik jich zachytil. To je cena odeslání špatného dílu zákazníkovi.
  • F1 =2PR/(P+R)=0.190= 2PR/(P+R) = 0.190, jejich harmonický průměr, který zůstává blízko menší z obou hodnot, a proto se nenechá lichotit jen jednou z nich.

Na čem záleží, určuje továrna, ne matematika: kontrola stojí pár sekund a odeslaná vada stojí svolávací akci, takže zde dominuje recall a 0,108 je selhání.

Problém ale není model. Problém je threshold, a threshold není součástí modelu — je to obchodní rozhodnutí aplikované následně na pravděpodobnost. Projeďte ho:

thresholdTPFPFNaccuracyprecisionrecallF1
0.50082660.98300.8000.1080.190
0.2002728470.98120.4910.3650.419
0.10042118320.96250.2630.5680.359
0.05054236200.93600.1860.7300.297
0.0206757070.85580.1050.9050.188
0.005711,36030.65930.0500.9590.094

Čtěte sloupec accuracy směrem dolů. Celou dobu klesá — z 98,30 % na 65,93 % — zatímco model přechází od zachycení 8 vad k zachycení 71 ze 74. Každá užitečná věc, kterou tento model umí udělat, jeho accuracy zhoršuje. Tým optimalizující hlavní číslo by nasadil verzi, která nenajde nic.

Zobrazit podrobnosti

Vážení tříd nevytváří signál, posouvá provozní bod. Obvyklým prvním reflexem u nevyvážených tříd je navážit vzácnou třídu ve ztrátě. Když to uděláte s vahami 1, 10 a 60 na pozitivních příkladech:

váha pozitivníchaccuracyprecisionrecallF1AUC
10.98300.8000.1080.1900.9363
100.96050.2530.5810.3520.9361
600.82900.0910.9190.1660.9361

Precision a recall se posunou hodně. AUC — pravděpodobnost, že model seřadí náhodný vadný díl nad náhodný dobrý, která threshold úplně ignoruje — se posune o 0,0002, tedy o nic. Převážení posunulo stejný model po stejné křivce trade-offu. To je často přesně to, co chcete, a nikdy to není nová informace: pokud je řazení špatné, žádné váhovací schéma ho nezachrání.

Tři splity a leak, který právě najdete

Odkaz na sekci: Tři splity a leak, který právě najdete

Proč tři splity a ne dva? Protože ve chvíli, kdy sadu příkladů použijete k tomu, abyste vybrali cokoli — threshold, learning rate, který ze šesti modelů nasadit — tato sada už byla použita k fittingu a její skóre přestane být nestranné.3 Změřeno na tomto pásu: sweep threshold na validační sadě vybere 0,196 a model pak na nedotčené testovací sadě dosáhne F1 = 0,4122. Kdyby sweep proběhl přímo na testovací sadě, nejlepší dosažitelná hodnota by tam byla 0,4186 — číslo, které nikdo nemá právo reportovat.

Rozdíl je zde malý, 0,006, protože jde o jeden hyperparametr jednou projetý proti 4 000 validačních příkladů. Roste s každým dalším rozhodnutím a každým zmenšením validační sady. Všimněte si také, že směr není v jednom běhu zaručený: zvolený threshold měl na validaci skóre 0,3902 a na testu 0,4122, takže validace ho tentokrát podhodnotila. Bias je systematický napříč mnoha rozhodnutími, ne viditelný v jednom.4

Teď cvičení. Log pásu dorazí s třetím sloupcem, station_seconds: jak dlouho každý díl strávil na kontrolním stanovišti. Jeho přidání je jednořádková změna v preprocessingu. Tady je, co udělá:

modelaccuracyprecisionrecallF1cross-entropyAUC
šířka + hmotnost0.98300.8000.1080.1900.05640.9363
+ station_seconds0.99200.7920.7700.7810.02360.9970

Recall skočí z 10,8 % na 77,0 %. F1 se více než zečtyřnásobí. A všimněte si, co udělala accuracy: 98,30 % → 99,20 %, zisk devíti desetin bodu, tedy typ čísla, které se ve shrnujícím slidu zaokrouhlí na „tak jako tak asi 99 %“. Accuracy dříve neviděla selhání a teď nevidí podvod.

Než budete číst dál: model podvádí. Zjistěte jak.

Jak lovit leak, v pořadí, které ho najde nejrychleji.

  1. Porovnejte train a test. Overfitting se projeví jako velký rozdíl. Zde: poctivý model 0,9838 train / 0,9830 test; model s leakem 0,9936 train / 0,9920 test. Oba rozdíly jsou pod 0,2 bodu. Leak nevypadá jako overfitting — uniklá feature je stejně dostupná v testu, takže model skvěle generalizuje do světa, který neexistuje.

  2. Natrénujte jeden model na každou feature samostatně. Cokoli, co nese odpověď, se samo přihlásí:

    feature samostatněaccuracyrecallF1AUC
    šířka0.98150.0140.0260.8691
    hmotnost0.98150.0000.0000.7914
    station_seconds0.98500.4050.5000.9960

    Jeden sloupec sám o sobě řadí vady s AUC 0,9960. Dvě měření pořízená posuvným měřidlem a vahou zvládnou 0,87 a 0,79. Tato asymetrie je alarm.

  3. Zeptejte se, kdy bylo každé číslo zapsáno. Průměrná doba setrvání: 2,23 sekundy pro díly, které prošly, 15,56 sekundy pro díly, které neprošly. Samozřejmě. Díl setrvá na stanovišti protože ho inspektor stáhl z pásu — což se stane až poté, a jen proto, že se někdo rozhodl, že je vadný. Sloupec není měření dílu. Je to měření verdiktu.

the planted leakPYTHON
station = 1.8 + rng.exponential(0.35, N)                     # a part just passing through
audited = rng.random(N) < 0.006                              # random spot checks
station[audited] += rng.uniform(6.0, 26.0, audited.sum())
station[y == 1] = 9.0 + rng.exponential(7.0, (y == 1).sum())  

Zvýrazněný řádek je leak: doba setrvání vadného dílu je tažena z jiného rozdělení, protože ho člověk sundal z pásu. To je nejběžnější závažná chyba v aplikovaném machine learningu a má jméno: target leakage — informace v trénovacích features, která by nebyla dostupná ve chvíli, kdy je třeba predikci udělat.5 Nevyhodí žádnou výjimku. Vyrobí lepší číslo. Každá pobídka v projektu směřuje k tomu, abyste si ho nechali.

Obranou je jedna otázka položená u každého sloupce: existuje tato hodnota v okamžiku, kdy tuto predikci potřebuji? Na živém pásu je station_seconds neznámé až do chvíle po kontrole dílu — což je věc, kterou měl model nahradit.

Kolik testovacích příkladů potřebuji?

Odkaz na sekci: Kolik testovacích příkladů potřebuji?

Představte si, že ohodnotíte model na 20 příkladech a 17 z nich trefí správně. Nahlásíte 85 %.

TEXT
17 correct out of 20 -> accuracy 0.8500
  Wilson    95% CI : [0.6396, 0.9476]
  bootstrap 95% CI : [0.7000, 1.0000]
  P(a 65% model scores 17 or more out of 20) = 0.0444
  P(an 85% model scores 17 or more out of 20) = 0.6477

Poctivé čtení 17/20 je někde mezi 64 % a 95 %. Skutečný 65% model vyprodukuje tento výsledek ve 4,4 % případů — jeden běh z třiadvaceti — a pokud jste vyzkoušeli několik prompts a nahlásili nejlepší, vyrobili jste si tento běh sami. Sedmnáct z dvaceti nedokáže odlišit 85% model od 65%.

Dva způsoby, jak dát intervalu míru, a oba patří do vaší výbavy:

uncertainty.pyPYTHON
def wilson(k, n, z=1.959963985):
    """95% interval for k successes in n trials. Correct at small n; no simulation."""
    ph, d = k / n, 1 + z * z / n
    centre = (ph + z * z / (2 * n)) / d
    half = z * (ph * (1 - ph) / n + z * z / (4 * n * n)) ** 0.5 / d
    return centre - half, centre + half


def bootstrap_ci(correct, n_resamples=10_000, alpha=0.05, seed=0):
    """95% interval for the mean of any per-example score array. Works on F1 too."""
    rng = np.random.default_rng(seed)
    correct = np.asarray(correct, dtype=float)
    draws = correct[rng.integers(0, len(correct), size=(n_resamples, len(correct)))]
    lo, hi = np.quantile(draws.mean(axis=1), [alpha / 2, 1 - alpha / 2])
    return float(correct.mean()), float(lo), float(hi)

Použijte Wilson6 pro obyčejnou míru úspěchu; chová se dobře při libovolném nn a nepotřebuje náhodnost. Všimněte si výše, že při n=20n = 20 je horní konec bootstrapu 1,0000 — resampling 20 bodů snadno vytáhne 20 správných, takže nedokáže reprezentovat interval užší než vlastní granularitu. Použijte bootstrap7 tam, kde neexistuje vzorec, což je většina zajímavých případů: F1, macro-průměry, BLEU, pass@1, skóre rubric-based judge. Na tomto pásu nese F1 vyladěného modelu 0,4122 bootstrap interval [0.3009, 0.5156] — a právě toto číslo má být ve zprávě, protože bodový odhad sám láká ke srovnání, které nemůže podpořit.

Ještě jedno měření, protože mění způsob, jakým byste měli porovnávat dva modely. Dva modely skórované na stejných 500 příkladech:

TEXT
model A: 0.8580  95% CI [0.8260, 0.8880]
model B: 0.8120  95% CI [0.7780, 0.8460]
the two intervals overlap: True
paired difference A-B: 0.0460  95% CI [0.0260, 0.0680]
they disagree on 31 of 500 examples (A right 27, B right 4)

Jejich intervaly se překrývají a lidové pravidlo — překrývající se chybové úsečky znamenají žádný významný rozdíl — by označilo srovnání za neprůkazné. Není. Oba modely běžely na stejných příkladech, takže správnou veličinou je rozdíl po příkladech, jehož interval je [0.0260, 0.0680], pohodlně nad nulou. Neshodnou se jen na 31 z 500 položek a A vyhraje 27 z těchto neshod; sdílené příklady, snadné i těžké, se vyruší místo toho, aby přidávaly šum. Porovnávejte modely párově a dojdete ke stejnému závěru ze zlomku dat.

Teď máte model, který vrací kalibrované pravděpodobnosti, ztrátu odvozenou z tvrzení o datech místo vybranou pro pohodlí, gradient, který je doslova predikce minus pravda, a — důležitěji — aparát, jak zjistit, jestli cokoli z toho funguje. Desetiřádkový Wilsonův interval výše se znovu používá doslova: nese varianty prompt v kapitole 15, retrieval tabulky v kapitole 19 a golden set v kapitole 29. Bootstrap je to, po čem sáhnete, když neexistuje vzorec.

Model má ale pořád jen jednu vrstvu. Kreslí čáru a kapitola 1 na čtyřech řádcích XOR dokázala, že čára nestačí. Oprava je stackování: první vrstva, která ohne prostor, druhá, která v ohnutém prostoru nakreslí čáru.

Tady úhledný gradient této kapitoly dochází. Všechno výše fungovalo, protože L/s=py\partial L/\partial s = p - y šlo zapsat ručně, jednou, pro model s jednou vrstvou mezi vstupem a ztrátou. Vložte doprostřed druhou vrstvu a otázka změní tvar: jaká je derivace ztráty podle váhy, která se výstupu vůbec nedotýká — takové, jejíž vliv dorazí jen přes jinou vrstvu, možná několika cestami najednou?

Tato derivace existuje. Počítat ji ručně je beznadějné pro cokoli většího než hračka a počítat ji po jednom parametru je beznadějné v jiném měřítku. Potřeba je postup, který získá každou derivaci v síti z jednoho zpětného průchodu přes tentýž graf, kterým právě prošel dopředný průchod.

To je kapitola 5 a je to motor, na kterém běží zbytek tohoto kurzu.


Vedle této kapitoly stojí za přečtení také: Bishop, Pattern Recognition and Machine Learning §1.2, §1.5, §1.6 a §4.3, který pokrývá pravděpodobnost, teorii rozhodování, teorii informace a lineární klasifikaci v pořadí, které tato kapitola sleduje; Murphy, Probabilistic Machine Learning: An Introduction, kapitoly 6 a 10; Prince, Understanding Deep Learning §5.4–5.7; a Saito a Rehmsmeier, The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets (PLOS ONE, 2015) — proč by výše citované AUC nemělo být jediným threshold-free číslem, na které se díváte, když je vadných 1,7 % dílů.

  1. Ma, T. a Ng, A. CS229 Lecture Notes, Stanford University, kapitoly 2 a 3. Místo, kde vyrušení, které vytvoří pyp - y, přestane vypadat jako štěstí: vyberte rozdělení z exponenciální rodiny, které odpovídá vašemu výstupu, použijte jeho kanonický link a gradient je vždy predikce minus pravda.

  2. Olah, C. Visual Information Theory (2015), colah.github.io/posts/2015-09-Visual-Information. Nejjasnější dostupný výklad entropie, cross-entropy a KL divergence jako nákladů v bitech, ne jako vzorců.

  3. Abu-Mostafa, Y. S., Magdon-Ismail, M. a Lin, H.-T. Learning From Data (AMLBook, 2012), přednášky 13 a 17 kurzu Caltech. Přednáška 13 je validace; přednáška 17, o třech principech učení, je místo, kde je pojmenován data snooping. Dohromady jsou zdrojem disciplíny v této kapitole: každý pohled na datovou sadu je fitting rozhodnutí, ať jste spustili optimiser, nebo ne.

  4. James, G., Witten, D., Hastie, T. a Tibshirani, R. An Introduction to Statistical Learning, 2. vydání (Springer, 2021), kapitoly 2 a 5, pro rozklad bias–variance a resampling. Doprovodný svazek je místo, kde je selekční past řečena napřímo: Hastie, Tibshirani a Friedman, The Elements of Statistical Learning, 2. vydání, §7.10.2, The Wrong and Right Way to Do Cross-validation.

  5. Kaufman, S., Rosset, S., Perlich, C. a Stitelman, O. Leakage in Data Mining: Formulation, Detection, and Avoidance. ACM Transactions on Knowledge Discovery from Data 6(4), 2012. Formální zpracování selhání ukázaného výše, s případovými studiemi ze soutěží vyhraných modelem, který se naučil artefakt toho, jak byla data sestavena.

  6. Wilson, E. B. Probable Inference, the Law of Succession, and Statistical Inference. Journal of the American Statistical Association 22(158), s. 209–212 (1927). Score interval použitý výše v wilson(), pořád správný výchozí interval pro podíl. Učebnicový interval p^±zp^(1p^)/n\hat{p} \pm z\sqrt{\hat{p}(1-\hat{p})/n} je ten, kterému se vyhnout: dává nesmysly blízko 0 a 1 a při malém nn špatně pokrývá.

  7. Efron, B. Bootstrap Methods: Another Look at the Jackknife. The Annals of Statistics 7(1), s. 1–26 (1979). Myšlenka, která vám dovolí dát interval na jakoukoli statistiku, kterou umíte spočítat, včetně těch bez sampling theory.

Necháte výběr modelu na LIA?

Tvořte se všemi modely AI na jednom místě – začněte ještě dnes zdarma.