# 교차 엔트로피(Cross-Entropy) 손실 함수
교차 엔트로피(Cross-Entropy, CE) 손실 함수는 분류 문제에서 모델의 예측 분포와 실제 분포 간의 차이를 측정하는 대표적인 손실 함수이다. 주로 다중 클래스 분류(multi-class classification)에서 사용되며, 기계학습과 심층학습에서 학습 목표를 확률적 관점에서 정의하는 데 핵심적인 역할을 한다. 영어 용어를 병기하여 사용하는 경우가 많으며, 수학적 정의와 직관적 해석을 함께 제시한다.
## 개요
- 목적: 실제 라벨分布과 모델이 예측한 분포 간의 차이를 최소화하는 방향으로 파라미터를 학습한다.
- 기본 아이디어: 실제 라벨이 하나의 원-핫(one-hot) 벼루로 표현될 때, 모델의 예측 확률 분포가 해당 라벨의 확률을 최대화하도록 학습한다.
- 대표적 변형: 이진 분류용 Binary Cross-Entropy (BCE), 다중 클래스 분류용 Categorical Cross-Entropy (CCE), 그리고 로짓(logits)을 직접 다루는 경우의 Cross-Entropy with logits가 있다.
## 정의와 주요 변형
- 일반적 정의 (p, q가 각각 실제 분포와 모델이 예측한 분포를 나타내는 확률 분포일 때)
- Cross-Entropy: $H(p, q) = - ∑_i p_i log q_i$
- p_i: 실제 분포의 확률, q_i: 모델이 예측한 클래스 i의 확률
- 이진 분류의 Cross-Entropy (Binary Cross-Entropy, BCE)
- 이진 라벨 y ∈ {0, 1} 과 예측 확률 p ∈ (0, 1) 사이의 손실
- $L_BCE = - [ y log p + (1 - y) log (1 - p) ]$
- p는 보통 시그모이드(sigmoid) 함수의 출력 또는 로그-확률을 사용한다.
- 다중 클래스 분류의 Cross-Entropy (Categorical Cross-Entropy, CCE)
- 실제 라벨이 하나의 클래스에 해당하는 원-핫 벡터 y_j (y_j ∈ {0, 1}, ∑_j y_j = 1)이고, 모델의 예측 확률 분포가 p_j인 경우
- L_CCE = - ∑_j y_j log p_j
- y가 원-핫 라벨이므로 보통 한 항만 1이고 나머지는 0이다.
- p_j = 모델의 각 클래스에 대한 예측 확률
- 로짓(logits) 기반의 Cross-Entropy
- 로짓 z_j를 직접 입력으로 받는 경우가 많다. 이때 수치적 안정성을 위해 softmax를 거쳐 확률을 계산하거나, softmax+log를 합치는 형태로 구현한다.
- L = - ∑_j t_j log softmax(z)_j, 여기서 t_j은 실제 라벨의 분포(일반적으로 원-핫 벡터)
- 실전에서 흔히 사용되는 표현은 다음과 같다:
- L = - log softmax(z)_{y_true} (클래스 인덱스 y_true 를 사용하는 경우)
- 관계: H(p, q) = H(p) + D_KL(p || q)
- H(p): 실제 분포 p의 엔트로피로 상수에 해당
- D_KL(p || q): p와 q의 KL 발산으로, 이를 최소화하는 것이 목표
- 분류 문제에서 p가 실제 라벨의 분포(일반적으로 원-핫 벡터)로 고정되어 있을 때, 최소화하는 것은 D_KL(p || q) 즉, 모델이 p에 가까워지도록 하는 것과 같다.
- 그래디언트의 특징 (로짓 기반의 경우)
- 다중 클래스 분류에서 로짓 z와 실제 원-핫 벡터 y에 대해
- ∂L/∂z_j = p_j - y_j
- 이 간단한 형태는 학습 초기의 큰 그래디언트로부터 안정적인 수렴으로 이어진다.
## 수치적 안정성과 구현상의 주의점
- 로그의 정의역: log(0) 문제를 피하기 위해 epsilon(작은 양수) 또는 소프트맥스의 안정적 구현이 필요
- 로짓을 직접 받는 경우: softmax를 통해 확률을 직접 계산하는 대신, 로그-소프트맥스(log-softmax)나 log-sum-exp trick을 활용하면 수치적 안정성이 증가한다
- 클래스 불균형
- 다수 클래스를 과도하게 학습하는 것을 방지하기 위해 가중치, 샘플링 또는 라벨 스무딩(label smoothing) 등의 기법을 도입할 수 있다
- 라벨 스무딩(Label Smoothing)
- 원-핫 라벨을 완전히 1/0으로 주는 대신 작은 값을 부여하여 모델이 과 confidently 예측하는 것을 억제한다
- 다중 태스크 학습
- 여러 손실 함수와 함께 사용할 경우, 배치 단위 가중치를 조정해 학습의 균형을 맞춘다
## 구현 예시
- PyTorch (로짓을 입력으로 사용하는 일반적인 경우)
- 목표: 다중 클래스 분류에서 로짓(logits)와 클래스 인덱스(targets)를 입력받아 Cross-Entropy 손실을 계산
- 코드 예시
```
import torch
import torch.nn as nn
# logits: (N, C), targets: (N,) 각 원소는 [0, C-1] 사이의 정수
logits = torch.randn(8, 10) # 예시 데이터
targets = torch.randint(0, 10, (8,))
loss_fn = nn.CrossEntropyLoss() # 내부적으로 softmax + log-softmax를 합쳐 안정적으로 계산
loss = loss_fn(logits, targets)
```
- 주의: CrossEntropyLoss는 로짓(z)을 입력으로 받고 targets를 정수 인덱스로 받는다. 원-핫 벡터를 사용하고자 할 때는 다른 접근이 필요하다.
- TensorFlow/Keras (로짓 또는 확률 중 선택 가능)
- 로짓을 입력으로 하는 경우 SparseCategoricalCrossentropy를 사용
- 코드 예시 (로짓 입력)
```
import tensorflow as tf
# logits: (batch, num_classes), targets: (batch,)
logits = tf.random.normal(shape=(8, 10))
targets = tf.random.uniform(shape=(8,), minval=0, maxval=10, dtype=tf.int32)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss = loss_fn(targets, logits)
```
- 원-핫 벡터를 직접 사용하는 경우 CategoricalCrossentropy를 사용
```
# y_true: (batch, num_classes) 원-핫 벡터, y_pred: (batch, num_classes) 로짓이 아닌 확률분포
y_true = tf.keras.utils.to_categorical(targets, num_classes=10)
y_pred = tf.nn.softmax(logits)
loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=False)
loss = loss_fn(y_true, y_pred)
```
- 수치적 안정성 팁
- 로짓에서 바로 Cross-Entropy를 계산하는 것이 일반적으로 더 numerically stable
- 소프트맥스와 로그의 합성에 주의하고, 필요 시 log-softmax와 negative log-likelihood의 결합형으로 구현
- 라벨 스무딩을 도입하면 로스 값의 급격한 변화와 과도한 확신을 줄일 수 있다
## 응용 및 활용 영역
- 다중 클래스 분류 문제
- 이미지 인식, 음성 인식, 텍스트 분류 등 다양한 영역에서 기본 손실 함수로 사용
- 시퀀스 모델의 분류적 끝점에 적용
- 예: 기계 번역에서 각 단어의 확률 분포를 예측하는 출력에 대해 Cross-Entropy를 손실로 사용
- 확률적 해석 및 학습의 연결
- Cross-Entropy 손실은 실제 분포에 대한 로그 우도(log-likelihood)를 최대화하는 것과 동치
- 라벨 스무딩, Focal Loss 등과의 조합
- 라벨 스무딩으로 일반화 능력을 향상
- Focal Loss는 클래스를 불균형하게 다룰 때 Cross-Entropy의 대안으로 활용
## 한계와 주의점
- 분류 문제의 라벨 품질에 민감
- 잘못된 라벨이나 노이즈가 큰 데이터에 대해 학습이 잘못될 수 있다
- 극도로 불균형한 데이터에서의 편향 가능성
- 소수 클래스의 학습이 어려워질 수 있다
- 레거시 어프로치와의 차이
- 일부 라이브러리에서 BCE와 CE의 사용 경계가 다를 수 있으니 문서 확인 필요
## 용어 정리 및 관련 개념
- Cross-Entropy: p와 q 사이의 차이를 측정하는 엔트로피 기반 거리
- Log-Likelihood: 로그 우도, 교차 엔트로피의 해석적 동등성
- Softmax: 로짓을 확률분포로 변환하는 함수
- Negative Log-Likelihood (NLL): -log L(데이터 | 모델)
- KL Divergence: Kullback–Leibler 발산, 분포 간 차이의 비대칭 측정
- Label Smoothing: 라벨에 약간의 불확실성을 부여하는 정규화 기법
- Focal Loss: 클래스 불균형 시 손실에 가중치를 주는 변형
---
관련 문서: [[소프트맥스 함수]], [[다중 클래스 분류]]