Focal Loss
A focal loss pondera a entropia cruzada para que exemplos fáceis quase não contem e os exemplos raros e difíceis orientem o treinamento. Abrange a fórmula, gama, RetinaNet e variantes.
A perda focal é uma função de perda de entropia cruzada modificada que reduz o peso dos exemplos que o modelo já classifica bem, para que o treino se concentre nos exemplos difíceis e classificados incorretamente. Lin et al. apresentaram-na em 2017 no artigo Perda focal para deteção densa de objetos, juntamente com o detetor RetinaNet, para lidar com o desequilíbrio extremo entre o fundo e os objetos na deteção de objetos. Atualmente, é muito utilizada em problemas de classificação em que uma classe tem muito mais exemplos do que as outras.
O problema do desequilíbrio#
Os detetores de objetos de uma etapa classificam cada localização candidata numa imagem, e o RetinaNet avalia cerca de 100,000 por imagem. Quase todas essas localizações são fundo, que o modelo aprende a rejeitar logo no início do treino. Com a entropia cruzada padrão, cada exemplo negativo fácil ainda acrescenta uma pequena perda, e o seu grande número faz com que dominem a perda total e os respetivos gradientes, abafando as poucas localizações que contêm objetos. Os detetores de objetos de duas etapas evitam este problema ao filtrar candidatos numa etapa de propostas de regiões e ao amostrar uma proporção fixa de regiões de primeiro plano e de fundo; os detetores de uma etapa anteriores recorriam à seleção de exemplos negativos difíceis. A perda focal corrige o desequilíbrio na própria função de perda, pelo que é possível treinar com todos os candidatos sem amostragem.
Como funciona a perda focal#
Escreve p_t para representar a probabilidade que o modelo atribui à classe correta. A entropia cruzada é CE = -log(p_t), e a perda focal multiplica-a por um fator modulador:
FL = -α_t (1 - p_t)^γ log(p_t)
- Parâmetro de focalização
γ(gamma): Controla a rapidez com que a perda dos exemplos fáceis diminui. Comγ = 0, a perda focal é igual à entropia cruzada. À medida quep_tse aproxima de 1,(1 - p_t)^γaproxima-se de 0, enquanto um exemplo classificado incorretamente com um valor baixo dep_tmantém quase toda a sua perda de entropia cruzada. Com o melhor valor definido no artigo,γ = 2, um exemplo classificado comp_t = 0.9tem uma perda 100 vezes menor do que com a entropia cruzada. - Peso de equilíbrio
α_t(alpha): Um peso fixo para a classe positiva e o seu complemento para a classe negativa. O RetinaNet usaα = 0.25comγ = 2, e o artigo também normaliza a perda total de cada imagem pelo número de âncoras atribuídas a objetos.
A função sigmoid_focal_loss do torchvision implementa a fórmula. Definir alpha=-1 desativa o peso de equilíbrio, isolando o efeito de γ num exemplo positivo fácil, moderado e difícil:
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")A perda focal reduz a perda do exemplo fácil (p = 0.98) por um fator de cerca de 3,091, a do exemplo moderado (p = 0.73) por 13.8 e a do exemplo difícil (p = 0.12) por apenas 1.3, pelo que o exemplo difícil passa a representar quase todo o sinal de treino.
Onde se usa a perda focal#
Além do RetinaNet, a perda focal e as suas variantes treinam o ramo de classificação de muitos detetores densos e detetores baseados em Transformer, incluindo modelos da família DETR, como o Deformable DETR. Na análise de imagens médicas, as lesões ocupam muitas vezes uma fração ínfima dos píxeis, por isso os modelos de segmentação de imagens combinam frequentemente a perda focal com a perda Dice para evitar ignorar achados pequenos e aumentar a sensibilidade. Na Ultralytics, o treinador RT-DETR pontua as classes com a Varifocal Loss, e o módulo ultralytics.utils.loss disponibiliza uma classe FocalLoss com os valores predefinidos gamma=1.5 e alpha=0.25.
Perda focal vs. técnicas relacionadas#
- Ponderação de classes: A entropia cruzada ponderada dá a cada exemplo de uma classe rara o mesmo aumento fixo, com base na frequência da classe. A perda focal pondera cada exemplo de acordo com o seu grau de dificuldade atual, pelo que os pesos mudam à medida que o modelo aprende.
- Seleção de exemplos negativos difíceis: Mantém apenas os exemplos negativos com maior perda e descarta os restantes. A perda focal mantém todos os exemplos e reduz suavemente o peso dos mais fáceis.
- Varifocal Loss: Uma variante assimétrica da VarifocalNet que reduz o peso apenas dos exemplos negativos e treina os positivos para obter uma pontuação sensível ao IoU, fazendo com que a confiança da classe também reflita a qualidade da localização.
- Perda focal de distribuição (DFL): Uma perda de regressão de caixas da Generalized Focal Loss que trata cada aresta da caixa como uma distribuição de probabilidade discreta. Só partilha o nome com a perda focal e aplica-se à regressão de caixas.










