작업에 맞는 손실을 고르고 입력 계약을 읽어
'모델이 학습되지 않는다'는 문제의 상당수는 손실 함수와 모델 출력의 계약이 맞지 않아서 생겨. 원인을 찾고 나면 보통 한 줄만 바꿔 해결할 수 있어.
분류
nn.CrossEntropyLoss: 다중 클래스 분류에 써. 모델은(N, C)모양의 가공하지 않은 로짓을 내고, 정답은(N,)모양의 int64 클래스 인덱스여야 해. 내부에서 수치적으로 안정적인 log_softmax와 NLL을 결합하므로 앞에서 소프트맥스를 적용하지 마.nn.BCEWithLogitsLoss: 이진 분류나 다중 레이블 분류에 써. 모델은 가공하지 않은 로짓을 내고, 정답은 {0, 1}의 float 값이어야 해. 수치 안정성을 위해 시그모이드와 BCE를 결합하므로 앞에서 시그모이드를 적용하지 마.nn.NLLLoss: 다중 클래스 분류용이지만 로짓이 아니라 로그 확률을 받아. log_softmax를 이미 적용한 경우에만 사용해.
회귀
nn.MSELoss: 평균 제곱 오차로, 회귀의 기본 선택이야. 오차를 제곱하므로 이상치에 큰 벌점을 줘.nn.L1Loss: 평균 절댓값 오차야. 이상치에 더 강건해.nn.SmoothL1Loss/nn.HuberLoss: 0 근처에서는 L2처럼, 꼬리에서는 L1처럼 작동해. 잡음이 많은 회귀에서 두 방식의 장점을 함께 얻을 수 있어.
덜 흔하지만 유용한 손실
nn.KLDivLoss: 두 분포 사이의 KL 발산을 계산해. 지식 증류에 사용해.nn.CosineEmbeddingLoss: 얼굴 검증이나 임베딩 유사도처럼 유사성에 기반한 학습에 사용해.nn.TripletMarginLoss: 기준·양성·음성 삼중항을 사용하는 메트릭 학습에 써.