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이라고 한다.
*소수점 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