# 교차 엔트로피(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: 클래스 불균형 시 손실에 가중치를 주는 변형 --- 관련 문서: [[소프트맥스 함수]], [[다중 클래스 분류]]