Cross-Entropy (Entropie Croisée)
La cross-entropy (entropie croisée) est une fonction de perte qui mesure l’écart entre la distribution de probabilité prédite par un modèle et la distribution réelle des classes, en pénalisant fortement les prédictions confiantes mais incorrectes.
C’est la loss function la plus utilisée en classification, aussi bien en machine learning classique (régression logistique) qu’en deep learning (réseaux de neurones classificateurs, LLMs). Son succès tient à une propriété clé : elle produit des gradients informatifs qui permettent au modèle de corriger rapidement ses erreurs, même quand les prédictions sont très éloignées de la cible. Historiquement, la cross-entropy tire ses racines de la théorie de l’information de Claude Shannon (1948), où l’entropie mesure l’incertitude d’une source d’information.
- Nom français
- Entropie croisée (aussi : log loss, perte logarithmique)
- Type
- Fonction de perte pour la classification
- Origine
- Théorie de l’information (Shannon, 1948), appliquée au ML via la régression logistique
- Variantes
- Binary Cross-Entropy (BCE), Categorical Cross-Entropy (CCE), Sparse CCE
- Usage
- Classification binaire, multi-classe, multi-label, entraînement des LLMs
- Frameworks
- PyTorch (
nn.CrossEntropyLoss), Keras (categorical_crossentropy) - Verdict
- Choix par défaut pour toute tâche de classification. Supérieur au MSE pour les problèmes catégoriels.
L’intuition : punir les erreurs confiantes
La cross-entropy répond à une question simple : à quel point le modèle « se trompe » dans ses prédictions probabilistes ? Mais elle ne traite pas toutes les erreurs de la même façon.
Imaginons un classificateur binaire (chat ou chien). Pour une image de chat :
Si le modèle prédit « chat à 90 % » (ŷ = 0.9), la cross-entropy est faible : -log(0.9) ≈ 0.105. Le modèle est confiant et correct. Tout va bien.
Si le modèle prédit « chat à 60 % » (ŷ = 0.6), la cross-entropy est modérée : -log(0.6) ≈ 0.511. Le modèle hésite. La loss le pousse à être plus confiant.
Si le modèle prédit « chat à 10 % » (ŷ = 0.1), la cross-entropy est élevée : -log(0.1) ≈ 2.303. Le modèle est confiant dans la mauvaise direction. La loss explose.
Si le modèle prédit « chat à 0.01 % » (ŷ = 0.0001), la cross-entropy est catastrophique : -log(0.0001) ≈ 9.210. Le modèle est extrêmement confiant et complètement faux. Le gradient sera très fort, forçant une correction massive.
Ce comportement asymétrique (pénalité croissante de façon logarithmique pour les erreurs confiantes) est exactement ce qu’on veut : un modèle confiant et correct n’est presque pas pénalisé, tandis qu’un modèle confiant et faux reçoit un signal d’erreur très fort.
Racines en théorie de l’information
Pour comprendre la cross-entropy, il faut remonter à deux concepts fondamentaux de la théorie de l’information.
L’entropie de Shannon
L’entropie mesure l’incertitude (ou le « désordre ») d’une distribution de probabilité :
H(p) = -Σᵢ pᵢ · log(pᵢ)
Pour une distribution certaine (une classe à 100 %), l’entropie est 0 : il n’y a aucune incertitude. Pour une distribution uniforme (toutes les classes équiprobables), l’entropie est maximale : l’incertitude est totale. L’entropie peut aussi être interprétée comme le nombre minimum de bits nécessaires pour encoder un message tiré de cette distribution.
La cross-entropy entre deux distributions
La cross-entropy entre la distribution réelle p et la distribution prédite q est :
H(p, q) = -Σᵢ pᵢ · log(qᵢ)
Elle mesure le nombre moyen de bits nécessaires pour encoder des données de la distribution p en utilisant un code optimisé pour la distribution q. Si q est différent de p, il faut plus de bits que le minimum (l’entropie de p). La « différence » entre les deux est la divergence KL (Kullback-Leibler) :
KL(p || q) = H(p, q) - H(p) ≥ 0
En machine learning, p est fixe (les labels réels), donc minimiser la cross-entropy H(p, q) revient à minimiser la divergence KL, ce qui rapproche les prédictions q de la réalité p.
Binary Cross-Entropy (BCE)
Pour la classification binaire (deux classes : 0 ou 1). Le modèle produit une probabilité ŷ ∈ (0, 1) via une sigmoïde.
BCE = -(1/N) · Σᵢ [yᵢ · log(ŷᵢ) + (1 - yᵢ) · log(1 - ŷᵢ)]
Décortiquons cette formule pour un seul exemple :
Si la vraie classe est 1 (y = 1) : la loss se réduit à -log(ŷ). Plus ŷ est proche de 1, plus la loss est faible. C’est le terme qui récompense les bonnes prédictions pour la classe positive.
Si la vraie classe est 0 (y = 0) : la loss se réduit à -log(1 - ŷ). Plus ŷ est proche de 0, plus la loss est faible. C’est le terme qui récompense les bonnes prédictions pour la classe négative.
Quand utiliser BCE : classification binaire (spam/non-spam, positif/négatif), mais aussi classification multi-label (chaque label est traité comme une classification binaire indépendante). En multi-label, un exemple peut appartenir à plusieurs classes simultanément.
Le gradient de la BCE
Le gradient de la BCE par rapport aux logits (avant sigmoïde) est remarquablement simple :
∂BCE/∂z = ŷ - y
C’est simplement la différence entre la prédiction et la cible. Cette élégance mathématique (due à l’annulation de la dérivée de la sigmoïde avec le logarithme) produit un gradient qui ne sature jamais : quand le modèle se trompe fortement, le gradient est fort. Quand il est correct, le gradient est faible. C’est exactement le comportement souhaité, et c’est la raison fondamentale pour laquelle la cross-entropy est supérieure au MSE pour la classification.
Categorical Cross-Entropy (CCE)
Pour la classification multi-classe (C > 2 classes, un seul label par exemple). Le modèle produit un vecteur de probabilités via softmax.
CCE = -(1/N) · Σᵢ Σⱼ yᵢⱼ · log(ŷᵢⱼ) # somme sur N exemples et C classes
Comme les labels y sont one-hot (un seul 1, le reste à 0), la somme sur les classes se simplifie :
CCE = -(1/N) · Σᵢ log(ŷᵢ,cᵢ) # cᵢ = indice de la vraie classe de l'exemple i
Pour chaque exemple, seule la probabilité assignée à la bonne classe compte. La loss est le négatif du logarithme de cette probabilité. Plus le modèle est confiant dans la bonne classe, plus la loss est faible.
Quand utiliser CCE : classification d’images (ImageNet, CIFAR), classification de texte (analyse de sentiment multi-classe), prédiction du prochain token dans les LLMs (le vocabulaire est traité comme les classes).
Implémentation dans les frameworks
PyTorch : les pièges à éviter
PyTorch propose plusieurs implémentations de la cross-entropy. Comprendre laquelle utiliser et quand est crucial.
import torch
import torch.nn as nn
# 1. Classification multi-classe (le plus courant)
# ATTEND DES LOGITS (pas de softmax dans le modèle !)
criterion = nn.CrossEntropyLoss()
logits = model(x) # forme : [batch_size, num_classes]
labels = target # forme : [batch_size], valeurs entières 0..C-1
loss = criterion(logits, labels)
# 2. Classification binaire
# ATTEND DES LOGITS (pas de sigmoïde dans le modèle !)
criterion = nn.BCEWithLogitsLoss()
logits = model(x) # forme : [batch_size, 1] ou [batch_size]
targets = target.float() # forme : [batch_size], valeurs 0.0 ou 1.0
loss = criterion(logits, targets)
# 3. Avec poids de classe (classes déséquilibrées)
weights = torch.tensor([1.0, 5.0, 2.0]) # poids par classe
criterion = nn.CrossEntropyLoss(weight=weights)
# 4. Avec label smoothing (régularisation)
criterion = nn.CrossEntropyLoss(label_smoothing=0.1)
nn.CrossEntropyLoss applique le softmax en interne. Si votre modèle a déjà un softmax en sortie, vous appliquez softmax deux fois. Le résultat : des gradients incorrects, un entraînement qui converge mal, et des heures de débogage. Règle simple : votre modèle doit retourner des logits bruts (pas de softmax), et nn.CrossEntropyLoss se charge du reste. C’est aussi plus stable numériquement, car le softmax et le log sont combinés en une seule opération (log-sum-exp trick).
Keras
import keras
# Classification multi-classe avec labels entiers (0, 1, 2, ...)
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# Classification multi-classe avec labels one-hot
model.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy']
)
# Classification binaire
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy']
)
# Avec label smoothing
loss_fn = keras.losses.CategoricalCrossentropy(label_smoothing=0.1)
model.compile(optimizer='adam', loss=loss_fn)
Pourquoi la cross-entropy est supérieure au MSE pour la classification
C’est une question fondamentale que beaucoup de débutants se posent. Voici la comparaison détaillée.
| Critère | Cross-Entropy | MSE |
|---|---|---|
| Gradient quand le modèle est confiant et faux | Fort (pas de saturation) | Faible (saturation de la sigmoïde) |
| Vitesse de convergence | Rapide | Lente (gradient faible aux extrêmes) |
| Interprétation probabiliste | Oui (divergence KL) | Non (distance euclidienne) |
| Stabilité numérique | Excellente (avec log-sum-exp) | Bonne |
| Adapté aux sorties softmax/sigmoïde | Oui (par construction) | Mal adapté |
| Usage standard | Toute classification | Régression |
Le problème central du MSE pour la classification : quand la sigmoïde sature (sortie proche de 0 ou 1), sa dérivée tend vers zéro. Le gradient du MSE, qui inclut cette dérivée, devient extrêmement faible. Le modèle « sait » qu’il se trompe (le MSE est élevé), mais le gradient est trop faible pour corriger l’erreur rapidement. C’est le phénomène de « learning slowdown ».
Avec la cross-entropy, le logarithme annule la saturation de la sigmoïde. Le gradient résultant est simplement (ŷ – y), sans aucune composante qui sature. Le signal d’apprentissage reste fort même quand le modèle est très confiant et très faux.
Label Smoothing : régulariser la cross-entropy
Le label smoothing est une technique de régularisation qui « adoucit » les labels one-hot. Au lieu de cibler [1, 0, 0] pour la classe 0, on cible [0.9, 0.05, 0.05] (avec un facteur de smoothing ε = 0.1).
y_smoothed = (1 - ε) · y_onehot + ε / C # C = nombre de classes
Pourquoi ça marche : sans smoothing, la cross-entropy pousse le modèle à assigner une probabilité de 100 % à la bonne classe, ce qui nécessite des logits infinis. Cela produit un modèle « trop confiant » qui généralise mal. Le label smoothing empêche cette surconfiance en enseignant au modèle qu’aucune prédiction ne devrait être à 100 %.
Quand l’utiliser : entraînement des Transformers, classification d’images (ε = 0.1 est le défaut dans de nombreuses recettes d’entraînement modernes), distillation de modèles. Les LLMs n’utilisent généralement pas de label smoothing car la prédiction du prochain token nécessite des distributions nettes.
Variantes et extensions
Focal Loss
Variante de la cross-entropy qui réduit la contribution des exemples « faciles » (bien classés) pour concentrer l’entraînement sur les exemples difficiles. Introduite pour la détection d’objets (Lin et al., 2017), où le ratio fond/objet est extrême.
FL = -α · (1 - ŷ)ᵧ · log(ŷ) # γ = 2 typiquement
KL Divergence
Mesure la « distance » entre deux distributions de probabilité. Liée à la cross-entropy par : KL(p||q) = H(p,q) – H(p). Utilisée dans les VAE (Variational Autoencoders) comme terme de régularisation, et dans la distillation de modèles (knowledge distillation).
Sparse Categorical Cross-Entropy
Identique à la CCE classique, mais accepte les labels sous forme d’entiers (indice de classe) au lieu de vecteurs one-hot. Plus efficace en mémoire pour les problèmes avec beaucoup de classes. C’est le format utilisé par les LLMs (le label est l’indice du token dans le vocabulaire).
Weighted Cross-Entropy
Attribue un poids différent à chaque classe pour gérer le déséquilibre. Les classes rares reçoivent un poids plus élevé, ce qui augmente leur contribution à la loss totale et force le modèle à mieux les apprendre.
Stabilité numérique
La cross-entropy implique le calcul de log(ŷ). Si ŷ = 0 (le modèle prédit 0 % pour la bonne classe), log(0) = -∞ et la loss explose. En pratique, deux techniques garantissent la stabilité :
Le clipping : remplacer ŷ par max(ŷ, ε) avec ε ≈ 1e-7 avant de calculer le logarithme. Simple mais légèrement inexact.
Le log-sum-exp trick : combiner le softmax et le logarithme en une seule opération numériquement stable. C’est ce que fait nn.CrossEntropyLoss de PyTorch : au lieu de calculer softmax(z) puis log(softmax(z)), il calcule directement log_softmax(z) = z – log(Σ exp(z)), en soustrayant le max des logits pour éviter les overflows. C’est pourquoi il attend des logits bruts, pas des probabilités.
-y * torch.log(softmax(z))) produit des NaN dès que les logits sont grands.
Exemples numériques
Exemple binaire
# Image de chat (y = 1)
# Modèle confiant et correct : ŷ = 0.95
BCE = -(1 * log(0.95) + 0 * log(0.05)) = 0.051
# Modèle incertain : ŷ = 0.5
BCE = -(1 * log(0.5) + 0 * log(0.5)) = 0.693
# Modèle confiant et faux : ŷ = 0.05
BCE = -(1 * log(0.05) + 0 * log(0.95)) = 2.996
Exemple multi-classe
# 3 classes : [chat, chien, oiseau]
# Vrai label : chat (y = [1, 0, 0])
# Bonne prédiction : ŷ = [0.85, 0.10, 0.05]
CCE = -log(0.85) = 0.163
# Mauvaise prédiction : ŷ = [0.20, 0.60, 0.20]
CCE = -log(0.20) = 1.609
# Prédiction aléatoire uniforme : ŷ = [0.33, 0.33, 0.33]
CCE = -log(0.33) = 1.109
Notez que pour une classification aléatoire à C classes, la cross-entropy vaut log(C). Pour 1000 classes (ImageNet), c’est log(1000) ≈ 6.91. Tout modèle dont la loss est inférieure à cette valeur fait mieux que le hasard.
Le comportement probabiliste de la cross-entropy
La cross-entropy a une propriété remarquable : elle force le modèle à produire des prédictions calibrées. Un modèle entraîné avec la cross-entropy qui prédit « 80 % chat » pour 100 images devrait avoir environ 80 images correctement classées comme chats. Ce n’est pas garanti (la calibration se dégrade souvent sur des données hors distribution), mais c’est un effet naturel de la loss.
Lien avec le maximum de vraisemblance. Minimiser la cross-entropy est mathématiquement équivalent à maximiser la log-vraisemblance (maximum likelihood estimation, MLE) du modèle. En régression logistique, la cross-entropy est directement dérivée de la vraisemblance bernouillienne. Pour les réseaux de neurones avec softmax, c’est la vraisemblance catégorielle. Cette équivalence explique pourquoi la cross-entropy est le choix « naturel » pour la classification : c’est la loss qui découle directement du cadre probabiliste.
Comportement avec les labels bruités. Si vos données contiennent des labels incorrects (bruit de labélisation), la cross-entropy pousse le modèle à être incertain sur les exemples ambigus. Un modèle qui voit la même image labélisée « chat » 70 % du temps et « chien » 30 % du temps apprendra à prédire [0.7, 0.3], ce qui minimise la cross-entropy attendue. Ce comportement est mathématiquement optimal, mais peut poser problème si le bruit n’est pas uniformément réparti. Le label smoothing atténue cet effet en empêchant les prédictions trop confiantes.
Cas d’usage avancés
Knowledge Distillation
La distillation de modèles (Hinton et al., 2015) utilise la cross-entropy d’une façon originale. Au lieu d’entraîner un petit modèle (élève) sur les labels durs (one-hot), on l’entraîne sur les « soft labels » produits par un grand modèle (professeur). La loss combine la cross-entropy classique (labels durs) et la cross-entropy entre les sorties softmax du professeur et de l’élève, à une « température » T > 1 qui adoucit les distributions.
L_distil = α · CCE(y_hard, ŷ_élève) + (1-α) · T² · CCE(softmax(z_prof/T), softmax(z_élève/T))
Le facteur T² compense le fait que les gradients des distributions adoucies sont T² fois plus petits.
Apprentissage contrastif
Les modèles comme CLIP ou SimCLR utilisent une variante de la cross-entropy appliquée à des paires d’embeddings. La « InfoNCE loss » traite chaque paire positive comme une classification multi-classe parmi toutes les paires négatives du batch. C’est une cross-entropy catégorielle sur les similarités cosinus.
RLHF et DPO
L’alignement des LLMs utilise des loss dérivées de la cross-entropy pour optimiser les préférences humaines. La DPO (Direct Preference Optimization) formule l’alignement comme une classification binaire entre la réponse préférée et la réponse rejetée, en utilisant une variante de la BCE appliquée au ratio des log-probabilités du modèle.
Bonnes pratiques
1. Utilisez les variantes « with logits » des frameworks. nn.CrossEntropyLoss (PyTorch) et BCEWithLogitsLoss combinent softmax/sigmoïde et la loss en une seule opération stable. Ne mettez pas de softmax ou sigmoïde dans votre modèle si vous utilisez ces loss.
2. Surveillez la loss d’entraînement. Pour la classification multi-classe à C classes, la loss initiale (avant entraînement) devrait être proche de log(C) si les poids sont initialisés aléatoirement. Si elle est beaucoup plus élevée, quelque chose ne va pas (labels incorrects, mauvaise dimension).
3. Gérez le déséquilibre des classes. Avec des classes déséquilibrées, la cross-entropy standard est dominée par la classe majoritaire. Utilisez des poids de classe (weight=...), la focal loss, ou le suréchantillonnage.
4. Considérez le label smoothing. Pour les Transformers et les CNNs, un label smoothing de 0.1 améliore souvent la généralisation en empêchant le modèle de devenir trop confiant.
5. Vérifiez les dimensions de vos tenseurs. En PyTorch, nn.CrossEntropyLoss attend des logits de forme [batch, classes] et des labels de forme [batch] (entiers). Confondre les dimensions est une source fréquente de bugs silencieux.
Questions fréquentes sur la cross-entropy
Quelle est la différence entre cross-entropy et log loss ?
En machine learning, les termes « cross-entropy loss » et « log loss » (perte logarithmique) désignent la même chose. Log loss est le nom historique utilisé en régression logistique. Cross-entropy est le nom issu de la théorie de l’information. Les formules sont identiques. La seule nuance : en théorie de l’information pure, la cross-entropy H(p,q) inclut l’entropie de la distribution source H(p), tandis que la log loss en ML ne considère que les labels one-hot (pour lesquels H(p) = 0). En pratique, la distinction est sans importance car minimiser l’un revient à minimiser l’autre.
Pourquoi ne pas utiliser l’accuracy comme loss function au lieu de la cross-entropy ?
L’accuracy (pourcentage de bonnes prédictions) n’est pas différentiable : elle vaut 0 ou 1 pour chaque exemple, et sa dérivée est zéro partout sauf aux points de discontinuité. La rétropropagation a besoin d’un gradient pour ajuster les poids. La cross-entropy est une « version continue » de l’accuracy : elle mesure non seulement si la prédiction est correcte, mais aussi avec quelle confiance, produisant un gradient lisse et informatif. On entraîne avec la cross-entropy et on évalue avec l’accuracy.
Comment interpréter la valeur de la cross-entropy ?
La cross-entropy est toujours positive (≥ 0). Une valeur de 0 signifie des prédictions parfaites (probabilité de 1 pour la bonne classe). Pour C classes, la valeur maximale théorique est -log(1/C) = log(C), qui correspond à une prédiction uniforme (hasard). Pour ImageNet (1000 classes), log(1000) ≈ 6.91. Un modèle dont la loss d’entraînement est de 2.0 fait bien mieux que le hasard mais n’est pas encore excellent. En pratique, les meilleurs modèles atteignent des valeurs entre 0.5 et 1.5 sur ImageNet.
Quelle est la relation entre cross-entropy et la perplexité des LLMs ?
La perplexité est simplement l’exponentielle de la cross-entropy : perplexité = e^(CCE). Si la cross-entropy moyenne par token est de 3.0, la perplexité est e³ ≈ 20. Cela signifie que le modèle est en moyenne aussi incertain que s’il choisissait uniformément parmi 20 tokens à chaque position. Plus la perplexité est basse, meilleur est le modèle. Les LLMs modernes atteignent des perplexités de 5 à 15 sur des benchmarks standard, correspondant à des cross-entropies de 1.6 à 2.7.
Binary cross-entropy ou categorical cross-entropy pour 2 classes ?
Les deux fonctionnent et sont mathématiquement équivalentes pour la classification binaire. Avec la BCE, le modèle a une seule sortie + sigmoïde. Avec la CCE, il a deux sorties + softmax. La BCE est plus efficace (un seul neurone de sortie au lieu de deux) et est le choix standard pour la classification binaire. La CCE à 2 classes n’apporte aucun avantage et double inutilement la taille de la couche de sortie. Utilisez BCE pour le binaire, CCE pour les problèmes à 3 classes ou plus.