본문 바로가기

AI/딥러닝(Deep Learning)

[딥러닝/DL] Loss Function

728x90
반응형

일반적으로 손실함수(Loss Function)은 딥러닝에서 모델의 출력값과 사용자가 원하는 출력값의 오차를 의미한다.

 

이 Loss Function을 통해 모델을 원하는 방향으로 학습할 수 있다.

 

Loss Function은 많이 사용되는 MSE, MAE, R2, Cross Entropy 같은 것들도 있고 사용자가 정의하여 커스텀 Loss Function을 만들어 사용할 수도 있다. 이 방법은 특정 모델을 학습하는 방법론에서 적용할 수 있다.

 

 MSE(Mean Squared Error)

예측한 값과 실제값 사이의 평균 제곱 오차를 정의한다. 공식이 매우 간단하고, 주로 회귀 문제에 사용된다.

오차의 제곱을 평균 낸것이기 때문에 큰 오차에 대해 더 많은 패널티를 부여한다.

 

 

MAE(Mean Absolute Error)

예측한 값과 실제 값 사이의 평균 절댓값 오차를 정의한다. 공식이 매우 간단하고, 주로 회귀 문제에 사용된다.

오차의 절댓값의 평균 낸것이기 때문에 모든 오차에 대해 동일한 패널티를 부여한다. 

일반적으로 MAE 형태로 사용되지 않고 MAE에 루트를 씌운 R(Root)MAE를 사용한다.

 

 

R2(결정계수, R-Squared)

R2는 회귀 분석에서 모델이 얼마나 잘 데이터를 설명하는지를 나타내는 지표이다. 

값은 0 ~ 1 사이의 값을 가지며, 값이 1에 가까워 질 수록 모델이 데이터를 잘 설명한다고 볼 수 있다.

  • R2 = 1 : 모델이 모든 변동성을 완벽히 설명.
  • R2 = 0 : 모델이 평균값을 사용하는 것과 동일한 성능.
  • R2 < 0 : 모델이 평균값보다 더 나쁜 성능을 보임.

 

 

Binary Cross-Entropy Loss

Binary Cross-Entropy Loss는 두 확률 분포 간의 차이를 측정한다. 주로 이진 분류 문제(이거나, 아니거나)에 사용되며, 모델의 예측 확률과 실제 레이블 간의 차이를 평가한다. 결과값은 0또는 1로 표현된다.

 

Categorical Cross-Entropy

Categorical Cross-Entropy은 다중 클래스 분류 문제에서 사용되며, 각 클래스에 대한 예측 확률과 실제 레이블 간의 차이를 측정한다. 실제 레이블은 원-핫 인코딩 형식으로 표현된다.

 

 

KL Divergence(Kullback-Leibler Divergence)

KL Divergence는 두 확률 분포 간의 차이를 측정하는 비대칭적인 지표이다.

주로 정보 이론과 통계학에서 사용되며, 한 분포가 다른 분포에 대해 얼마나 얼마나 다른지를 나타낸다.

 

  • P : 실제분포(참조 분포)
  • Q : 모델 분포(근사 분포)
  • x : 확률 변수가 가질 수 있는 값

 

 

Focal Loss

주로 불균형한 클래스 분포를 가진 분류 문제에서 사용되는 손실 함수이다.

이를 사용하여 주로 객체 탐지와 같은 작업에서 활용되고, 일반적인 교차 엔트로피 손실의 한계를 보완하기 위해 개발되었다.

 

다음과 같은 문제를 다룰 때 효과적이다.

  • 클래스 불균형
  • 객체 탐지와 같은 복잡한 분류 문제
  • 모델이 어려운 샘플에 더 집중하도록 유도할 때

 

 

import torch

# MAE
def mae(y_true:torch.Tensor,y_pred:torch.Tensor)->torch.Tensor:
    return torch.mean(torch.abs(y_true - y_pred))

# MSE
def mse(y_true:torch.Tensor,y_pred:torch.Tensor)->torch.Tensor:
    return torch.mean((y_true - y_pred)**2)
# R2
def r2_score(y_true:torch.Tensor,y_pred:torch.Tensor)->torch.Tensor:
    ss_total = torch.sum((y_true - torch.mean(y_true)) ** 2)
    ss_residual = torch.sum((y_true - y_pred) ** 2)
    return 1 - (ss_residual / ss_total)
    
# BCE
def bce(y_true:torch.Tensor,y_pred:torch.Tensor)->torch.Tensor:
    return torch.nn.function.binary_cross_entropy(y_pred,y_true)

# CCE
def cce(y_true:torch.Tensor,y_pred:torch.Tensor)->torch.Tensor:
    return torch.nn.function.cross_entropy(y_pred,y_true)
    
# KL Divergence
def kl_divergence(p:torch.Tensor,q:torch.Tensor)->torch.Tensor:
    return torch.sum(p * torch.log(p / q))
    
# Focal Loss
def focal_loss(y_true:torch.Tensor,y_pred:torch.Tensor,alpha:float=1.0,gamma:float=2.0)->torch.Tensor:
    bce_loss = torch.nn.functional.binary_cross_entropy(y_pred, y_true, reduction='none')
    p_t = y_true * y_pred + (1 - y_true) * (1 - y_pred)
    focal_loss = alpha * (1 - p_t) ** gamma * bce_loss
728x90
반응형