Cross-Entropy Loss
La perte d’entropie croisée compare les probabilités de classe prédites aux étiquettes cibles et guide les modèles de classification et de segmentation pendant l’entraînement.
La perte d’entropie croisée mesure à quel point les probabilités de classe prédites par un modèle correspondent à ses étiquettes cibles. Elle attribue une faible pénalité lorsque la classe correcte reçoit une probabilité élevée et une forte pénalité lorsque cette probabilité est faible. En tant que fonction de perte pour l’apprentissage supervisé, elle fournit un objectif à minimiser pendant l’entraînement.
La Théorie mathématique de la communication de Claude Shannon, publiée en 1948, a établi ses fondements liés à l’entropie. D. F. Kerridge a introduit la mesure d’entropie croisée sous le nom d’« inexactitude » dans son article de 1961 Inexactitude et inférence. En classification, la perte logarithmique est un synonyme ; la régression logistique et les classificateurs neuronaux l’utilisent tous deux.
Fonctionnement de la perte d’entropie croisée#
Pour un exemple comportant une seule classe correcte, l’entropie croisée non pondérée est loss = -ln(p_correct). Une probabilité de 0,9 pour la classe correcte donne une perte d’environ 0,105 ; une probabilité de 0,1 donne une perte d’environ 2,303. Les logarithmes naturels expriment le résultat en unités appelées nats. Pendant l’entraînement, ces pénalités sont généralement moyennées sur un lot.
Plus généralement, l’entropie croisée multiplie chaque probabilité cible par le logarithme négatif de sa probabilité prédite, puis additionne les résultats pour toutes les classes. Une cible one-hot attribue la valeur 1 à la classe correcte et 0 aux autres, de sorte qu’il ne reste que le terme de la classe correcte. Pour des cibles one-hot non pondérées, minimiser l’entropie croisée revient à maximiser la vraisemblance des étiquettes observées. La rétropropagation calcule les gradients, et la descente de gradient met à jour les paramètres du modèle.
Entropie croisée binaire, catégorielle et creuse#
La forme appropriée dépend des étiquettes :
- Entropie croisée binaire avec sigmoid : Pour une cible
yvalant 0 ou 1 et une probabilité préditeppour la classe 1, la perte est-[y * ln(p) + (1 - y) * ln(1 - p)]. La classification multilabel l’applique indépendamment aux étiquettes qui peuvent être présentes simultanément. - Entropie croisée catégorielle avec softmax : Cette fonction évalue des classes mutuellement exclusives dont les probabilités totalisent 1. Softmax convertit les scores bruts du modèle, appelés logits, en cette distribution.
- Entropie croisée catégorielle creuse : Cette fonction utilise un indice de classe entier plutôt qu’un vecteur one-hot. Elle calcule la même perte ; « creuse » décrit l’encodage de la cible.
Les cibles souples répartissent la probabilité entre les classes. On les retrouve dans le lissage des étiquettes et la distillation des connaissances, où un modèle étudiant apprend à partir de la distribution de probabilités d’un modèle enseignant.
Calculer l’entropie croisée dans PyTorch#
PyTorch accepte les logits bruts dans CrossEntropyLoss. Pour des cibles exprimées sous forme d’indices de classe, son calcul équivaut à appliquer log-softmax, puis la log-vraisemblance négative. Appliquer softmax au préalable amène la fonction à traiter les probabilités comme des logits, ce qui modifie la perte et les gradients. Les cibles entières utilisent torch.long ; les cibles probabilistes utilisent des valeurs en virgule flottante et ont la même forme que les logits.
import torch
from torch import nn
# Both predictions select class 0; the second is more confident.
logits = torch.tensor([[2.0, 0.0, 0.0], [4.0, 0.0, 0.0]])
targets = torch.tensor([0, 0], dtype=torch.long)
loss_fn = nn.CrossEntropyLoss(reduction="none")
losses = loss_fn(logits, targets)
print(f"Lower confidence loss: {losses[0].item():.4f}")
print(f"Higher confidence loss: {losses[1].item():.4f}")Les pertes passent de 0,2395 à 0,0360 tandis que les deux prédictions restent correctes. L’exactitude enregistre les décisions de classe ; l’entropie croisée tient aussi compte des probabilités attribuées. Pour les logits binaires ou multilabels, BCEWithLogitsLoss combine sigmoid et entropie croisée binaire.
Applications en vision par ordinateur#
La classification d’images à étiquette unique utilise l’entropie croisée pour apprendre une classe par image. L’entraînement à la classification de YOLO26 par Ultralytics utilise l’entropie croisée moyenne sur les logits de classe pour ajuster le classificateur en fonction de la catégorie étiquetée.
En segmentation d’images médicales, le modèle U-Net original a été entraîné sur des images de microscopie biomédicale avec softmax pixel par pixel et une entropie croisée pondérée. Sa carte de poids augmentait les pénalités aux frontières entre cellules adjacentes, aidant ainsi à séparer les cellules voisines. Cette approche applique la classification à chaque pixel en segmentation sémantique.
Interpréter les valeurs de perte#
L’entropie croisée discrète, avec des distributions cibles valides et des poids non négatifs, est non négative. Pour une cible dure non pondérée, elle atteint zéro lorsque la classe correcte reçoit une probabilité de 1 et augmente sans limite à mesure que cette probabilité approche de zéro. Des valeurs négatives indiquent une erreur d’entrée ou d’implémentation, par exemple des entrées ou des poids cibles négatifs.
L’entropie mesure l’incertitude au sein d’une distribution ; l’entropie croisée compare les cibles aux prédictions. L’entropie croisée est égale à l’entropie de la cible plus la divergence de Kullback–Leibler, qui constitue la pénalité supplémentaire liée à l’écart. Les cibles souples ont donc une valeur minimale positive lorsque leur entropie est positive.
La pondération des classes augmente la contribution de certaines classes. La perte focale réduit la contribution des exemples faciles afin de remédier au déséquilibre entre l’avant-plan et l’arrière-plan dans la détection d’objets. Pour une prédiction uniforme, la perte logarithmique non pondérée est égale à ln(number_of_classes) : environ 0,693 pour deux classes et 2,303 pour dix.










