Classificació, entropia creuada i com no enganyar-te
Construeix un classificador logístic i descobreix per què un 98 % d’exactitud pot no trobar res.
En aquesta pàgina
Un model que respon aquesta peça està bé sobre cada peça que surt de la cinta encerta el 98,15 % de les vegades. I també no serveix de res: de les 74 peces defectuoses del conjunt de prova, no en detecta cap.
Totes dues frases descriuen el mateix model. La distància entre elles és aquest capítol.
La primera meitat construeix el classificador. Gairebé no necessita res de nou: el capítol 2 va donar la recepta per convertir una suposició sobre com es produeixen les dades en una funció de pèrdua, i el capítol 3 va donar la maquinària per baixar pendent avall sobre qualsevol pèrdua que aquesta recepta et lliuri. Aplica totes dues coses a una pregunta de sí/no i en surt la regressió logística, més una idea nova —un logit— que tornarà a passar factura al capítol 17.
La segona meitat és la difícil. A partir d’aquest punt del curs, tot es jutja amb un nombre que algú ha mesurat, i si no pots distingir una millora real d’un artefacte de mesura, tots els capítols següents són decoració. Així doncs: la matriu de confusió, la precisió i el recall, les tres particions, la fuita, i la pregunta que gairebé ningú respon honestament: quants exemples de prova necessito de debò?
L’aritmètica aquí passa per sobre de 20.000 files, de manera que està vectoritzada de cap a cap: NumPy fa la feina des del capítol 2, i d’ara endavant deixa de valer la pena comentar-ho.
La cinta, amb una pregunta més rara
Enllaç a la secció: La cinta, amb una pregunta més raraLa mateixa fàbrica que al capítol 1, pregunta més difícil. En lloc de acceptar o rebutjar, la pregunta és aquesta peça és defectuosa; i els defectes són rars, cosa que fa difícil la meitat de mesura d’aquest capítol i enganyosament fàcil la meitat de modelatge.
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:]N = 20000 defects = 337 base rate = 0.0169
defects per split = 203 60 74Tres particions, no dues. El motiu mereix una secció pròpia i la té més avall; de moment, entrena amb la primera, ajusta amb la segona i no miris la tercera.
Les característiques s’estandarditzen —se’n resta la mitjana i es divideixen per la desviació estàndard— fent servir només les estadístiques d’entrenament, pel motiu que el capítol 1 va demostrar amb la cota de convergència del perceptró: les dades no centrades fan que la geometria sigui hostil. De quines files tens permís per calcular aquesta mitjana es convertirà en una pregunta viva més endavant en aquest capítol.
D’un veredicte a una probabilitat
Enllaç a la secció: D’un veredicte a una probabilitatEl perceptró retornava un signe. Un signe no pot distingir rebutjar de rebutjar, però per poc, i aquesta diferència és exactament el que necessita una fàbrica per decidir quines peces hauria de reinspeccionar primer una persona.
Així que segueix literalment la recepta del capítol 2. Escriu què afirmes sobre com es produeix una etiqueta, pren la versemblança, pren-ne el logaritme, nega’l, i tens una pèrdua. Per a un resultat de sí/no, l’afirmació és una distribució Bernoulli: hi ha una probabilitat que la peça sigui defectuosa, i
que és només una manera compacta d’escriure « si , i si ». Pren el logaritme d’això i nega’l, i la pèrdua per a un exemple és
Això és entropia creuada binària. No s’ha triat perquè sigui còmoda; és la log-versemblança negativa de l’única distribució que pot tenir un llançament de moneda. No hi havia res més disponible.
El que encara falta és d’on surt . El model calcula una suma ponderada , que és un nombre real i recorre tota la recta, i una probabilitat ha de viure a . La funció que es mou entre totes dues és la sigmoide logística:
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.9820Llegeix la columna de la dreta com una llista de preus. Encertar amb un 90 % de confiança costa 0,105. Negar-se a comprometre’s costa 0,693 —que és , el preu d’una arronsada d’espatlles. Equivocar-se amb confiança costa 4,6, quaranta-quatre vegades més, i el preu puja sense límit a mesura que el model es fa més segur d’un error. L’entropia creuada no es limita a comptar errors: cobra l’arrogància.
El gradient és predicció menys veritat
Enllaç a la secció: El gradient és predicció menys veritatEl capítol 3 deia: per entrenar qualsevol cosa, obtén la derivada de la pèrdua respecte de cada paràmetre. Fes-ho per a un exemple. Amb i :
Mostra els detalls
Les dues línies que fan que l’embolic es cancel·li. La sigmoide té una derivada inusualment agradable, . I la pèrdua es deriva com
Multiplica totes dues per la regla de la cadena i el apareix un cop a dalt i un cop a baix. Es cancel·la exactament, i és el que sobreviu. Aquesta cancel·lació no és una coincidència: és el que passa sempre que la pèrdua és la log-versemblança negativa d’una distribució i la funció de sortida és la que aquesta distribució utilitza de manera natural. Aquesta parella té un nom —un model lineal generalitzat— i el gradient net n’és l’empremta.1
Així que l’actualització és predicció menys veritat, per l’entrada. Res més. Aquí tens l’entrenador complet, que és el descent del capítol 3 amb una sola línia canviada:
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, bEl np.where dins de sigmoid no és cosmètic. Calcular directament desborda per a grans i negatius; la branca tria la forma algebraicament idèntica que manté l’exponent negatiu. Aquesta és la caixa de coma flotant del capítol 2 cobrant el seu primer deute, i en cobrarà un de més gros d’aquí a dues seccions.
Per què no l’error quadràtic, i per què la resposta va del gradient
Enllaç a la secció: Per què no l’error quadràtic, i per què la resposta va del gradientL’explicació estàndard per preferir l’entropia creuada a l’error quadràtic és l’argument de versemblança anterior: l’error quadràtic és el que obtens si assumes soroll gaussià, les etiquetes no són gaussianes, per tant no ho facis. És correcte i no convenç ningú, perquè pots escriure sobre una sigmoide i s’entrenarà.
L’argument que aterra és sobre el gradient. Posa error quadràtic damunt d’una sigmoide i la regla de la cadena dona
Aquest extra és el que abans es cancel·lava. Ara no ho fa, i va a zero sempre que el model té confiança, fins i tot quan el model està equivocat amb confiança. Avalua tots dos en unes quantes puntuacions, per a un exemple l’etiqueta real del qual és 1:
| puntuació | entropia creuada | error quadràtic | ràtio | |
|---|---|---|---|---|
| 0,000335 | 1.491 | |||
| 0,017986 | 28,3 | |||
| 0,119203 | 4,8 | |||
| 0,500000 | 2,0 | |||
| 0,880797 | 4,8 |
A el model està tan equivocat com és possible estar-ho, i l’error quadràtic respon amb un gradient 1.491 vegades més petit que el de l’entropia creuada. Com pitjor és l’error, menys n’aprèn el model. El gradient de l’entropia creuada, en canvi, satura a : estar màximament equivocat produeix un senyal màximament gran, i no més gran.
Fes la cursa. Dos mil punts equilibrats, pesos inicials idèntics triats perquè siguin equivocats amb confiança (), taxa d’aprenentatge idèntica, només canvia la pèrdua. Totes dues execucions es puntuen amb entropia creuada perquè les columnes siguin comparables.
| epoch | pèrdua d’entropia creuada | exactitud | pèrdua d’error quadràtic | exactitud |
|---|---|---|---|---|
| 1 | 5,4865 | 0,2300 | 5,9499 | 0,2290 |
| 10 | 1,5525 | 0,2460 | 5,9042 | 0,2290 |
| 50 | 0,4642 | 0,7780 | 5,6913 | 0,2320 |
| 100 | 0,4639 | 0,7770 | 5,3955 | 0,2410 |
| 200 | 0,4639 | 0,7770 | 4,6311 | 0,2745 |
| 500 | 0,4639 | 0,7770 | 0,5291 | 0,7660 |
| 1.000 | 0,4639 | 0,7770 | 0,4640 | 0,7765 |
L’entropia creuada ha acabat a l’epoch 50. L’error quadràtic encara és al 24 % d’exactitud a l’epoch 100 —i no s’havia mogut del 23 % a l’epoch 10—, pitjor que endevinar, perquè va començar equivocat amb confiança i el gradient que l’hauria rescatat s’ha multiplicat per 0,0007. S’escapa cap a l’epoch 500 i aterra al mateix lloc. Així que el resum honest és que l’error quadràtic sobre una sigmoide no és incorrecte; és lent exactament on la velocitat importa més. En un model de dos paràmetres perds 450 epochs. En una xarxa amb cent capes, on alguna unitat en algun lloc sempre està equivocada amb confiança, perds l’entrenament sencer.
Entropia, entropia creuada i KL, en una pàgina
Enllaç a la secció: Entropia, entropia creuada i KL, en una pàginaTres quantitats, necessàries com cal al capítol 8 per a la perplexitat i al capítol 11 per a la penalització que manté una política amb fine-tuning a prop de la seva referència. Són més fàcils que la fama que tenen.2
Entropia és el nombre mitjà de bits que has de gastar per comunicar una mostra d’una distribució, si fas servir el millor codi possible per a ella:
Entropia creuada és el que gastes quan fas servir un codi construït per a sobre dades que en realitat venen de :
Divergència KL és l’excés —el malbaratament, en bits— causat per creure quan la veritat és :
Comprova les tres coses a la cinta:
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 bitsAllà s’hi veuen dues coses. Primer, un model que simplement informa de la taxa base d’entrenament, 1,69 %, aconsegueix una entropia creuada de 0,1330 bits, gairebé exactament l’entropia de les etiquetes de prova, com ha de ser, perquè té la distribució correcta i cap altra informació. L’entropia és el terra que et compra la ignorància sobre l’individu. Segon, un model que s’arronsa d’espatlles i diu 0,5 paga exactament 1 bit, i la diferència entre totes dues coses, 0,8671 bits, és precisament la divergència KL. no és una identitat per memoritzar; és una factura que pots veure com es va sumant.
I la connexió de tornada a l’entrenament: quan l’etiqueta és una sola classe coneguda, la distribució «veritable» és one-hot, la seva entropia és zero, i l’entropia creuada és igual a la divergència KL. Minimitzar l’entropia creuada i estirar la distribució del model cap a la veritat són el mateix acte.
Més de dues respostes: softmax, i el desplaçament que no costa res
Enllaç a la secció: Més de dues respostes: softmax, i el desplaçament que no costa resDefectuós no és una sola cosa. En l’emmotllament, una peça pot sortir com una injecció curta (no prou material), rebava (massa material, espremut fora del motlle), o cremada. Quatre resultats, per tant quatre logits, i s’han de convertir en quatre probabilitats que sumin u. Això és softmax:
Té una propietat que sembla un accident i de fet és tota la implementació:
per a qualsevol constant , perquè i el es cancel·len a dalt i a baix. Només les diferències entre logits volen dir alguna cosa. El nivell absolut no és informació.
Per sort, perquè el nivell absolut és el que trenca l’ordinador:
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 desborda un float de 64 bits, la suma esdevé infinit, i infinit dividit per infinit és nan: no és un error, no és una caiguda, només un forat silenciós on abans hi havia tres probabilitats. Restar el logit màxim no canvia res matemàticament i ho canvia tot numèricament, perquè l’exponent més gran esdevé exactament . És el truc logsumexp del capítol 2 amb la roba de feina posada, i tota implementació seriosa ho fa:
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, bEl gradient torna a ser predicció menys veritat, ara amb one-hot. El cas binari era un cas especial des del principi.
Entrenat amb 3.000 peces i provat amb 1.000, amb tres mesures cadascuna (amplada, pes, temperatura de fusió), arriba a 94,00 % d’exactitud. Això és el que aquest nombre amaga:
| veritat ↓ / predit → | bé | injecció curta | rebava | cremada | recall |
|---|---|---|---|---|---|
| bé | 850 | 5 | 9 | 0 | 0,984 |
| injecció curta | 22 | 21 | 0 | 0 | 0,488 |
| rebava | 20 | 0 | 30 | 1 | 0,588 |
| cremada | 3 | 0 | 0 | 39 | 0,929 |
| precisió | 0,950 | 0,808 | 0,769 | 0,975 |
El model troba menys de la meitat de les injeccions curtes. L’exactitud no ho pot veure, perquè el 86 % de les peces estan bé i encertar-les n’hi ha prou per sostenir la mitjana. Macro F1 —la mitjana de les puntuacions F1 per classe, que pesa una classe rara igual que una de comuna— és 0,7983, enfront d’un micro F1 de 0,9400 que per definició és idèntic a l’exactitud. Sempre que algú informi d’un sol nombre F1, pregunta quin.
Això és l’últim del modelatge. La resta del capítol va dels nombres.
Tres models, una exactitud
Enllaç a la secció: Tres models, una exactitudAgafa el model binari entrenat i fes-ne dues variants multiplicant cada logit per una constant: 0,35 per a una versió dubitativa, 4 per a una de massa confiada. Multiplicar per un nombre positiu no pot canviar cap signe, així que tots tres models prediuen exactament la mateixa etiqueta per a les 4.000 peces de prova. L’exactitud no els pot distingir. L’entropia creuada no té cap problema:
| model | exactitud | entropia creuada | pèrdua mitjana quan encerta | pèrdua mitjana quan falla | pitjor pèrdua individual |
|---|---|---|---|---|---|
| dubitatiu (logits × 0,35) | 0,9830 | 0,1549 | 0,1369 | 1,1990 | 2,80 |
| tal com s’ha entrenat | 0,9830 | 0,0564 | 0,0147 | 2,4689 | 7,82 |
| massa confiat (logits × 4) | 0,9830 | 0,1563 | 0,0009 | 9,1427 | 27,63 |
El model dubitatiu paga un petit impost en cada peça, incloses les milers que encerta. El massa confiat és gairebé gratuït quan encerta i catastròfic quan falla: una sola peça d’aquell conjunt de prova li costa 27,63 nats per si sola. Tots dos arriben gairebé al mateix total per rutes oposades, i el model entrenat, les probabilitats del qual estan calibrades a les dades, queda tres vegades per sota de tots dos.
Aquesta és la manera més clara d’expressar la diferència entre una pèrdua i una mètrica. La pèrdua és el que optimitzes: ha de ser diferenciable i veu tot el que ha dit el model, inclòs com de segur n’estava. La mètrica és allò pel qual et jutgen: pot ser una funció esglaó, una regla de negoci, un recompte de defectes no detectats. No són el mateix objecte i no sempre estan d’acord; per això defineixes totes dues coses abans de començar, i mai deixes que la pèrdua substitueixi la mètrica només perquè resulta que és a la pantalla.
La línia base estúpida va primer
Enllaç a la secció: La línia base estúpida va primerAbans de cap model, el requisit: quina puntuació obté la resposta més mandrosa possible? En aquesta cinta, digues sempre que està bé:
always-say-fine baseline: accuracy = 0.9815
confusion (tn, fp, fn, tp) = (3926, 0, 74, 0)98,15 %. Ara el model logístic entrenat, amb el llindar per defecte de 0,5:
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 %. Ha superat la línia base per 0,15 punts percentuals, i qualsevol informe que s’aturi a l’exactitud en dirà una victòria. La matriu de confusió diu què ha passat realment:
| predit com a bé | predit com a defectuós | |
|---|---|---|
| realment bé | 3.924 | 2 |
| realment defectuós | 66 | 8 |
Ha trobat 8 peces defectuoses de 74 i n’ha deixat passar 66. Tres nombres anomenen les tres maneres de llegir aquesta taula:
- Precisió . De les peces que ha marcat, quantes eren realment defectuoses. Aquest és el cost de les inspeccions malgastades.
- Recall . De les peces defectuoses, quantes ha capturat. Aquest és el cost d’enviar una peça dolenta a un client.
- F1 , la seva mitjana harmònica, que es manté a prop del més petit dels dos i, per tant, es nega a deixar-se afalagar per un de sol.
Quin importa depèn de la fàbrica, no de les matemàtiques: una inspecció costa uns segons i un defecte enviat costa un avís de retirada, així que aquí domina el recall i 0,108 és un fracàs.
Però el model no és el problema. El llindar sí, i el llindar no forma part del model: és una decisió de negoci aplicada després a una probabilitat. Escombra’l:
| llindar | TP | FP | FN | exactitud | precisió | recall | F1 |
|---|---|---|---|---|---|---|---|
| 0,500 | 8 | 2 | 66 | 0,9830 | 0,800 | 0,108 | 0,190 |
| 0,200 | 27 | 28 | 47 | 0,9812 | 0,491 | 0,365 | 0,419 |
| 0,100 | 42 | 118 | 32 | 0,9625 | 0,263 | 0,568 | 0,359 |
| 0,050 | 54 | 236 | 20 | 0,9360 | 0,186 | 0,730 | 0,297 |
| 0,020 | 67 | 570 | 7 | 0,8558 | 0,105 | 0,905 | 0,188 |
| 0,005 | 71 | 1.360 | 3 | 0,6593 | 0,050 | 0,959 | 0,094 |
Llegeix la columna d’exactitud cap avall. Cau tot el camí —del 98,30 % al 65,93 %— mentre el model passa de capturar 8 defectes a capturar-ne 71 de 74. Tot el que aquest model pot fer d’útil empitjora la seva exactitud. Un equip que optimitzés el nombre del titular enviaria la versió que no troba res.
Mostra els detalls
Ponderar classes no crea senyal, mou el punt d’operació. El primer reflex habitual amb classes desequilibrades és ponderar la classe rara en la pèrdua. Fent-ho, amb pesos d’1, 10 i 60 sobre els positius:
| pes sobre els positius | exactitud | precisió | recall | F1 | AUC |
|---|---|---|---|---|---|
| 1 | 0,9830 | 0,800 | 0,108 | 0,190 | 0,9363 |
| 10 | 0,9605 | 0,253 | 0,581 | 0,352 | 0,9361 |
| 60 | 0,8290 | 0,091 | 0,919 | 0,166 | 0,9361 |
La precisió i el recall es mouen molt. L’AUC —la probabilitat que el model classifiqui una peça defectuosa aleatòria per sobre d’una de bona aleatòria, ignorant del tot el llindar— es mou 0,0002, que no és res. Reponderar ha fet lliscar el mateix model per la mateixa corba de compromís. Sovint això és el que vols, i mai és informació nova: si el rànquing és dolent, cap esquema de ponderació el salvarà.
Tres particions, i la fuita que estàs a punt de trobar
Enllaç a la secció: Tres particions, i la fuita que estàs a punt de trobarPer què tres particions i no dues? Perquè en el moment que fas servir un conjunt d’exemples per triar qualsevol cosa —un llindar, una taxa d’aprenentatge, quin de sis models enviar—, aquest conjunt s’ha fet servir per ajustar, i la seva puntuació deixa de ser no esbiaixada.3 Mesurat en aquesta cinta: escombrar el llindar al conjunt de validació tria 0,196, i després el model obté F1 = 0,4122 al conjunt de prova intacte. Si l’escombrat s’hagués fet directament sobre el conjunt de prova, el millor assolible allà era 0,4186, un nombre que ningú té dret a informar.
La diferència aquí és petita, 0,006, perquè és un hiperparàmetre escombrat una vegada contra 4.000 exemples de validació. Creix amb cada decisió extra i cada reducció del conjunt de validació. Observa també que la direcció no està garantida en una sola execució: el llindar triat va puntuar 0,3902 en validació i 0,4122 en prova, així que aquesta vegada la validació el va infraestimar. El biaix és sistemàtic al llarg de moltes decisions, no visible en una.4
Ara l’exercici. El registre de la cinta arriba amb una tercera columna, station_seconds: quant de temps ha passat cada peça a l’estació d’inspecció. Afegir-la és un canvi d’una línia al preprocessament. Això és el que fa:
| model | exactitud | precisió | recall | F1 | entropia creuada | AUC |
|---|---|---|---|---|---|---|
| amplada + pes | 0,9830 | 0,800 | 0,108 | 0,190 | 0,0564 | 0,9363 |
| + station_seconds | 0,9920 | 0,792 | 0,770 | 0,781 | 0,0236 | 0,9970 |
El recall passa del 10,8 % al 77,0 %. L’F1 es multiplica per més de quatre. I fixa’t què ha fet l’exactitud: 98,30 % → 99,20 %, un guany de nou dècimes de punt, que és el tipus de nombre que en una diapositiva de resum s’arrodoneix a «cap al 99 % en tots dos casos». L’exactitud abans no va veure el fracàs i ara no veu el frau.
Abans de continuar: el model fa trampes. Descobreix com.
Com caçar una fuita, en l’ordre que la troba més ràpid.
-
Compara entrenament i prova. El sobreajust apareix com una gran diferència. Aquí: model honest 0,9838 entrenament / 0,9830 prova; model amb fuita 0,9936 entrenament / 0,9920 prova. Totes dues diferències són inferiors a 0,2 punts. Una fuita no sembla sobreajust: la característica amb fuita està igualment disponible en temps de prova, així que el model generalitza de meravella a un món que no existeix.
-
Entrena un model per característica, sola. Qualsevol cosa que porti la resposta s’anunciarà:
característica sola exactitud recall F1 AUC amplada 0,9815 0,014 0,026 0,8691 pes 0,9815 0,000 0,000 0,7914 station_seconds0,9850 0,405 0,500 0,9960 Una columna, tota sola, ordena els defectes amb AUC 0,9960. Dues mesures preses amb un peu de rei i una balança aconsegueixen 0,87 i 0,79. Aquesta asimetria és l’alarma.
-
Pregunta quan es va anotar cada nombre. Temps mitjà d’estada: 2,23 segons per a les peces que van passar, 15,56 segons per a les que van fallar. És clar que sí. Una peça s’està a l’estació perquè un inspector l’ha tret de la cinta, cosa que passa després, i només perquè, algú ha decidit que era defectuosa. La columna no és una mesura de la peça. És una mesura del veredicte.
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()) La línia ressaltada és la fuita: el temps d’estada d’una peça defectuosa es mostreja d’una distribució diferent, perquè una persona l’ha tret de la cinta. Aquest és l’error greu més comú en l’aprenentatge automàtic aplicat, i té un nom: target leakage —informació en les característiques d’entrenament que no estaria disponible en el moment en què s’ha de fer la predicció.5 No llança cap excepció. Produeix un nombre millor. Tots els incentius d’un projecte apunten a conservar-la.
La defensa és una pregunta, feta a cada columna: en l’instant en què necessito aquesta predicció, aquest valor ja existeix? En una cinta en viu, station_seconds és desconegut fins després que la peça hagi estat inspeccionada, que és justament el que se suposava que el model havia de substituir.
Quants exemples de prova necessito?
Enllaç a la secció: Quants exemples de prova necessito?Suposa que puntues un model sobre 20 exemples i n’encerta 17. Informes d’un 85 %.
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.6477La lectura honesta de 17/20 és en algun punt entre el 64 % i el 95 %. Un model genuïnament del 65 % produeix aquest resultat el 4,4 % de les vegades —una execució de cada vint-i-tres—, i si vas provar un grapat de prompts i en vas informar el millor, vas fabricar aquesta execució tu mateix. Disset de vint no poden distingir un model del 85 % d’un del 65 %.
Dues maneres de posar un interval a una taxa, i totes dues han de ser al teu equip d’eines:
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)Fes servir Wilson6 per a una taxa d’èxit simple; es comporta bé amb qualsevol i no necessita aleatorietat. Fixa’t més amunt que a l’extrem superior del bootstrap és 1,0000: remostrejar 20 punts pot extreure fàcilment 20 de correctes, de manera que no pot representar un interval més estret que la seva pròpia granularitat. Fes servir el bootstrap7 quan no existeix cap fórmula, que és la majoria dels casos interessants: F1, macro-mitjanes, BLEU, pass@1, la puntuació d’un jutge basat en rúbrica. En aquesta cinta, l’F1 de 0,4122 del model ajustat porta un interval bootstrap de [0,3009, 0,5156]; aquest és el nombre que hauria d’aparèixer a l’informe, perquè l’estimació puntual tota sola convida a una comparació que no pot sostenir.
Una mesura més, perquè canvia com hauries de comparar dos models. Dos models puntuats sobre els mateixos 500 exemples:
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)Els seus intervals se solapen, i la regla popular —barres d’error solapades vol dir cap diferència significativa— diria que la comparació és inconclusa. No ho és. Els dos models s’han executat sobre els mateixos exemples, així que la quantitat correcta és la diferència per exemple, l’interval de la qual és [0.0260, 0.0680], còmodament per sobre de zero. Només discrepen en 31 dels 500 elements, i A guanya 27 d’aquests desacords; els exemples compartits, fàcils i difícils igual, es cancel·len en lloc d’afegir soroll. Compara models de manera aparellada, i arribaràs a la mateixa conclusió amb una fracció de les dades.
Cap on va això ara
Enllaç a la secció: Cap on va això araAra tens un model que emet probabilitats calibrades, una pèrdua derivada d’una afirmació sobre les dades en lloc de triada per comoditat, un gradient que és literalment predicció menys veritat i —més important encara— la maquinària per esbrinar si res d’això funciona. L’interval de Wilson de deu línies de més amunt es reutilitza literalment: carrega les variants de prompt al capítol 15, les taules de recuperació al capítol 19 i el conjunt d’or al capítol 29. El bootstrap és el que agafes quan no existeix cap fórmula.
Però el model encara és una sola capa. Dibuixa una línia, i el capítol 1 va demostrar amb quatre files de XOR que una línia no n’hi ha prou. La solució és apilar: una primera capa que corbi l’espai, una segona que dibuixi la línia en l’espai corbat.
Aquí és on s’esgota el gradient net d’aquest capítol. Tot el que hi ha més amunt funcionava perquè es podia escriure a mà, una vegada, per a un model amb una capa entre l’entrada i la pèrdua. Posa una segona capa al mig i la pregunta canvia de forma: quina és la derivada de la pèrdua respecte d’un pes que no toca gens la sortida, un pes la influència del qual arriba només a través d’una altra capa, potser per diversos camins alhora?
Aquesta derivada existeix. Calcular-la a mà és inviable per a qualsevol cosa més gran que una joguina, i calcular-la paràmetre a paràmetre és inviable a una altra escala. El que cal és un procediment que obtingui totes les derivades de la xarxa amb una sola passada enrere sobre el mateix graf que la passada endavant acaba de recórrer.
Això és el capítol 5, i és el motor sobre el qual funciona la resta d’aquest curs.
Fonts i mètode
Enllaç a la secció: Fonts i mètodeTambé val la pena llegir al costat d’aquest capítol: Bishop, Pattern Recognition and Machine Learning §1.2, §1.5, §1.6 i §4.3, que cobreix probabilitat, teoria de la decisió, teoria de la informació i classificació lineal en l’ordre que segueix aquest capítol; Murphy, Probabilistic Machine Learning: An Introduction, capítols 6 i 10; Prince, Understanding Deep Learning §5.4–5.7; i Saito i Rehmsmeier, The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets (PLOS ONE, 2015): per què l’AUC citada més amunt no hauria de ser l’únic nombre independent del llindar que mires quan l’1,7 % de les peces són defectuoses.
Referències
Enllaç a la secció: Referències-
Ma, T. i Ng, A. CS229 Lecture Notes, Stanford University, capítols 2 i 3. On la cancel·lació que produeix deixa de semblar sort: tria la distribució de la família exponencial que encaixa amb la teva sortida, fes servir el seu enllaç canònic, i el gradient sempre és predicció menys veritat. ↩
-
Olah, C. Visual Information Theory (2015),
colah.github.io/posts/2015-09-Visual-Information. L’explicació més clara disponible de l’entropia, l’entropia creuada i la divergència KL com a costos en bits, no com a fórmules. ↩ -
Abu-Mostafa, Y. S., Magdon-Ismail, M. i Lin, H.-T. Learning From Data (AMLBook, 2012), lliçons 13 i 17 del curs de Caltech. La lliçó 13 és validació; la lliçó 17, sobre els tres principis d’aprenentatge, és on s’anomena el data snooping. Entre totes dues són la font de la disciplina d’aquest capítol: cada mirada a un conjunt de dades és una decisió d’ajust, tant si has executat un optimitzador com si no. ↩
-
James, G., Witten, D., Hastie, T. i Tibshirani, R. An Introduction to Statistical Learning, 2a edició (Springer, 2021), capítols 2 i 5, per a la descomposició biaix–variància i per al remostreig. El volum company és on la trampa de selecció s’enuncia directament: Hastie, Tibshirani i Friedman, The Elements of Statistical Learning, 2a edició, §7.10.2, The Wrong and Right Way to Do Cross-validation. ↩
-
Kaufman, S., Rosset, S., Perlich, C. i Stitelman, O. Leakage in Data Mining: Formulation, Detection, and Avoidance. ACM Transactions on Knowledge Discovery from Data 6(4), 2012. Un tractament formal del fracàs demostrat més amunt, amb estudis de cas de competicions guanyades per un model que havia après un artefacte de com s’havien muntat les dades. ↩
-
Wilson, E. B. Probable Inference, the Law of Succession, and Statistical Inference. Journal of the American Statistical Association 22(158), pp. 209–212 (1927). L’interval de puntuació utilitzat a
wilson()més amunt, encara el valor per defecte correcte per a una proporció. L’interval de manual és el que cal evitar: dona disbarats a prop de 0 i 1, i infracobreix greument amb petits. ↩ -
Efron, B. Bootstrap Methods: Another Look at the Jackknife. The Annals of Statistics 7(1), pp. 1–26 (1979). La idea que et permet posar un interval sobre qualsevol estadística que puguis calcular, incloses les que no tenen teoria de mostreig. ↩