본문 바로가기
C.W.K.
Stream
Lesson 02 of 09 · published

손실 함수

~22 min · loss, cross-entropy, mse

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

과제에 맞는 손실 고르기

손실 함수는 데이터와 옵티마이저 사이의 약속이야. 잘못 고르면 정확도가 겉으로 괜찮아 보여도 모델은 엉뚱한 걸 학습해.

  • 다중 클래스 분류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가 올바른 형태야. 이런 조절값은 기본 손실 함수 위에서 확률 보정을 바꾸지만, 모델의 선택 자체까지 바꾸는 경우는 드물어.

Code

네 가지 대표 과제 유형의 손실 함수·python
import torch, torch.nn as nn

logits_mc = torch.randn(8, 10)
labels_mc = torch.randint(0, 10, (8,))
print(nn.CrossEntropyLoss()(logits_mc, labels_mc).item())

weights = torch.tensor([2.0]*5 + [1.0]*5)
loss_mc_balanced = nn.CrossEntropyLoss(weight=weights, label_smoothing=0.1)
print(loss_mc_balanced(logits_mc, labels_mc).item())

logits_bc = torch.randn(8, 1)
labels_bc = torch.randint(0, 2, (8, 1)).float()
print(nn.BCEWithLogitsLoss()(logits_bc, labels_bc).item())

preds  = torch.randn(8, 1)
target = torch.randn(8, 1)
print(nn.MSELoss()(preds, target).item())
print(nn.SmoothL1Loss()(preds, target).item())

External links

Exercise

작은 배치에서 교차 엔트로피 손실을 직접 구현해(nn.CrossEntropyLoss는 쓰지 마). PyTorch의 값과 소수점 이하 6 자리까지 일치하는지 확인해. 그다음 레이블 평활화를 추가하고 손실값이 예상한 방향으로 변하는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.