Focal Loss
La perte focale pondère l’entropie croisée afin que les exemples faciles comptent à peine et que les exemples rares et difficiles guident l’entraînement. Présentation de la formule, du gamma, de RetinaNet et des variantes.
La perte focale est une fonction de perte d’entropie croisée modifiée qui réduit le poids des exemples que le modèle classe déjà correctement, afin que l’entraînement se concentre sur les exemples difficiles mal classés. Lin et ses collègues l’ont présentée en 2017 dans l’article Focal Loss for Dense Object Detection, avec le détecteur RetinaNet, pour traiter le déséquilibre extrême entre arrière-plan et objets dans la détection d’objets. Elle est aujourd’hui largement utilisée dans les problèmes de classification où une classe est largement plus représentée que les autres.
Le problème du déséquilibre#
Les détecteurs d’objets à une étape classent chaque emplacement candidat d’une image, et RetinaNet en évalue environ 100,000 par image. Presque tous ces emplacements correspondent à l’arrière-plan, que le modèle apprend rapidement à rejeter au début de l’entraînement. Avec l’entropie croisée standard, chaque négatif facile contribue encore légèrement à la perte ; leur nombre considérable domine donc la perte totale et ses gradients, au détriment des quelques emplacements qui contiennent des objets. Les détecteurs d’objets à deux étapes évitent ce problème en filtrant les candidats au moyen d’une étape de proposition de régions et en échantillonnant un rapport fixe de premier plan et d’arrière-plan ; les premiers détecteurs à une étape s’appuyaient sur l’échantillonnage des exemples négatifs difficiles. La perte focale corrige le déséquilibre directement dans la fonction de perte, ce qui permet d’entraîner tous les candidats sans échantillonnage.
Fonctionnement de la perte focale#
Écrivons p_t pour désigner la probabilité que le modèle attribue à la classe correcte. L’entropie croisée est CE = -log(p_t), et la perte focale la multiplie par un facteur modulateur :
FL = -α_t (1 - p_t)^γ log(p_t)
- Paramètre de focalisation
γ(gamma) : contrôle la vitesse à laquelle la perte des exemples faciles diminue. Pourγ = 0, la perte focale est égale à l’entropie croisée. Quandp_ttend vers 1,(1 - p_t)^γtend vers 0, tandis qu’un exemple mal classé avec un faiblep_tconserve presque toute sa perte d’entropie croisée. Avec le meilleur réglage de l’article,γ = 2, un exemple classé avecp_t = 0.9reçoit une perte 100 fois inférieure à celle obtenue avec l’entropie croisée. - Poids d’équilibrage
α_t(alpha) : poids fixe pour la classe positive, complété par son complément pour la classe négative. RetinaNet utiliseα = 0.25avecγ = 2, et l’article normalise également la perte totale de chaque image par le nombre d’ancres attribuées aux objets.
La fonction sigmoid_focal_loss de torchvision implémente la formule. Définir alpha=-1 désactive le poids d’équilibrage, ce qui isole l’effet de γ sur un exemple positif facile, moyen et difficile :
import torch
import torch.nn.functional as F
from torchvision.ops import sigmoid_focal_loss
# Logits for three positive examples: easy, moderate, and hard
logits = torch.tensor([4.0, 1.0, -2.0])
targets = torch.ones(3)
# alpha=-1 turns off class weighting so only the gamma focusing term differs
bce = F.binary_cross_entropy_with_logits(logits, targets, reduction="none")
focal = sigmoid_focal_loss(logits, targets, alpha=-1, gamma=2.0, reduction="none")
for p, b, f in zip(logits.sigmoid(), bce, focal):
print(f"p={p:.2f} cross-entropy={b:.6f} focal={f:.6f} ratio={b / f:,.1f}x")La perte focale réduit la perte de l’exemple facile (p = 0.98) d’un facteur d’environ 3,091, celle de l’exemple moyen (p = 0.73) d’un facteur de 13.8 et celle de l’exemple difficile (p = 0.12) d’un facteur de seulement 1.3 ; l’exemple difficile porte ainsi presque tout le signal d’entraînement.
Utilisations de la perte focale#
Au-delà de RetinaNet, la perte focale et ses variantes entraînent la branche de classification de nombreux détecteurs denses et détecteurs à base de Transformer, notamment des modèles de la famille DETR comme Deformable DETR. En analyse d’images médicales, les lésions couvrent souvent une infime partie des pixels ; les modèles de segmentation d’images associent donc couramment la perte focale à la perte Dice pour éviter d’ignorer les petites observations et améliorer le rappel. Chez Ultralytics, l’entraîneur RT-DETR évalue les classes avec la perte Varifocal, et le module ultralytics.utils.loss fournit une classe FocalLoss avec les valeurs par défaut gamma=1.5 et alpha=0.25.
Perte focale et techniques associées#
- Pondération des classes : l’entropie croisée pondérée accorde à chaque exemple d’une classe rare le même bonus fixe, calculé selon la fréquence de la classe. La perte focale pondère chaque exemple en fonction de sa difficulté actuelle ; les poids évoluent donc au fil de l’apprentissage du modèle.
- Échantillonnage des exemples négatifs difficiles : ne conserve que les négatifs dont la perte est la plus élevée et écarte les autres. La perte focale conserve tous les exemples et réduit progressivement le poids des exemples faciles.
- Perte Varifocal : variante asymétrique de VarifocalNet qui réduit le poids des seuls négatifs et entraîne les positifs vers un score tenant compte de l’IoU, afin que la confiance de classe reflète également la qualité de la localisation.
- Perte focale de distribution (DFL) : perte de régression de boîte issue de Generalized Focal Loss, qui traite chaque bord de boîte comme une distribution de probabilité discrète. Elle ne partage que son nom avec la perte focale et s’applique à la régression de boîte.










