과제에 맞는 손실 고르기
손실 함수는 데이터와 옵티마이저 사이의 약속이야. 잘못 고르면 정확도가 겉으로 괜찮아 보여도 모델은 엉뚱한 걸 학습해.
- 다중 클래스 분류 —
nn.CrossEntropyLoss. 원시 로짓을 입력받고 정수 클래스 레이블을 기대해. - 다중 레이블 분류 —
nn.BCEWithLogitsLoss. 레이블마다 시그모이드를 적용하고 BCE를 계산해. - 이진 분류 — 출력이 하나라면
nn.BCEWithLogitsLoss를 써. - 회귀(제곱 오차) —
nn.MSELoss. 이상치에 민감해. - 회귀(이상치에 강한 방식) —
nn.SmoothL1Loss또는nn.HuberLoss. - 순위 학습 / 유사도 — 트리플렛 손실, 대조 손실, InfoNCE.
- 시퀀스 생성 — 토큰 단위 교차 엔트로피에 필요하면 레이블 평활화를 더해.
팁: 검증 분할의 정확도는 괜찮은데 모델이 경계 사례에서 이상하게 행동한다면, 모델보다 손실 함수를 먼저 의심해. 손실 함수가 학습에서 실제로 최적화하는 대상이고, 정확도는 그 결과를 보여 주는 지표 하나일 뿐이야.
Cross-entropy가 주력인 이유
로짓 z와 정답 클래스 c가 있는 예시 하나의 교차 엔트로피는 -log(softmax(z)[c])야. 정답 클래스의 로짓은 높이고 오답 클래스의 로짓은 낮춰. 기울기도 softmax(z) - one_hot(c)로 아주 깔끔해.
클래스가 균형 잡혀 있다면 기본 교차 엔트로피를 쓰면 돼. 불균형하다면 클래스별 weight=를 넘기거나, 쉬운 예시의 비중을 낮추는 focal 손실을 써. 어휘가 매우 큰 모델(LLM)은 전체 소프트맥스 대신 negative subset sampling을 사용해.
원칙: 사용하는 손실 함수는 모두 docstring을 읽어. 'reduction' 인자(mean/sum/none)는 주니어 코드에서 눈에 띄지 않게 생기는 지표 버그 절반의 원인이야.
클래스 가중치와 레이블 평활화
데이터가 불균형하다면 weight=class_weights를 넘겨. 모델이 지나치게 확신한다면 label_smoothing=0.1로 목표를 부드럽게 만들어. 다중 레이블 과제에서는 레이블별 BCE가 올바른 형태야. 이런 조절값은 기본 손실 함수 위에서 확률 보정을 바꾸지만, 모델의 선택 자체까지 바꾸는 경우는 드물어.