딥러닝에서 엔트로피란?
딥러닝에서의 엔트로피는 일반적으로 정보 이론에서 클로드 섀넌(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
테스트 코드: 직접 실행해보기
다음 두 가지를 사용하여 위 함수를 테스트해봅니다:
- 정확한 원-핫 인코딩된 정답 레이블
- 예측된 소프트맥스 확률 벡터
# 모델 예측 결과 (이미 소프트맥스를 통과한 확률 값)
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
참고문헌
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
https://www.deeplearningbook.org/ - Claude Shannon (1948). A Mathematical Theory of Communication. https://ieeexplore.ieee.org/document/6773024
'AI' 카테고리의 다른 글
확률 분포 간 차이를 측정하는 KL Divergence 개념과 수식 정리 (0) | 2025.04.28 |
---|---|
딥러닝 소프트맥스 함수 완벽 정리: 정의, 수식, 예제까지 (1) | 2025.04.23 |
정보 이론과 정보 병목 완벽 가이드 (0) | 2025.04.21 |
딥러닝 활성화 함수 (Activation Functions) 완벽 가이드 (0) | 2025.04.21 |
딥러닝에서 특성 정규화 (Feature Normalization) 기법의 중요성 (0) | 2025.04.21 |