본문 바로가기

공부/데이터

손실함수의 이해와 종류/파이썬으로 구현까지

손실 함수란 무엇인가?

손실 함수(Loss Function)는 머신러닝 모델의 성능을 측정하는 핵심 요소다. 간단히 말해, 손실 함수는 모델의 예측값과 실제값 사이의 차이를 수치화하는 방법을 말한다. 이 값이 작을수록 모델의 예측이 정확하다고 할 수 있다. 손실 함수는 모델이 학습 과정에서 어떻게 자신의 오류를 '인식'하고 '개선'해야 하는지를 결정하는 데 중요한 역할을 한다.

 

손실 함수의 종류

손실 함수는 주로 사용되는 문제 유형에 따라 다양하게 분류되며, 이 때 주요한 손실 함수의 종류는 다음과 같다.

  • 회귀 문제의 손실 함수
    • 평균 제곱 오차 (Mean Squared Error, MSE)
      • 실제 값과 예측 값의 차이를 제곱하여 평균을 낸다.
import numpy as np
def mean_squared_error(y_true, y_pred):
    return np.mean(np.square(y_true - y_pred))

 

    • 평균 절대 오차 (Mean Absolute Error, MAE)
      • 실제 값과 예측 값의 차이의 절대값의 평균을 사용한다.
def mean_absolute_error(y_true, y_pred):
    return np.mean(np.abs(y_true - y_pred))
  1.   
    • 휴버 손실 (Huber Loss)
      • MSE와 MAE의 조합으로, 작은 오차에는 MSE와 유사하게, 큰 오차에는 MAE와 유사하게 작동한다.
def huber_loss(y_true, y_pred, delta=1.0):
    error = y_true - y_pred
    is_small_error = np.abs(error) <= delta
    squared_loss = np.square(error) / 2
    linear_loss = delta * (np.abs(error) - delta / 2)
    return np.where(is_small_error, squared_loss, linear_loss)
  1.  
    • 로그 코시 손실 (Log-Cosh Loss)
      • 오차의 하이퍼볼릭 코사인의 로그를 계산한다.
def log_cosh_loss(y_true, y_pred):
    def logcosh(x):
        return x + np.log(np.cosh(np.clip(-x, -10, 10)))
    return np.mean(logcosh(y_true - y_pred))
  1.  
    • 포아송 손실 (Poisson Loss)
      • 실제 값과 예측 값 사이의 차이에 대한 포아송 분포의 로그 우도를 계산한다. 
def poisson_loss(y_true, y_pred):
    return np.mean(y_pred - y_true * np.log(y_pred + 1e-7))
  •  
  • 이진 분류 문제의 손실 함수
    • 이진 교차 엔트로피 (Binary Cross-Entropy)
      • 두 클래스 중 하나를 예측하는 문제에 사용되며, 실제 값과 예측 값 사이의 정보 손실을 측정한다.
def binary_cross_entropy(y_true, y_pred):
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

 

    • 휴버 손실 (Huber Loss)
      • 이진 분류 문제에서도 변형하여 사용할 수 있다.
def huber_loss(y_true, y_pred, delta=1.0):
    error = y_true - y_pred
    is_small_error = np.abs(error) <= delta
    squared_loss = np.square(error) / 2
    linear_loss = delta * (np.abs(error) - delta / 2)
    return np.where(is_small_error, squared_loss, linear_loss)
  •  
    • 콘트라스트 손실 (Contrastive Loss)
      • 주로 유사성 학습에 사용되지만, 이진 분류 문제에도 적용 가능하다.
def contrastive_loss(y_true, y_pred, margin=1.0):
    return np.mean(y_true * np.square(y_pred) + (1 - y_true) * np.square(np.maximum(margin - y_pred, 0)))
  •  
  • 다중 분류 문제의 손실 함수
    • 다중 클래스 교차 엔트로피 (Multiclass Cross-Entropy)
      • 세 개 이상의 클래스를 예측하는 문제에 적합하며, 각 클래스에 대한 예측의 확률을 고려하여 손실을 계산한다.
def multiclass_cross_entropy(y_true, y_pred):
    return -np.sum(y_true * np.log(y_pred)) / y_true.shape[0]

 

    • Dice 손실 (Dice Loss)
      • 주로 이미지 분할에서 사용되지만, 다중 클래스 분류 문제에도 적용 가능하다.
    • 코사인 유사도 손실 (Cosine Similarity Loss)
      • 다차원 데이터의 유사성 학습에 적합하며, 다중 클래스 분류 문제에도 사용될 수 있다.

 

이러한 분류는 일반적인 지침에 불과하므로, 특정 문제에 대해 손실 함수를 선택할 떄는 문제의 특성과 데이터의 특징을 고려하여 선택해야 한다.