본문 바로가기
AI/관련 자료

[머신러닝] 손실 함수(Loss Function)란?

by 뒹굴거리는프로도 2024. 11. 15.
반응형

 


 

손실함수(Loss Function)는 머신러닝과 딥러닝 모델에서 모델의 예측값과 실제값 간의 차이를 수치적으로 표현한 함수입니다. 모델이 얼마나 잘못 예측했는지를 나타내며, 이 값을 최소화하는 것이 학습의 목표입니다.

 

주요 손실함수 유형


*회귀 문제

평균제곱오차(Mean Squared Error, MSE)

: 실제값(yi​)과 예측값(y^​i​)의 차이를 제곱하여 평균을 구함. 차이가 클수록 더 큰 패널티를 줌.
평균절대오차(Mean Absolute Error, MAE)

: 차이의 절댓값 평균을 구함. 이상치(outlier)에 덜 민감.

 

*분류 문제

이진교차엔트로피(Binary Cross-Entropy)

: 예측확률(y^​i​)이 실제 클래스(yi​)에 가까울수록 손실이 작아짐.
다중교차엔트로피(Categorical Cross-Entropy)

: 여러 클래스 간 확률 분포를 비교하며, 정답 클래스 확률을 높이는 방향으로 학습.

 

*특수 목적

허브 손실(Huber Loss)

: MSE와 MAE의 장점을 결합하여 이상치에 덜 민감한 회귀 문제용 손실함수.
KL 발산(Kullback-Leibler Divergence)

: 확률 분포 간의 차이를 측정.

 

 

특징


손실함수가 모델의 학습 방향을 결정합니다.
선택한 손실함수에 따라 모델의 성능이 크게 달라질 수 있습니다.
각 문제(회귀, 분류 등)에 적합한 손실함수를 선택해야 합니다.

 

 

파이썬 구현 예제


*평균제곱오차 (Mean Squared Error, MSE) 구현 예제

평균제곱오차는 예측값과 실제값의 차이를 제곱하여 평균을 구합니다.

import numpy as np

def mean_squared_error(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

# 예제
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
mse = mean_squared_error(y_true, y_pred)
print("MSE:", mse)

 

*평균절대오차 (Mean Absolute Error, MAE) 구현 예제

평균절대오차는 예측값과 실제값의 차이의 절댓값을 평균합니다.

def mean_absolute_error(y_true, y_pred):
    return np.mean(np.abs(y_true - y_pred))

# 예제
mae = mean_absolute_error(y_true, y_pred)
print("MAE:", mae)

 

*이진 교차 엔트로피 (Binary Cross-Entropy) 구현 예제

이진 교차 엔트로피는 이진 분류 문제에서 주로 사용하는 손실함수입니다. 모델의 예측값이 확률값(0~1)이어야 합니다.

def binary_cross_entropy(y_true, y_pred):
    epsilon = 1e-15  # 로그 계산 시 무한대로 발산하지 않게 하기 위해 작은 값 추가
    y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

# 예제
y_true = np.array([1, 0, 1, 1])
y_pred = np.array([0.9, 0.1, 0.8, 0.6])
bce = binary_cross_entropy(y_true, y_pred)
print("Binary Cross-Entropy:", bce)

 

*다중 교차 엔트로피 (Categorical Cross-Entropy) 구현 예제

다중 교차 엔트로피는 여러 클래스 중 하나를 예측할 때 사용하는 손실함수입니다.

def categorical_cross_entropy(y_true, y_pred):
    epsilon = 1e-15
    y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
    return -np.sum(y_true * np.log(y_pred)) / y_true.shape[0]

# 예제
y_true = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
y_pred = np.array([[0.7, 0.2, 0.1], [0.1, 0.8, 0.1], [0.2, 0.2, 0.6]])
cce = categorical_cross_entropy(y_true, y_pred)
print("Categorical Cross-Entropy:", cce)

 

*허브 손실 (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 = 0.5 * (error ** 2)
    linear_loss = delta * (np.abs(error) - 0.5 * delta)
    return np.mean(np.where(is_small_error, squared_loss, linear_loss))

# 예제
huber = huber_loss(y_true, y_pred)
print("Huber Loss:", huber)

 

 

정리


손실함수는 "모델이 얼마나 실수했는지"를 숫자로 나타내는 잣대입니다. 숫자가 작아질수록 모델이 예측을 더 잘하고 있다는 뜻입니다.

 

 

 


반응형