콘텐츠로 이동

손실 함수 (Loss Functions)

난이도: 초급~중급
선수 지식: 기초 확률/통계, 미적분
관련 문서: 경사 하강법 | 볼록성 | 선형 모델 | SVM


개요

손실 함수(Loss Function)는 모델의 예측이 실제 값과 얼마나 다른지를 수치화하는 함수이다. 학습의 목적은 이 손실을 최소화하는 것이며, 어떤 손실 함수를 선택하느냐에 따라 모델이 학습하는 것이 달라진다.

손실 함수 = 모델이 무엇을 최적화하는가를 정의하는 것. 적절한 손실 함수의 선택은 모델 성능에 직접적 영향을 미친다.


핵심 개념

1. 회귀 손실 함수 (Regression Losses)

1.1 MSE (Mean Squared Error, L2 Loss)

\[L = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2\]
속성 설명
미분 가능성 어디서나 미분 가능
이상치 민감도 매우 민감 (제곱으로 큰 오류 강하게 패널티)
확률적 해석 가우시안 노이즈 가정의 MLE
사용처 기본 회귀 손실

1.2 MAE (Mean Absolute Error, L1 Loss)

\[L = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|\]
속성 설명
미분 가능성 \(y = \hat{y}\)에서 미분 불가
이상치 민감도 MSE보다 강건
기울기 상수 (오류 크기에 무관) --> 수렴이 느릴 수 있음
확률적 해석 라플라시안 노이즈 가정의 MLE

1.3 Huber 손실 (Smooth L1)

\[L_\delta = \begin{cases} \frac{1}{2}(y-\hat{y})^2 & |y-\hat{y}| \le \delta \\ \delta|y-\hat{y}| - \frac{1}{2}\delta^2 & \text{otherwise} \end{cases}\]
  • 작은 오류: MSE처럼 이차적 (매끄러운 기울기)
  • 큰 오류: MAE처럼 선형 (이상치에 강건)
  • \(\delta\): 이차/선형 전환 임계값

1.4 Log-Cosh 손실

\[L = \sum_{i}\log(\cosh(\hat{y}_i - y_i))\]
  • Huber 손실의 매끄러운 근사
  • 두 번 미분 가능: XGBoost 등에서 유용

1.5 분위수 손실 (Quantile Loss)

\[L_q = \sum_{i} \max\left(q(y_i - \hat{y}_i), \; (q-1)(y_i - \hat{y}_i)\right)\]
  • \(q = 0.5\): MAE와 동일 (중앙값 예측)
  • 특정 분위수 예측 가능 (예측 구간 생성에 사용)

2. 분류 손실 함수 (Classification Losses)

2.1 이진 교차 엔트로피 (Binary Cross-Entropy, Log Loss)

\[L = -\frac{1}{n}\sum_{i=1}^{n}\left[y_i\log(\hat{p}_i) + (1-y_i)\log(1-\hat{p}_i)\right]\]
속성 설명
확신 있는 오답에 강한 패널티 \(\hat{p} \to 0\) when \(y=1\)이면 \(L \to \infty\)
볼록성 로지스틱 회귀에서 볼록
확률적 해석 베르누이 분포의 음의 로그 우도
수치 안정성 log-sum-exp 트릭 또는 from_logits=True 사용

2.2 범주형 교차 엔트로피 (Categorical Cross-Entropy)

\[L = -\frac{1}{n}\sum_{i=1}^{n}\sum_{c=1}^{C} y_{ic}\log(\hat{p}_{ic})\]
  • 다중 클래스의 일반화
  • Softmax 출력과 함께 사용
  • Sparse 변형: 레이블이 정수(원-핫이 아닌)일 때

2.3 힌지 손실 (Hinge Loss)

\[L = \max(0, 1 - y_i \cdot f(x_i))\]
  • SVM에서 사용
  • 마진 > 1이면 손실 0 (올바른 분류 + 충분한 마진)
  • 오분류에 선형 패널티
  • 제곱 힌지: \(L = \max(0, 1-yf(x))^2\) (미분 가능, 더 강한 패널티)

2.4 초점 손실 (Focal Loss)

\[L = -\alpha_t(1-\hat{p}_t)^\gamma \log(\hat{p}_t)\]
  • 목적: 쉬운 예제의 가중치를 줄이고, 어려운 예제에 집중
  • \(\gamma = 0\): 표준 교차 엔트로피
  • \(\gamma = 2\): 일반적 설정
  • \(\alpha_t\): 클래스 균형 가중치
  • 개발 배경: 극심한 클래스 불균형의 객체 검출 (RetinaNet)

2.5 KL 발산 (KL Divergence)

\[D_{KL}(P\|Q) = \sum_x P(x)\log\frac{P(x)}{Q(x)}\]
속성 설명
비대칭 \(D_{KL}(P\|Q) \neq D_{KL}(Q\|P)\)
항상 \(\ge 0\) \(P = Q\)일 때만 0
사용처 지식 증류, VAE, t-SNE
  • Forward KL \(D_{KL}(P\|Q)\): \(Q\)\(P\)의 모든 영역을 커버하도록 (mean-seeking)
  • Reverse KL \(D_{KL}(Q\|P)\): \(Q\)\(P\)의 주요 모드에 집중 (mode-seeking)

3. 기타 주요 손실 함수

손실 수식/핵심 사용처
대비 손실 (Contrastive) 유사 쌍 가까이, 비유사 쌍 멀리 시아미즈 네트워크
삼중항 손실 (Triplet) \(\max(0, d(a,p) - d(a,n) + \alpha)\) 메트릭 학습
CTC 손실 정렬 없는 시퀀스 매핑 음성 인식
Dice / IoU 집합 유사도 기반 분할(Segmentation)
Wasserstein 지구 이동 거리(EMD) GAN

상세 내용

손실 함수 선택 가이드

태스크 일반적 손실 비고
회귀 MSE, MAE, Huber 이상치가 있으면 Huber
이진 분류 BCE 확률 출력 필요 시 표준
다중 클래스 분류 Cross-Entropy 표준 선택
클래스 불균형 분류 Focal Loss, 가중 CE 극심한 불균형에 Focal
메트릭 학습 Triplet, Contrastive 임베딩 학습
분할 Dice + CE 조합이 일반적
flowchart TD
    A[손실 함수 선택] --> B{태스크?}
    B -->|회귀| C{이상치 있음?}
    C -->|예| D[Huber Loss]
    C -->|아니오| E[MSE]
    B -->|분류| F{클래스 수?}
    F -->|2| G{불균형?}
    G -->|아니오| H[Binary CE]
    G -->|예| I[Focal Loss]
    F -->|다수| J{불균형?}
    J -->|아니오| K[Categorical CE]
    J -->|예| L[Focal / 가중 CE]
    B -->|임베딩| M[Triplet / Contrastive]

왜 분류에 MSE 대신 Cross-Entropy를 사용하는가?

  1. 기울기 크기: MSE는 출력이 0 또는 1 근처일 때 시그모이드의 기울기가 포화되어 학습이 느림. CE는 오차에 비례하는 기울기를 제공.

  2. 확률적 해석: CE는 베르누이/카테고리 분포의 음의 로그 우도로, 확률 모델과 일관됨.

  3. 볼록성: 로지스틱 회귀에서 CE는 볼록이지만 MSE는 비볼록.


언제 사용하는가

상황 추천 손실
기본 회귀 MSE
이상치가 있는 회귀 Huber 또는 MAE
기본 분류 Cross-Entropy
극심한 클래스 불균형 Focal Loss
SVM 학습 Hinge Loss
지식 증류 KL Divergence + CE
예측 구간 Quantile Loss
유사도 학습 Triplet / Contrastive

흔한 오해와 함정

1. "MSE는 어디서나 사용할 수 있다"

  • 분류에서 MSE는 부적절하다. 기울기 포화, 비볼록성, 확률적 비일관성 등의 문제가 있다.

2. "Cross-Entropy의 수치 안정성은 무시해도 된다"

  • \(\log(0) = -\infty\)로 NaN이 발생할 수 있다. 반드시 from_logits=True를 사용하거나, 작은 \(\epsilon\)을 더해야 한다.

3. "Focal Loss는 항상 Cross-Entropy보다 낫다"

  • 불균형이 심하지 않으면 CE가 더 안정적일 수 있다. \(\gamma\)의 부적절한 설정은 오히려 성능을 해칠 수 있다.

4. "KL Divergence는 거리(distance)이다"

  • 아니다. KL 발산은 비대칭이므로 진정한 거리 메트릭이 아니다. 대칭 버전은 Jensen-Shannon Divergence.

5. "Huber 손실의 \(\delta\)는 항상 1이 좋다"

  • \(\delta\)는 하이퍼파라미터이며 데이터의 노이즈 수준에 따라 튜닝해야 한다.

다른 주제와의 연결


자주 묻는 면접 질문

  1. 분류에 MSE 대신 Cross-Entropy를 사용하는 이유는?
  2. CE는 확률 모델과 일관되고, 기울기가 포화되지 않으며, 로지스틱 회귀에서 볼록함.

  3. Huber 손실은 언제 MSE보다 나은가?

  4. 이상치가 존재할 때. MSE는 큰 오류를 제곱으로 과도하게 패널티하지만, Huber는 선형적으로 처리.

  5. Focal Loss가 클래스 불균형에 도움이 되는 이유는?

  6. 쉬운 예제(다수 클래스)의 손실을 \((1-\hat{p}_t)^\gamma\)로 줄여, 어려운 예제(소수 클래스)에 학습을 집중.

  7. KL Divergence가 비대칭인 이유와 함의는?

  8. \(P\)\(Q\)의 역할이 다름. Forward KL은 \(Q\)\(P\)를 커버하도록, Reverse KL은 \(Q\)\(P\)의 모드에 집중하도록 유도.

코드 예시

import torch
import torch.nn as nn

# 회귀 손실
mse_loss = nn.MSELoss()
mae_loss = nn.L1Loss()
huber_loss = nn.HuberLoss(delta=1.0)
smooth_l1 = nn.SmoothL1Loss()

# 분류 손실
bce_loss = nn.BCEWithLogitsLoss()  # logits 입력 (수치 안정)
ce_loss = nn.CrossEntropyLoss()     # logits 입력, softmax 포함
ce_weighted = nn.CrossEntropyLoss(weight=torch.tensor([1.0, 5.0]))  # 가중

# KL Divergence
kl_loss = nn.KLDivLoss(reduction='batchmean', log_target=False)

# Focal Loss (수동 구현)
class FocalLoss(nn.Module):
    def __init__(self, alpha=0.25, gamma=2.0):
        super().__init__()
        self.alpha = alpha
        self.gamma = gamma

    def forward(self, logits, targets):
        bce = nn.functional.binary_cross_entropy_with_logits(logits, targets, reduction='none')
        p_t = torch.exp(-bce)
        focal_weight = self.alpha * (1 - p_t) ** self.gamma
        return (focal_weight * bce).mean()

# 레이블 스무딩
ce_smooth = nn.CrossEntropyLoss(label_smoothing=0.1)

용어 정리

영어 한국어
Loss Function 손실 함수
Mean Squared Error (MSE) 평균 제곱 오차
Mean Absolute Error (MAE) 평균 절대 오차
Huber Loss 후버 손실
Cross-Entropy 교차 엔트로피
Hinge Loss 힌지 손실
Focal Loss 초점 손실
KL Divergence KL 발산
Triplet Loss 삼중항 손실
Quantile Loss 분위수 손실

참고 자료

  • Goodfellow, Bengio, Courville (2016) - Deep Learning (Ch. 6: Loss Functions)
  • Lin et al. (2017) - "Focal Loss for Dense Object Detection" (RetinaNet)
  • Huber (1964) - "Robust Estimation of a Location Parameter"
  • Bishop (2006) - Pattern Recognition and Machine Learning (Ch. 4)