본문 바로가기
개발/Python

라벨 스무딩 (Label Smoothing)

by 피로물든딸기 2025. 10. 25.
반응형

전체 링크

라벨 스무딩

- 분류(Classification) 문제에서 신경망의 출력층에 소프트맥스(Softmax)를 쓰고, 정답 라벨one-hot 벡터로 표현

- 예를 들어, 3클래스 문제에서 클래스 2가 정답인 경우 → y = [0,1,0]

- 그리고 크로스 엔트로피(Cross-Entropy) 손실로 학습

 

하지만 이렇게 완전히 0과 1로만 구성된 라벨을 쓰면 모델이 너무 자신 있게 예측하도록 학습돼 오버피팅될 수 있음.

라벨 스무딩은 정답 라벨을 약간 "부드럽게" 만들어서 모델이 확신을 너무 가지지 않도록 함.

 

장점

- 모델 과신 방지 → 출력 확률이 너무 0이나 1로 치우치지 않음

- 오버피팅 완화 → 정답 라벨에 약간의 불확실성을 주어 일반화 성능 향상

- 학습 안정화 → 크로스엔트로피 손실의 그래디언트가 폭주하지 않음

 

한계 / 주의점

- 라벨이 원래 확실한 경우 (정답이 절대 확실) 스무딩이 오히려 성능 저하를 만들 수 있음

- 너무 큰 ϵ → 모델이 제대로 학습하지 못함

import numpy as np
from sklearn.preprocessing import LabelBinarizer

# 클래스 0,1,2
y = np.array([0, 1, 2, 2, 1])
lb = LabelBinarizer()
y_onehot = lb.fit_transform(y)

# 라벨 스무딩 적용
epsilon = 0.1
K = y_onehot.shape[1]
y_smooth = (1 - epsilon) * y_onehot + epsilon / K

print("원래 one-hot:\n", y_onehot)
print("스무딩 적용:\n", y_smooth)

'''
원래 one-hot:
 [[1 0 0]
 [0 1 0]
 [0 0 1]
 [0 0 1]
 [0 1 0]]
스무딩 적용:
 [[0.93333333 0.03333333 0.03333333]
 [0.03333333 0.93333333 0.03333333]
 [0.03333333 0.03333333 0.93333333]
 [0.03333333 0.03333333 0.93333333]
 [0.03333333 0.93333333 0.03333333]]
 '''
반응형

'개발 > Python' 카테고리의 다른 글

melt, stack, unstack  (0) 2025.10.26
map, apply, transform  (0) 2025.10.25
가설검정  (0) 2025.10.25
마할라노비스 거리  (0) 2025.10.25
로버스트 피팅  (0) 2025.10.25

댓글