Label smoothing + CrossEntropyLoss

Model Confidence

만약 음식을 분류하는 이미지 모델이 있다면 softmax를 거쳐 레이블 각각의 확률을 반환하게 된다. 

90% 치킨이라고 예측하는 이미지를 모아 두고 정확도를 구한다면, 이상적인 모델은 Accuracy가 0.9로 계산되어야 한다. 

하지만 보는 것과 같이 90%로 예측한 8개 데이터 중 5개만 정답이므로 Accuray는 0.625이다. 모델이 예측한 것(0.90)보다 실제 정확도(0.625)는 더 낮기 때문에 over-confidence한 모델이라고 표현할 수 있다. 

따라서 모델의 신뢰도와 실제 정확도 간의 차이를 줄여주는 보정(calibration)이 필요하다. 


Label Smoothing

일반적으로 다중 레이블 분류 문제에서 one-hot 인코딩을 사용한다면, 정답인 인덱스를 1, 그 외 인덱스는 0으로 둔다.

3개의 레이블을 분류하는데,

정답 인덱스가 2라면, [0, 0, 1]로 인코딩 된다. 

[0, 0, 1]은 '0번'일 확률이 0, '1번'일 확률이 0, '2번'일 확률이 1임을 뜻한다. 실제로는 [0, 0, 1]이 맞지만 이렇게 학습될 경우, 위에서 보는 것처럼 모델이 과대 확신하는 상황이 발생할 수 있다. 따라서 smoothing을 통해 과대 확신되는 경향을 막을 수 있다. 

 

$y_n'=y_n(1-\alpha)+\cfrac{\alpha}{N}$

 

N개의 레이블이 있을 때 smoothing을 수행하는 방식이며 $\alpha$는 smoothing의 정도를 설정해주는 파라미터이다. 

예를 들어, 4개의 레이블을 분류하는 문제에서 $\alpha$를 0.1로 설정한다면 [0, 0, 1, 0][0.025, 0.025, 0.925, 0.025]가 된다. 

 

$y_{0, 1, 3}'=0\times (1-0.1)+\cfrac{0.1}{4}=0.025$

$y_2'=1\times (1-0.1)+\cfrac{0.1}{4}=0.925$

 

이때 [0, 0, 1, 0]hard label, [0.025, 0.025, 0.925, 0.025]soft label이라고 한다. 

 

Label Index:

*소수점 3자리까지만 계산에 반영됩니다.

위 블록을 이용해 $\alpha$값의 영향을 시각화해 볼 수 있다.

 


CrossEntropyLoss

먼저, 일반적으로 Cross Entropy Loss는 아래 식 $H(p, y)$와 같이 계산한다. 

 

$H(p,y)=-\sum_{c=1}^{N}log(p_c)y_c$

 

p는 예측 확률, y는 실제 레이블이며 N은 레이블 개수를 의미한다.

하지만 Pytorch의 nn.CrossEntropyLoss는 softmax가 적용되어 있으며, default로 평균을 적용한 값을 반환한다. 따라서 아래와 같은 형태로 계산된다. 

 

$p_c'=\cfrac{exp(p_c)}{\sum_{i=1}^Nexp(p_i)}$

$CELoss=-\cfrac{1}{N}\sum_{c=1}^{N}log(p_c')y_c$

 

여기서 label smoothing을 적용하기 위해 y에 {0, 1} 값을 넣지 않고 아래 y'을 대입한다. 

 

$y_c'=y_c(1-\alpha)+\cfrac{\alpha}{N}$

$CELoss=-\cfrac{1}{N}\sum_{c=1}^{N}log(p_c')y'_c$

 

Pytorch 1.10 버전부터는 공식적으로 label_smoothing을 지원한다. 

torch.nn.CrossEntropyLoss(label_smoothing=0.1)

공식문서: 1.10/nn.CrossEntropyLoss