CELoss 식

$$ \sum_i^C -t_i\log(S_i) $$

$t_i$ : ground truth

$S_i$ : class i에 대한 score softmax값

$C$ : class 수

C에 2를 넣으면 BCE 식이 된다( Binary Cross Entropy )

segmentation에서 pixel-wisely 로 성능을 측정하는 보편적인 loss function으로, 이후의 distribution based loss들은 cross entropy의 변형이라고 볼 수 있음

BA7D1CCB-EE50-4759-8F67-0C283535D26C.jpeg

BCELoss $\sum_i^{C=2} -t_i\log(S_i) = -t_1(log(S_1)) - (1-t_1)\log(1-S_i)$

또한 class가 두개이면 sigmoid=softmax가 되어

이진분류일때 sigmoid-BCE Loss와 softmax-CELoss는 같게됩니다

torch.nn.CrossEntropyLoss()

이 식과 torch.nn.CrossEntropyLoss의 동작은 조금 다르다

CrossEntropyLoss - PyTorch 1.10.1 documentation

pytorch doc을 살펴보면

Untitled

여기서 $-\log(\frac{exp(x[class])}{\sum_j exp(x[j])})$ 를 보면 익숙한 모양이 보인다.

softmax에 -log를 취한 모습. LogSoftmax이다.

따라서 softmax 레이어를 따로 추가하거나 함수처리 해 줄 필요가 없다.