Cross Entropy

김동준·2025년 10월 17일

Cross Entropy 완벽 가이드

1. 기본 개념: Entropy란?

먼저 Entropy(엔트로피)부터 이해해야 합니다.

엔트로피는 불확실성을 측정하는 지표입니다.

예시로 이해하기:

상황 1: 동전 던지기 (앞면 50%, 뒷면 50%)

  • 매우 불확실함 → 엔트로피 높음

상황 2: 조작된 동전 (앞면 99%, 뒷면 1%)

  • 거의 확실함 → 엔트로피 낮음

수식:

H(P) = -Σ P(x) log P(x)

2. Cross Entropy란?

Cross Entropy는 두 확률 분포 간의 차이를 측정합니다.

H(P, Q) = -Σ P(x) log Q(x)

여기서:

  • P: 실제 정답 분포 (Ground Truth)
  • Q: 모델이 예측한 확률 분포

3. 구체적인 예시

예시 1: 고양이/개/새 분류 문제

이미지 하나가 실제로는 고양이입니다.

실제 정답 (One-hot encoding):

P = [1, 0, 0]  # 고양이=1, 개=0, 새=0

모델의 예측 (Softmax 출력):

경우 A - 좋은 예측:

Q = [0.8, 0.15, 0.05]  # 고양이 80% 확신

Cross Entropy 계산:

CE = -(1×log(0.8) + 0×log(0.15) + 0×log(0.05))
   = -log(0.8)
   ≈ 0.223

경우 B - 나쁜 예측:

Q = [0.2, 0.6, 0.2]  # 개를 60%로 잘못 예측

Cross Entropy 계산:

CE = -(1×log(0.2) + 0×log(0.6) + 0×log(0.2))
   = -log(0.2)
   ≈ 1.609

결론: 예측이 나쁠수록 Cross Entropy 값이 커집니다! 🎯

4. 이진 분류 (Binary Cross Entropy)

스팸 메일 분류 같은 이진 분류에서는 간단한 형태를 사용합니다:

BCE = -[y log(ŷ) + (1-y) log(1-ŷ)]

예시: 스팸 메일 판별

이메일 1: 실제로 스팸 (y=1)

  • 모델 예측: ŷ = 0.9 (스팸일 확률 90%)
  • BCE = -(1×log(0.9) + 0×log(0.1)) = -log(0.9) ≈ 0.105

이메일 2: 실제로 스팸 (y=1)

  • 모델 예측: ŷ = 0.3 (스팸일 확률 30%)
  • BCE = -(1×log(0.3) + 0×log(0.7)) = -log(0.3) ≈ 1.204

5. 왜 Cross Entropy를 사용할까?

1) MSE와 비교

MSE (평균 제곱 오차)를 분류에 사용하면:

  • 그래디언트가 확률이 0 또는 1에 가까워지면 소실됨
  • 학습이 느려지는 문제 발생

Cross Entropy:

  • 그래디언트가 확률 전 범위에서 안정적
  • 잘못된 예측에 큰 페널티 부여

2) 확률론적 해석

Cross Entropy를 최소화하는 것은 곧 Maximum Likelihood Estimation(MLE)과 동일합니다. 즉, 모델이 정답을 맞출 확률을 최대화하는 것입니다.

6. PyTorch 코드 예시

import torch
import torch.nn as nn

# 이진 분류 예시
bce_loss = nn.BCELoss()

# 실제 정답
target = torch.tensor([1.0, 0.0, 1.0, 0.0])

# 모델 예측 (시그모이드 출력)
prediction = torch.tensor([0.9, 0.2, 0.7, 0.3])

loss = bce_loss(prediction, target)
print(f"BCE Loss: {loss.item()}")

# 다중 클래스 분류 예시
ce_loss = nn.CrossEntropyLoss()

# 실제 정답 (클래스 인덱스)
target = torch.tensor([0, 2, 1])

# 모델의 로짓 출력 (Softmax 이전)
logits = torch.tensor([
    [2.0, 0.5, 0.1],  # 첫 번째 샘플
    [0.1, 0.2, 2.5],  # 두 번째 샘플
    [0.3, 1.8, 0.2]   # 세 번째 샘플
])

loss = ce_loss(logits, target)
print(f"CE Loss: {loss.item()}")

7. 핵심 정리

  1. Cross Entropy는 두 확률 분포의 차이를 측정합니다
  2. 값이 작을수록 모델의 예측이 정답에 가깝습니다
  3. 분류 문제의 표준 손실 함수입니다
  4. 확률적으로 의미 있는 최적화 목표입니다
  5. PyTorch에서 nn.CrossEntropyLoss()는 내부적으로 Softmax를 포함하므로, 모델의 마지막 레이어에서 Softmax를 적용하지 않아야 합니다

직관적 이해

Cross Entropy를 "모델이 얼마나 놀랐는가"로 이해할 수 있습니다. 정답이 고양이인데 모델이 고양이 확률을 0.01로 예측했다면, 모델은 매우 놀랄 것이고 손실이 큽니다. 반대로 0.99로 예측했다면 전혀 놀라지 않고 손실이 작습니다.

profile
Story Engineer

0개의 댓글