Focal Loss가 필요한 이유
Object Detection은 R-CNN 계열의 `two-stage detector`와 YOLO, SSD 계열의 `one-stage detector` 2가지 종류의 알고리즘이 존재한다. 간단하게 말하면 two-stage detector는 localization을 수행한 후 classification이 순차적으로 이루어지며, one-stage detector는 이를 동시에 수행한다. 당연하게도 정확도 측면에서는 two-stage detector가 좋지만 연산 속도가 오래 걸린다는 단점이 존재한다.
`Focal Loss`는 one-stage detector의 정확도 개선을 위해 학습 중 클래스 불균형 문제를 해결하기 위해 제안된 loss이다. one-stage detector의 학습 중 클래스 불균형 문제란, 이미지 내에서 실제 객체에 대해 박스를 친 것보다 백그라운드에 대해 박스를 친 것의 비중이 매우 높다는 것이다. 학습 중에는 배경에 대한 박스를 출력하는 경우 오분류라고 학습이 되는데, 이 빈도수가 너무 많아 학습에 방해가 된다. 여기서의 백그라운드의 경우 Detector에 의해 쉽게 분류될 수 있어 `easy negative`이며, 이는 비효율적인 학습의 원인이 된다. 즉, easy negative 각각의 loss는 높은 확률로 객체가 아님을 구분할 수 있으므로 낮은 값을 갖게 되는데(반대로 어려운 문제에 해당하는 객체의 경우 큰 loss 값을 갖게 됨), 이 비중이 매우 크므로 전체 loss와 gradient 계산시 easy negative의 영향이 압도적으로 커지게 된다.
Focal Loss는 이러한 문제점을 해결하기 위해 기존 `Cross Entropy Loss`를 개선하여 easy negative의 weight를 확 줄이고, `hard negative`에 중점적으로 학습의 초점을 맞추게 된다. 여기서의 hard negative란 실제 분류를 수행해야하는 객체에 해당한다.
Focal Loss
- $p_t$ : example에 대한 모델의 출력 확률(confidence)
- $(1-p_t)^{\gamma}$ : modulating factor
- $\gamma$ : focusing parameter -> easy negative에 대한 loss의 비중을 낮추는 역할
`Focal Loss`란 결국 easy negative의 weight를 줄이고, hard negative에 대한 학습에 초점을 맞추는 Cross Entropy Loss의 확장판이라고 볼 수 있다. 식을 보면 `modulating factor` $(1-p_t)^{\gamma}$가$p_t$ 값이 큰 easy sample에 대해선 작아지고, 반대로 어려운 hard sample에 대해선 커지게 되어 easy sample에 대한 패널티를 부여한다. 기존 Cross Entropy Loss 대비 추가된 modulating factor에서 `focusing parameter`에 해당하는 $\gamma$의 값을 잘 조절해야 좋은 성능을 얻을 수 있다. 여기에 전체 loss 값을 조절하는 $\alpha$ 값도 사용되기 때문에 이 $\alpha, \gamma$ 값을 잘 조절해야 한다. Focal Loss를 제시한 논문에서는 $\alpha=0.25, \gamma=2$ 값을 최종적으로 사용했다.
위의 그래프는 `focusing parameter` $\gamma$ 값에 따른 loss 값의 변화를 나타냈다. 해당 그래프를 통해 `\gamma` 값이 0인 경우에는 Cross Entropy Loss와 동일하며, 이 값이 커질수록 easy example에 대한 loss가 크게 줄어드는 것을 확인할 수 있다.
Reference
[1] https://gaussian37.github.io/dl-concept-focal_loss/
[2] https://velog.io/@heaseo/Focalloss-%EC%84%A4%EB%AA%85
[3] https://medium.com/@hichengkang/focal-loss-97ec5b44a2da