Ответ
Стандартная бинарная кросс-энтропия (BCE) не всегда оптимальна, особенно при дисбалансе классов или наличии лёгких примеров. Вот ключевые модификации и альтернативы:
-
Взвешенная BCE (Weighted BCE): Присваивает больший вес классу с меньшим количеством примеров.
import torch.nn as nn # pos_weight = (количество негативных примеров) / (количество позитивных примеров) criterion = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([5.0])) -
Focal Loss: Предложена для детекции объектов. Динамически уменьшает вес для лёгких примеров (хорошо классифицируемых), фокусируя обучение на сложных.
def focal_loss(logits, targets, alpha=0.25, gamma=2.0): bce_loss = nn.functional.binary_cross_entropy_with_logits(logits, targets, reduction='none') pt = torch.exp(-bce_loss) # p_t из статьи focal_weight = alpha * (1 - pt) ** gamma loss = focal_weight * bce_loss return loss.mean() -
Dice Loss / F1 Loss: Прямо оптимизирует метрику, похожую на Dice coefficient (F1-score). Особенно полезна для задач сегментации медицинских изображений, где фон доминирует.
def dice_loss(pred, target, smooth=1e-6): pred = torch.sigmoid(pred) intersection = (pred * target).sum() dice = (2. * intersection + smooth) / (pred.sum() + target.sum() + smooth) return 1 - dice -
Label Smoothing: Заменяет жёсткие метки (0 и 1) на «мягкие» (например, 0.1 и 0.9). Это работает как регуляризатор, предотвращая излишнюю уверенность модели.
-
Lovász Hinge Loss: Дифференцируемый суррогат для оптимизации метрики IoU (Intersection over Union) в задачах бинарной сегментации.
Когда что использовать:
- Дисбаланс классов (1:100): Focal Loss или взвешенная BCE.
- Сегментация изображений: Dice Loss + BCE (комбинированная).
- Переобучение / излишняя уверенность: Label Smoothing.
- Требуется максимизация IoU: Lovász Loss.