오늘은 Supervised Semantic Segmentation에서 주로 사용되는 loss인 Cross Entropy loss에 대해서 설명하려고 합니다!
Cross Entropy는 위에 설명 그대로 P와 Q 두 확률간의 Entropy를 계산하는 것입니다.
여기서 P는 정답, Ground Truth라고 생각하고, Q는 예측한 값이라고 생각하면 될 것 같습니다.
Cross Entropy를 풀어서 쓴 식입니다. 첫번째 줄의 식을 -, + 를 해서 두번쨰 줄의 식처럼 바꿀 수 있습니다.
그랬을 때 두번째 줄의 식을 세번째 줄로 바꾸어 표현 가능합니다.
즉, 여기서 H(p)는 p의 entropy이고, 뒤의 식은 p와 q의 KL divergence를 구한 것입니다.
그럼 여기서 KL divergence가 무엇일까요?? KL divergence는 두 확률이 얼마나 유사한지를 계산하는 것입니다.
각 픽셀마다 정답에서의 값( P(x) )과 예측한 값( Q(x) )이 log에 들어간 후 P(x) 정답의 확률과 곱해지게 되고 이러한 값을 모두 합해주는 식으로 진행됩니다.
Cross Entropy를 간단히 정답과 예측값 사이의 유사정도를 파악 할 수 있는 loss라고 생각하면 됩니다!
그럼 Cross Entropy를 어떻게 사용하는지 Code에서 어떻게 쓰이는지 보도록 하겠습니다.
criterion = torch.nn.CrossEntropyLoss()
loss = criterion(predict, target)
위와 같이 작성해서 사용하면 됩니다.
근데 여기서 CrossEntropyLoss에 Parameter들이 여러개 있는데요, 저는 두가지만 설명을 드리려고 합니다.
여기서 default값이 weight = None으로 설정이 되어있는데요, weight 값을 저희가 넣어줄 수도 있습니다. 이것은 focal loss와도 연관이 있는데요, focal loss에 대해서는 나중에 따로 글을 작성하도록 할텐데요, 간단히 설명드리자면, train 시키고자하는 image들을 dataloader 부분에서 각 class가 얼마나의 weight을 가지고 있는지 확인해 그 값을 value.npy로 저장을 한 후 weight에 해당하는 각 class 별 계산한 값을 넣어줍니다.
Cross entropy loss weight 값을 default 값인 None으로 할때보다 dataloader에서 각 class 별 weight을 계산해 그 weight을 parameter에 넣어준 것이 성능이 더 잘나옵니다! 그리고 이것을 focal loss라고 합니다.
그리고 여기서 reduction parameter를 또 설명 드리려고 하는데요, reduction parameter의 default 값은 'mean'인데요, 즉 정답과 예측값의 cross entropy를 한 후 나온 값들의 평균을 내서 return해준다는 의미입니다.
하지만, 여기서 reduction = 'none'을 해주게 되면 평균을 return 해주는 것이 아닌 모든 pixel의 cross entropy 결과 값을 return 해줍니다. 또, reduction = 'sum'을 해주게 되면 합의 값을 return 해줍니다.
보통 reduction = 'mean', 즉 default값으로 설정이 되어있는 것을 사용하지만, 자신의 코드에 따라서 mean 값이 아닌 모든 pixel의 결과 차이 값을 return 값이 필요할 때도 있을 수 있기때문에 그럴 때는 reduction = 'none'으로 설정해주면 됩니다!!
이상 정말정말 간단한 cross entropy loss에 대한 설명을 마치겠습니다.