본문 바로가기
About AI (인공지능)

Cross Entropy Loss (pytorch 예제 +)

by 용스토리랜드 2023. 3. 23.

손실 함수(loss function)

 

손실 함수는 머신러닝에서 모델이 나타내는 확률 분포와 데이터가 따르는 실제 확률 분포 사이의 차이를 나타내는 함수.

즉, 이 값은 0에 가까울수록 모델의 정확도가 높고, 반대로 0에서 멀어질수록 모델의 정확도가 낮습니다. 

 


Entropy

불확실성의 척도 이다. 정보이론에서의 엔트로피는 불확실성을 나타내며, 엔트로피가 높다는 것은 정보가 많고, 확률이 낮다는 것읠 의미 

불확실성 : 어떤 데이터가 나올지 예측하기 어려운 경우

 

# 예시 : 동전 던지기 & 주사위 던지기

  • 동전을 던졌을 때, 앞/뒷면이 나올 확률 : 1/2 라고 가정
  • 주사위를 던졌을 때, 각 6면이 나올 확률을 모두 : 1/6 라고 가정

동전의 엔트로피 값 : 0.693

주사위의 엔트로피 값 : 1.79 

 

주사위의 엔트로피 값이 더 높다는 것을 알 수 있다.


크로스 엔트로피 손실(Cross Entropy Loss)은 분류 모델의 손실 함수 중 하나로, 예측값과 실제값의 차이를 계산하여 모델의 학습에 이용됩니다. 크로스 엔트로피 손실은 예측값이 실제값에 가까울수록 작아지는 값을 가지며, 손실이 작을수록 모델의 예측 성능이 좋다고 판단할 수 있습니다.

 

크로스 엔트로피 손실 함수는 분류 모델에서 많이 사용됩니다. 이는 분류 모델에서 정확한 예측을 하기 위해서는 각 클래스별로 예측값과 실제값의 차이를 계산하여 손실 함수를 최소화해야 하기 때문입니다.

 


Pytorch 에서 BCELoss, BCEWithLogitLoss, CrossEntropyLoss 차이 

 

BCELoss (Binary Cross Entropy Loss)
BCELoss는 이진 분류 문제에 사용되는 손실 함수로, 각 클래스에 대한 확률을 독립적으로 계산합니다. 예측된 확률과 실제 레이블 간의 차이를 최소화하기 위해 사용됩니다. BCELoss를 사용하기 전에, 모델의 출력을 Sigmoid 함수를 통해 0과 1 사이의 확률 값으로 변환해야 합니다.

import torch
import torch.nn as nn

# 예측 확률 및 실제 레이블
predictions = torch.tensor([[0.8, 0.3], [0.1, 0.9]], requires_grad=True)
labels = torch.tensor([[1.0, 0.0], [0.0, 1.0]])

# Sigmoid 함수 적용
sigmoid = nn.Sigmoid()
predictions = sigmoid(predictions)

# BCELoss 사용
bce_loss = nn.BCELoss()
loss = bce_loss(predictions, labels)
loss.backward()

 

BCEWithLogitsLoss
BCEWithLogitsLoss는 BCELoss의 변형으로, 모델의 출력을 Sigmoid 함수를 통해 확률 값으로 변환하는 과정을 포함하고 있습니다. 이 손실 함수는 이진 분류 문제에 사용되며, BCELoss보다 수치적으로 안정적입니다.

import torch
import torch.nn as nn

# 로짓 및 실제 레이블
logits = torch.tensor([[1.2, -0.5], [-2.0, 0.8]], requires_grad=True)
labels = torch.tensor([[1.0, 0.0], [0.0, 1.0]])

# BCEWithLogitsLoss 사용
bce_logits_loss = nn.BCEWithLogitsLoss()
loss = bce_logits_loss(logits, labels)
loss.backward()

CrossEntropyLoss
CrossEntropyLoss는 다중 클래스 분류 문제에 사용되는 손실 함수입니다. 이 함수는 모델의 출력을 Softmax 함수를 통해 확률 값으로 변환한 후, 실제 레이블과의 차이를 최소화하기 위해 사용됩니다. CrossEntropyLoss는 Softmax 함수를 포함하므로, 모델의 출력을 직접 전달하면 됩니다.

import torch
import torch.nn as nn

# 로짓 및 실제 레이블
logits = torch.tensor([[1.2, 0.5, -0.8], [-0.5, 0.8, 2.0]], requires_grad=True)
labels = torch.tensor([0, 2])

# CrossEntropyLoss 사용
cross_entropy_loss = nn.CrossEntropyLoss()
loss = cross_entropy_loss(logits, labels)
loss.backward()

요약하면, 각 손실 함수의 차이는 다음과 같습니다:

1. BCELoss: 이진 분류 문제에 사용되며, 모델 출력에 Sigmoid 함수를 적용한 후 사용해야 합니다.
2. BCEWithLogitsLoss: 이진 분류 문제에 사용되며, 모델 출력을 직접 사용하고 내부적으로 Sigmoid 함수를 적용합니다. 수치적으로 안정적입니다.
3. CrossEntropyLoss: 다중 클래스 분류 문제에 사용되며, 모델 출력을 직접 사용하고 내부적으로 Softmax 함수를 적용합니다.

주어진 문제에 따라 적절한 손실 함수를 선택하여 사용하면 됩니다. 이진 분류 문제의 경우 BCEWithLogitsLoss를 사용하는 것이 좋습니다. 다중 클래스 분류 문제의 경우 CrossEntropyLoss를 사용하면 됩니다.

반응형