1. 설명
- Cross Entropy Loss는 주로 분류 문제에서 모델의 예측이 실제 레이블과 얼마나 잘 일치하는지를 측정
- 이는 모델의 예측 확률 분포와 실제 레이블의 확률 분포 사이의 차이를 측정
- 예측된 확률 분포가 실제 분포를 얼마나 "잘" 표현하는지를 측정
1.1. 이진 분류(Binary Classification)
- 아래 식을 최소화하는 것이 목표!
1.2. 다중 클래스 분류(Multi-class Classification)
- 아래 식을 최소화 하는 것이 목표!
2. Cross Entropy와 Cross Entropy Loss의 관계
- Cross Entropy는 이론적으로 두 확률 분포 사이의 차이를 측정하는 개념
- Cross Entropy Loss는 이 개념을 실제 모델 학습에 적용하여, 모델의 예측이 실제 레이블과 얼마나 잘 일치하는지를 평가하는 손실 함수
- 모델 학습의 목표는 Cross Entropy Loss를 최소화함으로써, 모델의 예측 분포를 실제 분포에 가능한 가깝게 만드는 것
Cross Entropy
- Cross Entropy는 두 확률 분포 (P)와 (Q) 사이의 차이를 측정
- 예를 들면,
- (P)는 실제 분포(레이블 분포), (Q)는 예측 분포(모델 출력)
로그 소프트맥스 (LogSoftmax)
- 로그 소프트맥스 함수는 소프트맥스 함수에 자연 로그를 취한 것으로, 다중 클래스 분류 문제에서 출력 레이어에 사용
- 소프트맥스 함수는 입력 벡터를 정규화하여 출력값의 합이 1이 되도록 만들며, 각각의 출력값을 클래스에 속할 확률로 해석할 수 있습니다.
- 로그 소프트맥스는 이를 로그 공간으로 변환합니다.
- 주어진 벡터 (z)에 대한 소프트맥스 함수의 (i)번째 요소는 다음과 같습니다:
- 여기서 (z)는 모델의 로짓(소프트맥스 적용 전의 원시 출력값),
- (i)는 특정 클래스의 인덱스,
- (j)는 가능한 모든 클래스의 인덱스입니다.
- 로그 소프트맥스는 위의 식에 로그를 적용한 것입니다:
Negative Log Likelihood Loss, (NLLLoss)
- Negative Log Likelihood Loss은 모델이 실제 라벨에 할당한 확률의 로그에 음수를 취한 것
- 이 손실 함수는
로그 소프트맥스 출력을 입력
으로 사용하며, 실제 라벨에 대한 모델의 예측 확률의 로그에 대한 평균 음수 값을 계산
- 주어진 실제 라벨 (y)와 모델 예측의 로그 확률 (\log(p))에 대해, 네거티브 로그 우도 손실은 다음과 같이 정의됩니다:
-
- 여기서 (p_y)는 실제 라벨 (y)에 해당하는 모델 예측의 확률
CrossEntropyLoss: 결합 사용
CrossEntropyLoss
는 내부적으로 로그 소프트맥스와 NLLLoss를 결합하여 사용합니다. 이는 다음 단일 수식으로 표현될 수 있습니다:
- (N)은 배치 내의 샘플 수,
- (y_i)는 (i)번째 샘플의 실제 클래스 라벨,
- (z_{y_i}): 모델이 (i)번째 샘플의 실제 라벨에 할당한 로짓 값
- 이 손실 함수는 모델이 정확한 라벨에 높은 확률을 할당하도록 유도하며, 분류 문제에서 널리 사용됩니다.
torch.nn.CrossEntropyLoss
- 소프트맥스 함수를 통한 확률 분포와 실제 라벨 간의 차이를 측정합니다.
- 내부적으로는 로그 소프트맥스(LogSoftmax)와 네거티브 로그 우도(Negative Log Likelihood Loss, NLLLoss)를 결합한 것과 동일
사용 예시:
import torch
import torch.nn as nn
input = torch.randn(5, 3, requires_grad=True)
target = torch.empty(5, dtype=torch.long).random_(3)
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(input, target)
print(loss.item())
loss.backward()
- 이 예시에서는 3개의 클래스를 가진 분류 문제에 대해, 배치 크기가 5인 예측값과 실제 라벨을 사용하여 교차 엔트로피 손실을 계산
CrossEntropyLoss
는 모델의 예측값과 실제 라벨 사이의 손실을 계산하고, 이를 통해 모델 학습 시 그라디언트를 업데이트하는 데 사용할 수 있음
Parameters:
- weight (Tensor, optional):
- 각 클래스에 대한 가중치를 지정하는 1D Tensor
- 주로 클래스 불균형이 있는 경우 사용됩니다. 기본값은
None
- ignore_index (int, optional):
- 손실 계산에서 무시할 타겟(label) 인덱스
- 주로 특정 라벨을 무시하고 싶을 때 사용
- 기본값은
-100
- reduction (string, optional):
- 출력 손실을 계산하는 방법
'none'
은 각 요소의 손실을 반환하고,
'mean'
은 배치에 대한 손실의 평균을, (기본값)
'sum'
은 손실의 합을 반환합니다.
- input (Tensor):
- 모델의 예측값으로,
[batch_size, C]
(C는 클래스 수)의 크기를 가진 Tensor입니다.
logits
형태로, 즉 소프트맥스 함수를 적용하기 전의 원시 점수
- target (Tensor):
- 실제 라벨을 나타내는 Tensor로,
[batch_size]
의 크기
- 각 요소는
0
에서 C-1
사이의 값입니다.
Return:
- loss (Tensor):
- 지정된
reduction
방식에 따라 계산된 손실 값
'mean'
또는 'sum'
이 선택된 경우 스칼라 Tensor로 반환되며, 'none'
이 선택된 경우 요소별 손실을 담은 Tensor가 반환