- La loss vient du bruit. Bruit → densité → produit → log → négatif → jeter : six pas qui transforment une hypothèse de bruit en loss (p02-01, pas 6). Sous bruit catégoriel le résultat est −log qy. On ne le redémontre pas ici : on le retrouve au pas 3, par un autre chemin.
- Softmax et logits. qi = ezi / Σj ezj ; le log-softmax se calcule par log-sum-exp, sans jamais former q (p08-02, pas 6). C'est la raison technique du pas 8.
- Espérance = moyenne pondérée. Ep[f] = Σ pi f(i) (p00-02, pas 2). Toute la chaîne n'est que cette somme, appliquée à f = surprise.
- Logarithmes. log(ab) = log a + log b, et changer de base multiplie par une constante : 1 nat = 1/ln 2 = 1,443 bit.
La chaîne
Le décor : trois besoins, un seul chiffre
Un classifieur ou un modèle de langage sort des logits. On veut trois choses : une loss à descendre, un nombre lisible qu'on puisse annoncer, une distance entre ce que le modèle croit et ce qui arrive.
« Entraîner, rapporter, comparer : trois besoins, et un seul chiffre les sert tous les trois — c'est ce chiffre qu'on démonte. »
| classe | z | ez | q |
|---|---|---|---|
| chat | 2 | 7,389 | 0,844 |
| chien | 0 | 1,000 | 0,114 |
| oiseau | −1 | 0,368 | 0,042 |
| somme | 8,757 | 1,000 |
Même q, deux vérités possibles : si c'est un chat la loss vaudra 0,170 ; si c'est un oiseau elle vaudra 3,17. Presque dix-neuf fois plus (18,7), pour la même prédiction.
Surprise = −log p tronc
Un événement de probabilité p porte une surprise. Trois exigences la déterminent entièrement : nulle si l'événement était certain, croissante quand p baisse, et additive sur des événements indépendants — voir deux choses improbables surprend autant que la somme des deux.
Additif sur un produit : c'est la propriété du logarithme, et lui seul. La base fixe l'unité, pas la forme. C'est la brique de toute la chaîne — et elle n'est pas bornée.
« La surprise doit être nulle pour le certain, croître quand p baisse et s'additionner sur des indépendants, donc c'est moins log p, donc le choix de la base n'est qu'un choix d'unité. »
Le modèle donne 0,844 au chat : si c'est un chat, surprise −ln 0,844 = 0,170 nat = 0,245 bit. Il donne 0,042 à l'oiseau : si c'est un oiseau, −ln 0,042 = 3,17 nats = 4,57 bits.
Non bornée. À qy = 10−6 la surprise vaut 13,8 nats, et rien n'arrête la montée. L'erreur quadratique (1 − qy)², elle, ne dépasse jamais 1 : à 0,042 elle vaut 0,918, à 10−6 elle vaut 1,000. Les deux ne punissent pas la même chose.
Fais descendre qy, la probabilité que le modèle avait donnée à la bonne classe. La courbe rouge −log qy part vers l'infini ; la courbe bleue (1 − qy)² plafonne à 1. Le dernier readout est l'aperçu du pas 7 : exp(surprise) = 1/qy, le nombre de candidats équiprobables qu'une telle probabilité représente.
Cross-entropy = surprise moyenne de q sous p tronc
Deux distributions, deux rôles : p dit ce qui arrive, q dit ce qu'on paie. On tire la classe selon p, on encaisse la surprise que q lui assignait, on moyenne.
En classification p est un one-hot : un seul terme survit, CE = −log qy. C'est exactement la NLL d'une catégorielle (p02-01) — retrouvée ici sans repasser par la vraisemblance.
« La vérité choisit la classe, le modèle en avait donné une probabilité, donc on paie moins log de cette probabilité, donc en moyenne sur la vérité c'est moins somme p log q. »
Par la surprise. Vérité chat, p = (1 ; 0 ; 0) : CE = −ln 0,844 = 0,170. Vérité oiseau : CE = −ln 0,042 = 3,17.
Par les six pas. Bruit catégoriel ⇒ densité d'une observation = qyi ⇒ produit Π qyi ⇒ log Σ log qyi ⇒ négatif ⇒ rien à jeter. Moyenne sur le batch : −(1/n) Σ log qyi.
Même formule. « Cross-entropy » et « NLL catégorielle » nomment le même objet : l'une le lit comme une surprise moyenne, l'autre comme un maximum de vraisemblance retourné.
Entropie = cross-entropy de p avec elle-même
Poser q = p dans la formule du pas 3 : c'est la facture d'un modèle qui connaît déjà la vérité. Personne ne paie moins (le pas 5 le démontre) : c'est le plancher.
Deux bornes : uniforme sur V ⇒ H = log V, le maximum (aucune classe n'est privilégiée) ; one-hot ⇒ H = 0, le minimum (rien n'est incertain). C'est le même dôme concave que le critère de split d'un arbre (p03-01, pas 4).
« L'entropie est la cross-entropy d'une distribution avec elle-même, donc c'est la facture d'un modèle qui connaît déjà la vérité, donc c'est le plancher que personne ne passe. »
p = (0,5 ; 0,25 ; 0,25) : H = 0,5 × 1 + 0,25 × 2 + 0,25 × 2 = 1,5 bit (= 1,040 nat). Lecture : il faut en moyenne 1,5 question binaire pour identifier la classe.
| p | H(p) en bits |
|---|---|
| (1 ; 0 ; 0) — one-hot | 0 |
| (0,5 ; 0,25 ; 0,25) | 1,5 |
| (1/3 ; 1/3 ; 1/3) — uniforme | log₂ 3 = 1,585 |
Le cas qui compte. En classification supervisée la vérité est un one-hot, donc H(p) = 0 : la loss est entièrement le supplément du pas 5.
KL = le supplément tronc
Retrancher le plancher de la facture. Ce qui reste est ce que coûte le fait de se tromper de distribution :
Positive, nulle seulement si q = p (Jensen sur le log, concave). Et H(p) ne dépend pas du modèle : minimiser la CE en q, c'est minimiser la KL.
Asymétrique, et ce n'est pas un détail : KL(p ‖ q) explose là où p > 0 et q ≈ 0 — elle force à couvrir ; KL(q ‖ p) explose là où q > 0 et p ≈ 0 — elle force à se concentrer.
« La cross-entropy est l'entropie plus un supplément, donc ce supplément est la KL, donc il est positif et nul seulement si q égale p, donc entraîner à la cross-entropy c'est réduire la KL vers la vérité. »
| q | CE | KL(p‖q) | H + KL | KL(q‖p) |
|---|---|---|---|---|
| (1/3 ; 1/3 ; 1/3) | 1,585 | 0,085 | 1,585 | 0,082 |
| (0,7 ; 0,2 ; 0,1) | 1,668 | 0,168 | 1,668 | 0,143 |
| (0,5 ; 0,25 ; 0,25) | 1,500 | 0 | 1,500 | 0 |
En bits. La colonne H + KL reproduit la colonne CE ligne à ligne : l'identité n'est pas une approximation. Et les deux KL diffèrent — 0,168 contre 0,143 : ce n'est pas une distance.
One-hot. p = (1 ; 0 ; 0) ⇒ H = 0 ⇒ CE = KL = −log qy. La loss du pas 3 est une KL.
Barres pleines : la vérité p, fixe. Contours rouges : le modèle q, réglable (le premier curseur fixe qchat, le second partage le reste entre chien et oiseau). CE − H donne toujours KL(p‖q), à toute position des curseurs. Clique « q = p » : les deux KL tombent à 0 et la CE touche son plancher 1,5. Écarte qchat vers 0,96 puis vers 0,02 : les deux KL montent, mais pas de la même façon.
Loss initiale = log V
Un modèle qui n'a rien appris ne doit privilégier aucune classe : q uniforme. La CE vaut alors log V pour tout exemple, quelle que soit la vérité — c'est la seule valeur que la loss puisse prendre au premier pas.
C'est un contrôle de sanité, pas une curiosité : une loss initiale nettement au-dessus de log V signale des logits de départ trop grands — le modèle est confiant au hasard et paie plein tarif ses erreurs (figure 4). Le remède est de réduire l'échelle des poids de la dernière couche, pas d'attendre.
« Un modèle qui ne sait rien met la même probabilité partout, donc il paie log V à chaque exemple, donc la loss du premier pas doit valoir log V, donc au-dessus c'est l'initialisation qui est trop confiante et on réduit l'échelle des logits. »
| V | ln V (nats) | log₂ V (bits) |
|---|---|---|
| 2 — pile ou face | 0,693 | 1,00 |
| 27 — caractères a…z + fin | 3,296 | 4,75 |
| 50 257 — tokens GPT-2 | 10,82 | 15,62 |
Sur 27 caractères, une première loss à 3,3 dit « l'init est neutre ». Une première loss à 27 ne dit pas « le modèle est mauvais » : elle dit « les logits initiaux sont beaucoup trop larges ». Deux diagnostics distincts, lisibles au premier affichage.
Abscisse logarithmique : le vocabulaire V, de 2 à 50 257. Les deux traits verticaux sont les repères à retenir — 27 caractères et 50 257 tokens GPT-2. La loss attendue au premier pas est ln V ; le troisième readout, exp(loss), redonne exactement V — c'est le pas 7 lu à l'envers.
exp(loss) = nombre de candidats effectifs
On inverse le pas 6. Une loss de L nats est celle d'un modèle uniforme sur eL options ; donc exp(L) — la perplexité — se lit « le modèle hésite comme entre tant de candidats équiprobables ».
C'est la seule forme lisible de la loss : 3,30 et 2,50 ne disent rien, « 27 candidats » et « 12 candidats » disent tout. Et la lecture est indépendante de l'unité : exp d'une loss en nats et 2 puissance la même loss en bits donnent le même nombre.
« Une loss de L nats est celle d'un uniforme sur e puissance L options, donc exp de la loss compte des candidats, donc passer de 3,30 à 2,50 c'est passer de 27 hésitations à 12. »
| loss (nats) | exp(loss) | lecture |
|---|---|---|
| 3,296 | 27,0 | départ sur 27 caractères : aucune information |
| 2,50 | 12,2 | le modèle a divisé les candidats par 2,22 |
| 1,00 | 2,72 | presque binaire |
| 0 | 1,0 | certitude (jamais atteinte, et suspecte si proche) |
Reprends la figure 3 : le readout exp(loss) y vaut V exactement quand la loss vaut ln V. Les deux contrôles de Karpathy — « la loss démarre-t-elle à log V ? », « à combien de candidats en est-on ? » — sont ce pas et le précédent.
Gradient et implémentation
Dérivée de la CE par rapport aux logits : le 1/q venu du log annule exactement le q(1−q) venu du softmax (p08-01, pas 4 ; p03-01, pas 6). Il ne reste rien :
D'où l'API : F.cross_entropy(logits, targets) fait log_softmax + NLL en une passe, stabilisée par log-sum-exp (p08-02, pas 7). Elle veut des logits et des indices de classe — pas des probabilités, pas des one-hot.
« Le un sur q du log annule le q fois un moins q du softmax, donc le gradient sur les logits est q moins p, donc la bibliothèque fait le log-softmax elle-même et veut des logits, donc lui passer des probabilités applique un second softmax et aplatit la loss. »
Vérité chat, p = (1 ; 0 ; 0) : q − p = (−0,156 ; 0,114 ; 0,042). Vérité oiseau : (0,844 ; 0,114 ; −0,958) — la coordonnée fautive pousse six fois plus fort. Somme nulle dans les deux cas : le gradient redistribue la masse, il ne la crée pas.
Double softmax. Passer q = (0,844 ; 0,114 ; 0,042) au lieu de z : la fonction en refait un softmax et obtient (0,518 ; 0,250 ; 0,232). La loss affichée pour un chat devient 0,658 au lieu de 0,170, le gradient (−0,482 ; 0,250 ; 0,232). Aucune erreur levée : la loss descend, mal, et plafonne.
Repère. Des logits déjà dans [0, 1] et qui somment à 1 sont le signe qu'on passe des probabilités.
Les mêmes logits (2 ; 0 ; −1) multipliés par une échelle s. À s = 0 le modèle est uniforme et paie ln 3 = 1,10 quoi qu'il arrive. Monte s : la CE quand il a raison tend vers 0, la CE quand il a tort monte sans borne, et la moyenne sur une vérité uniforme s'écarte de ln 3 vers le haut — c'est exactement ce que voit une init trop large au pas 6. Le gradient q − p du readout s'écrase quand le modèle a raison, et sature à ±1 quand il a tort.
Où ça casse casse
La surprise non bornée du pas 2 est la force de la cross-entropy et son unique défaut : ce qui la rend sensible à tout la rend sensible au faux.
« La cross-entropy paie une surprise non bornée, donc un label faux ou un q à zéro coûte arbitrairement cher, donc on borne par le lissage ; et exp de la loss compte des candidats du vocabulaire courant, donc deux perplexités ne se comparent qu'à tokenizer égal. »
- Labels bruités. Un label faux impose une surprise que rien ne borne : si le modèle a raison contre l'étiquette et donne 10−4 à la classe annoncée, il paie 9,2 et son gradient sature à ±1. Il apprend le bruit. Le label smoothing remplace le one-hot par p = (1−ε)·onehot + ε/V : avec ε = 0,1 et V = 3, p = (0,933 ; 0,033 ; 0,033), la surprise maximale tombe à 3,40 et le plancher H(p) = 0,291 nat — la loss ne descend plus jamais à 0, c'est le prix.
- Calibration. Minimiser la CE pousse q vers des probabilités calibrées sur la distribution d'entraînement, et seulement là. Hors distribution, un modèle reste confiant sans raison : la CE n'a jamais vu ces exemples, donc elle ne les a pas punis (p06-04).
- Comparer deux perplexités. exp(loss) compte des candidats du vocabulaire courant. Une loss de 3,30 par caractère (27 hésitations sur des lettres) et une loss de 3,30 par token (27 hésitations sur des mots) décrivent des modèles incomparables. Changer de tokenizer change le nombre de tokens du même texte, donc la loss par token : une perplexité ne se compare qu'à découpage identique.
- KL infinie. KL(p ‖ q) exige qi > 0 partout où pi > 0 ; un seul zéro mal placé et la somme vaut +∞. C'est ce qui rend le lissage obligatoire dès qu'on estime q par comptage (p02-03). Un softmax ne produit jamais de zéro exact en mathématiques — mais il en produit en float32, dès que l'écart de logits dépasse 88 (p08-02, pas 5).
Résumé
- Surprise = −log p : nulle si certain, additive sur des indépendants, non bornée. Tout le reste en découle.
- CE(p, q) = −Σ p log q : la surprise de q payée sous p. One-hot ⇒ −log qy, la NLL catégorielle de p02-01.
- H(p) = CE(p, p) : le plancher. Uniforme ⇒ log V (maximum) ; one-hot ⇒ 0.
- KL(p ‖ q) = CE − H ≥ 0, nulle ssi q = p. H est une constante ⇒ minimiser la CE = minimiser la KL. Asymétrique.
- Loss initiale = log V (ln 27 = 3,30) : au-dessus, l'init est trop confiante.
- exp(loss) = candidats effectifs : 3,30 → 27, 2,50 → 12,2. Incomparable d'un tokenizer à l'autre.
- ∂CE/∂z = q − p ;
F.cross_entropyprend des logits et des indices.
Chaîne verbalisée — une prise, à voix haute
- Définis la surprise, et justifie le −log.Nulle si l'événement était certain, croissante quand p baisse, additive sur des indépendants — s(pq) = s(p) + s(q) : seul le logarithme fait ça, donc s = −log p, à la base près.
- Écris la cross-entropy, puis le cas one-hot.CE(p, q) = −Σ pi log qi : on tire selon p, on paie la surprise de q. One-hot : un seul terme, CE = −log qy — la NLL catégorielle.
- Relie CE, entropie et KL.CE(p, q) = H(p) + KL(p ‖ q), KL ≥ 0 et nulle ssi q = p. H(p) ne dépend pas du modèle, donc minimiser la CE c'est minimiser la KL. Et KL(p‖q) ≠ KL(q‖p).
- Que vaut la loss au premier pas sur 27 caractères, et que dit une loss plus haute ?Uniforme ⇒ ln 27 = 3,30. Nettement au-dessus : les logits initiaux sont trop grands — init trop confiante, on réduit l'échelle de la dernière couche.
- Que mesure exp(loss) ?Le nombre de candidats équiprobables entre lesquels le modèle hésite : 3,30 → 27, 2,50 → 12,2. Comparable seulement à vocabulaire et tokenizer égaux.
- Pourquoi passer des logits à
F.cross_entropy?Elle fait log_softmax = z − LSE(z) elle-même, stable. Lui passer des probabilités applique un second softmax : sur (2 ; 0 ; −1) la loss d'un chat passe de 0,170 à 0,658, sans erreur levée.
Ponts et cartes
F.cross_entropy attend, et ce que targets comme indices veut dire en mémoire
dl::cross-entropy (CE = −Σ p log q, one-hot ⇒ NLL, gradient q − p, logits et indices) · stats::entropie (H = CE(p, p), plancher, uniforme ⇒ log V) · stats::kl (KL = CE − H ≥ 0, asymétrie, KL infinie sans lissage) · dl::perplexite (exp(loss) = candidats effectifs, incomparable d'un tokenizer à l'autre).
Une carte qui résiste après cette chaîne est une carte à refondre, pas une section à relire.