Label Smoothing
Image Classification 을 하다 보니 부족했던 개념들을 알게 되어 정리하고자 한다.
먼저 Label Smoothing이다.
딥러닝 모델의 정확도와 Calibration 향상, 최종적으로 모델의 generalization에 도움이 되는 Label Smoothing이다.
딥러닝을 하다보면 직면하는 문제가 있다.
바로 Overfitting과 Overconfidence 이다.
Label Smoothing은 이 2가지 문제를 해결할만한 regularization technique(정규화기술)이라고 한다.
이미지 분류는 이미지를 n개의 카테고리로 할당하는 일을 말한다. 이미지의 크기가 224*224라면 RGB 각 3개의 채널이 존재하기 때문에 하나의 이미지는 224*224*3의 3차원 벡터로 표현이 가능하다.
이 벡터를 단 하나의 값으로 요약하는 것이 이미지 분류 문제에 핵심이다.
고양이와 개를 분류하는 위의 예는 binary classification의 예이다. 학습을 하기 위해서는 training data가 필요한데 데이터의 개수가 n 일때 학습 데이터의 형태는 n*224*224*3 / label :n 의 벡터로 표현 할 수 있다.
여기서 문제는 잘못 labeling 된 이미지가 있을 수 있다는 것이다. 이런 경우 잘못 labeling된 이미지까지 학습하게 된다. 데이터의 수가 많다면 더 큰 문제일 것이다.
이진 분류 문제에서 label은 0과 1로 0%로와 100%로 고려한다. 하지만 반드시 그렇지 않을 수 있다는 것이 핵심 문제이다. 사람이 annotation하고 위에 말했듯이 데이터의 문제가 있을 상황에 발생하는 잘못된 loss의 영향을 줄이기 위하여 label을 0 또는 1이 아니라 smooth 하게 부여하는 것이 label smoothing의 아이디어다.
Label Smoothing
딥러닝에 대한 label smoothing은 Szegedy 논문에서 소개되었다. 라벨 스무딩은 Hard label(One-hot encoded vector로 정답 인덱스는 1, 나머지는 0으로 구성)을 Soft label(라벨이 0과 1 사이의 값으로 구성)로 스무딩하는 것을 뜻한다. 개의 클래스에 대해서, 스무딩 파라미터(Smoothing parameter)를 α라고 할 때, 번째 클래스에 대해서 다음과 같이 스무딩을 합니다.
위 식에서 alpha=1이면 uniform distribution이고 , alpha=0이면 그냥 인코딩 된 one-hot이다.
예를 들어, 클래스의 수가 5(K= 5)이고, 2번째 클래스가 정답인 라벨에 대해서는 다음과 같이 계산한다.
# Class number K = 5, 2nd class is ground-truth.
# y2_hard_label = [0, 1, 0, 0, 0]
# y2_soft_label = [0.02, 0.92, 0.02, 0.02, 0.02]
다시 말해, One-hot encoded vector에서 0인 값은 모두 0보다 큰 값인 0.02로, 정답을 나타내는 1은 1보다 작은 0.92로 라벨 스무딩을 통해 벡터값을 변환한다.
이러한 변환을 label-smoothing regularization(LSR)이라고 부른다.
공식에서 α/K 항은 정답을 제외한 다른 클래스를 균일 분포(Uniform distribution)로 만드는 항이다.
tensorflow 에서는 label smoothing에 대한 implementation을 제공한다. softmax_cross_entropy의 parameter로 label_smoothing 값을 전달할 수 있다.
if label_smoothing is nonzero, smooth the labels towards 1/num_classes: new_onehot_labels = onehot_labels * (1 - label_smoothing) + label_smoothing / num_classes" 이라는 tensorflow document를 확인 할 수 있다.
예를 하나 더 들어보면 개/고양이 이진분류에서 label_smoothing 이 0.2로 설정 되어 있고 0이 고양이, 1은 개라는 rule로 labeling 했다고 하면 새로운 label은 다음과 같이 구할 수 있다.
new_onehot_labels = 1*(1-0.2) + 0.2/2 = 1*0.8 + 0.1 = 0.9
원래 0으로 부여되었던 label은 0.1이 되고 1인 정답은 0.9가 된다. 모델이 target을 정화하게 예측하지 않아도 되도록 만드는 것이다. 그렇기 때문에 모델이 overconfident 해지는 경향을 막아 calibration 및 regularization 이 되는 효과를 갖게 된다.
참고자료 :