본문 바로가기
AI

딥러닝에서 엔트로피와 크로스 엔트로피 손실 함수 완벽 이해

by markbyun 2025. 4. 22.

딥러닝에서 엔트로피란?

딥러닝에서의 엔트로피는 일반적으로 정보 이론에서 클로드 섀넌(Claude Shannon)이 1948년에 제안한 정보 엔트로피를 의미합니다. 이는 확률 분포에서의 불확실성 또는 무작위성을 측정하는 개념입니다.

직관적으로 이해하기:

무언가에 대해 매우 불확실하다면 (예: 이미지의 클래스를 예측할 때) 엔트로피는 높습니다.

반대로 확신이 높은 예측을 한다면 (예: 모델이 고양이라고 확신하는 경우) 엔트로피는 낮습니다.


수학적 정의 (샤논 엔트로피)

확률 분포 p = [p1, p2, ..., pn]가 주어졌을 때, 엔트로피 H(p)는 다음과 같이 계산됩니다:

이 수식은 가능한 각 결과에서 발생하는 "놀라움" 또는 "정보량"을 합산한 것입니다.


딥러닝에서의 엔트로피: 어디에, 왜 사용될까?

딥러닝에서 엔트로피는 손실 함수에 가장 흔하게 사용되며, 특히 다음과 같은 경우에 사용됩니다:

크로스 엔트로피 손실 함수

  • 분류 문제에 사용됩니다.
  • 실제 분포 (레이블)와 예측된 분포 (소프트맥스 출력)를 비교합니다.
  • 모델이 불확실성을 줄이고 예측 정확도를 높이도록 유도합니다.

크로스 엔트로피 공식:

여기서:

  • $y_i$정답 레이블입니다 (보통 원-핫 인코딩).
  • $\hat{y}_i$모델이 예측한 확률 값입니다.

크로스 엔트로피 손실 함수 직접 구현하기

import numpy as np

def cross_entropy_loss(y_true, y_pred, epsilon=1e-15):
    """
    정답 레이블과 예측 확률 사이의 크로스 엔트로피 손실을 계산합니다.

    Args:
        y_true (ndarray): 실제 레이블 (원-핫 인코딩 형태), shape (N, C)
        y_pred (ndarray): 모델의 예측 확률 (소프트맥스 출력), shape (N, C)
        epsilon (float): 로그(0) 방지를 위한 작은 값

    Returns:
        float: 전체 샘플에 대한 평균 손실 값
    """
    
    # 로그(0) 오류 방지를 위해 예측값을 클리핑
    y_pred = np.clip(y_pred, epsilon, 1. - epsilon)
    
    # 예측값에 로그 적용
    log_preds = np.log(y_pred)
    
    # 실제 레이블과 로그 예측값의 원소 곱 -> 음수 처리 후 평균
    loss = -np.sum(y_true * log_preds) / y_true.shape[0]
    
    return loss

테스트 코드: 직접 실행해보기

다음 두 가지를 사용하여 위 함수를 테스트해봅니다:

  1. 정확한 원-핫 인코딩된 정답 레이블
  2. 예측된 소프트맥스 확률 벡터
# 모델 예측 결과 (이미 소프트맥스를 통과한 확률 값)
predicted_probs = np.array([
    [0.7, 0.2, 0.1],
    [0.1, 0.8, 0.1],
    [0.2, 0.2, 0.6]
])

# 정답 레이블 (원-핫 인코딩 형태)
true_labels = np.array([
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1]
])

# 크로스 엔트로피 손실 계산 및 출력
loss = cross_entropy_loss(true_labels, predicted_probs)
print(f"Cross-Entropy Loss: {loss:.4f}")


PyTorch 예제: 엔트로피와 크로스 엔트로피

import torch
import torch.nn as nn
import torch.nn.functional as F

# 모델 출력 (logits)과 실제 레이블
logits = torch.tensor([[2.0, 1.0, 0.1]], requires_grad=True)  # 신경망의 raw 출력
labels = torch.tensor([0])  # 정답 클래스는 0

# 소프트맥스 적용하여 확률 얻기
probs = F.softmax(logits, dim=1)
print("예측 확률:", probs)

# 수동으로 엔트로피 계산
entropy = -torch.sum(probs * torch.log(probs))
print("엔트로피:", entropy.item())

# PyTorch 내장 크로스 엔트로피 손실 함수 사용
criterion = nn.CrossEntropyLoss()
loss = criterion(logits, labels)
print("크로스 엔트로피 손실:", loss.item())

출력 결과:

예측 확률: tensor([[0.6590, 0.2424, 0.0986]], grad_fn=<SoftmaxBackward0>)
엔트로피: 0.9686
크로스 엔트로피 손실: 0.4170

참고문헌

  1. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
    https://www.deeplearningbook.org/
  2. Claude Shannon (1948). A Mathematical Theory of Communication. https://ieeexplore.ieee.org/document/6773024