Focal Loss
포컬 손실은 교차 엔트로피의 가중치를 조정해 쉬운 예시의 영향은 줄이고 희귀하고 어려운 예시가 학습을 주도하게 합니다. 공식, 감마, RetinaNet, 변형을 다룹니다.
Focal loss는 모델이 이미 잘 분류하는 예제의 가중치를 낮추는 변형 교차 엔트로피 손실 함수로, 학습이 분류하기 어려운 예제와 오분류된 예제에 집중되도록 합니다. Lin 등은 RetinaNet 탐지기와 함께 2017년 논문 Focal Loss for Dense Object Detection에서 이 방법을 소개하여 객체 탐지에서 배경과 객체 간의 극심한 불균형을 처리했습니다. 현재는 한 클래스가 다른 클래스보다 훨씬 많은 분류 문제에 널리 사용됩니다.
불균형 문제#
One-stage 객체 탐지기는 이미지의 모든 후보 위치를 분류하며, RetinaNet은 이미지당 약 100,000개를 평가합니다. 이 위치의 거의 대부분은 배경이며, 모델은 학습 초기에 배경을 거부하도록 학습합니다. 표준 교차 엔트로피에서는 분류하기 쉬운 각 음성 예제도 작은 손실을 더합니다. 그러나 예제 수가 워낙 많아 전체 손실과 그 gradient를 지배하면서 객체가 있는 소수의 위치에서 나오는 신호를 압도합니다. Two-stage 객체 탐지기는 영역 제안 단계에서 후보를 필터링하고 전경과 배경의 비율을 고정해 샘플링함으로써 이 문제를 피합니다. 초기 one-stage 탐지기는 hard negative mining에 의존했습니다. Focal loss는 손실 함수 자체에서 불균형을 해결하므로 샘플링 없이 모든 후보를 학습에 사용할 수 있습니다.
Focal Loss의 작동 방식#
정답 클래스에 모델이 부여한 확률을 p_t이라고 합시다. 교차 엔트로피는 CE = -log(p_t)이며, focal loss는 여기에 조절 인자를 곱합니다:
FL = -α_t (1 - p_t)^γ log(p_t)
- 집중 매개변수
γ(gamma): 분류하기 쉬운 예제의 손실이 줄어드는 속도를 조절합니다.γ = 0에서는 focal loss가 교차 엔트로피와 같습니다.p_t가 1에 가까워질수록(1 - p_t)^γ은 0에 가까워지지만, 오분류된 예제는p_t가 작으므로 교차 엔트로피 손실이 거의 그대로 유지됩니다. 논문에서 최적이라고 제시한 설정인γ = 2를 사용하면p_t = 0.9으로 분류된 예제의 손실은 교차 엔트로피보다 100배 작아집니다. - 균형 가중치
α_t(alpha): 양성 클래스에는 고정 가중치를 적용하고 음성 클래스에는 그 여집합을 적용합니다. RetinaNet은α = 0.25과γ = 2를 사용하며, 논문에서는 각 이미지의 전체 손실을 객체에 할당된 anchor 수로 정규화하기도 합니다.
torchvision의 sigmoid_focal_loss 함수는 이 공식을 구현합니다. alpha=-1를 설정하면 균형 가중치가 비활성화되어, 쉽거나 보통이거나 어려운 양성 예제에 대한 γ의 효과만 분리해 확인할 수 있습니다:
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")Focal loss는 쉬운 예제의 손실(p = 0.98)을 약 3,091분의 1로, 보통 난이도 예제의 손실(p = 0.73)을 13.8분의 1로, 어려운 예제의 손실(p = 0.12)을 1.3분의 1로 줄입니다. 따라서 어려운 예제가 이제 학습 신호의 대부분을 차지합니다.
Focal Loss의 활용 분야#
RetinaNet 외에도 focal loss와 그 변형은 여러 dense detector 및 Transformer 기반 탐지기의 분류 분기를 학습하는 데 사용됩니다. 여기에는 Deformable DETR 같은 DETR 계열 모델이 포함됩니다. 의료 영상 분석에서는 병변이 전체 픽셀 중 극히 일부를 차지하는 경우가 많으므로 이미지 분할 모델은 작은 병변을 무시하지 않고 재현율을 높이기 위해 focal loss와 Dice loss를 함께 사용하는 경우가 많습니다. Ultralytics의 RT-DETR trainer는 Varifocal Loss로 클래스를 점수화하며, ultralytics.utils.loss 모듈은 기본값 gamma=1.5 및 alpha=0.25를 사용하는 FocalLoss 클래스를 제공합니다.
Focal Loss와 관련 기법 비교#
- 클래스 가중치: 가중 교차 엔트로피는 클래스 빈도에 따라 희귀 클래스의 모든 예제에 동일한 고정 가중치를 적용합니다. Focal loss는 각 예제의 현재 난이도에 따라 가중치를 부여하므로, 모델이 학습하면서 가중치가 바뀝니다.
- Hard negative mining: 손실이 가장 큰 음성 예제만 남기고 나머지는 버립니다. Focal loss는 모든 예제를 유지하면서 쉬운 예제의 가중치를 부드럽게 줄입니다.
- Varifocal Loss: VarifocalNet에서 제안한 비대칭 변형으로, 음성 예제의 가중치만 낮추고 양성 예제는 IoU를 반영하는 점수를 향해 학습합니다. 따라서 클래스 신뢰도에도 위치 파악 품질이 반영됩니다.
- Distribution Focal Loss (DFL): Generalized Focal Loss에서 제안한 box 회귀 손실로, 각 box 변을 이산 확률 분포로 다룹니다. 이름만 focal loss와 공유하며 box 회귀에 적용됩니다.










