📚 [Archive] CS & AI 스터디/[STUDY] 인공지능 🤖

[모델 평가/학습 목표] 주요 손실 함수 정리

히주 2025. 2. 5. 14:05

그래프에 나오는 눈금 일부는 틀리니 무시하세요

 

 

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

MSE란?
회귀(Regression) 문제에서 가장 많이 사용되는 손실함수

예측값과 실제값의 차이를 제곱한 후 평균을 내는 방식으로 예측값과 실제값이 같으면 MSE = 0

 

 

MSE 공식

MSE 특징
✔ 오차를 제곱하므로 큰 오차일수록 제곱 값이 급격히 커짐 → 이상치(outlier)에 민감함
✔ 손실값이 0에 가까울수록 모델이 잘 학습됨

 

예측값 변화에 따른 평균적인 패턴

1이라는 것은 예측값과 실제값의 차이가 평균적으로 ±1 정도 난다는 의미

 

  • 오차를 제곱하기 때문에 포물선 형태로 증가함
  • 예측값이 실제값에서 멀어질수록 손실이 빠르게 증가함

 

 

MSE 코드 예제

import numpy as np

y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])

mse = np.mean((y_true - y_pred) ** 2)
print("MSE:", mse)

 

📌 실행 결과  |  MSE: 0.375

 

📌 2. 평균 절대 오차 (Mean Absolute Error, MAE)

MAE란?
회귀(Regression) 문제에서 사용됨

예측값과 실제값의 차이의 절댓값을 평균하여 계산함

 

MAE 공식

 

MAE 특징
✔ 오차의 절댓값을 사용하므로 이상치에 덜 민감
✔ 손실값이 0에 가까울수록 모델이 잘 학습됨

 

 예측값 변화에 따른 평균적인 패턴

0은 예측값과 실제값의 차이가 0인 경우임. 즉, 예측이 완전히 정답일 때

  • 오차의 절대값을 사용하기 때문에 선형적으로 증가함
  • MSE와 다르게 이상치에 덜 민감하지만 미분이 불연속(0에서 기울기가 바뀜)

 

 

MAE 코드 예제

import numpy as np

y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])

mae = np.mean(np.abs(y_true - y_pred))
print("MAE:", mae)
 

📌 실행 결과  |  MAE: 0.5

 

📌 3. 후버 손실 (Huber Loss)

Huber Loss란?
MSE와 MAE의 장점을 결합한 손실 함수임

작은 오차에서는 MSE처럼 곡선, 큰 오차에서는 MAE처럼 직선 형태로 동작하여 이상치의 영향을 줄여줌

예측값과 실제값이 가까워질수록 손실이 0에 가까워지는 방향으로 최적화 됨

 

Huber Loss 공식

Huber Loss 특징
✔ 작은 오차에서는 MSE처럼 동작하고 큰 오차에서는 MAE처럼 동작하여 이상치에 대한 영향을 줄일 수 있음

 

 예측값 변화에 따른 평균적인 패턴

  • 오차가 일정 크기(Δ) 이상이면 선형 증가(즉, 이상치에 덜 민감)

 

Huber Loss 코드 예제

import numpy as np

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).mean()

y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])

loss = huber_loss(y_true, y_pred)
print("Huber Loss:", loss)

 

📌 실행 결과  |  Huber Loss: 0.3125

 

📌 4. 이진 교차 엔트로피 손실 (Binary Cross-Entropy, BCE)

BCE란?
0과 1로 구분되는 이진 분류(Binary Classification) 문제에서 사용됨

모델이 예측한 확률과 실제값 사이의 차이를 측정하는 손실 함수

 

BCE 공식

 

BCE 특징
✔ 확률 기반의 계산을 통해 모델이 정답에 가까운 높은 확률을 부여하도록 유도
출력층에 시그모이드(Sigmoid) 활성화 함수 사용

 

 예측값 변화에 따른 평균적인 패턴

 

  • 정답 확률을 높이면 손실이 줄고, 틀린 확률을 높이면 손실이 급격히 증가하는 구조
  • 예측값이 0 또는 1에 가까울수록 손실이 낮음
  • 0.5를 기준으로 손실이 급격하게 증가하는 비대칭적 곡선
  • 확률 기반이므로 예측값이 틀릴수록 손실이 매우 커짐

 

BCE 코드 예제

import numpy as np
from sklearn.metrics import log_loss

y_true = np.array([1, 0, 1, 1])
y_pred = np.array([0.9, 0.1, 0.8, 0.7])

ce_loss = log_loss(y_true, y_pred)
print("Binary Cross-Entropy Loss:", ce_loss)

📌 실행 결과  |  Binary Cross-Entropy Loss: 0.1642

 

📌 5. 범주형 교차 엔트로피 손실 (Categorical Cross-Entropy, CCE)

CCE란?
다중 클래스 분류(Multi-Class Classification) 문제에서 사용됨

모델이 예측한 확률 분포와 실제 레이블 간의 차이를 측정함

 

CCE 공식

 

CCE 특징
소프트맥스(Softmax) 활성화 함수와 함께 사용됨
✔ 다중 클래스 분류에서 가장 일반적으로 사용됨

모델이 여러 클래스 중 하나를 정답으로 예측하기 때문에  각 클래스의 확률을 합치면 1이 되어야함 (확률분포 형태)

보통 원-핫인코딩 형태로 정답을 표현하고 모델이 출력하는 확률 분포와 비교해서 손실 계산함

 

 예측값 변화에 따른 평균적인 패턴

아래 예제 코드 기반 그래프

  • BCE와 유사하지만 다중 클래스 분류에 사용됨
  • 정답 클래스의 확률이 높아질수록 손실이 낮아짐
  • 틀린 클래스로 예측하면 손실이 크게 증가

 

CCE 코드 예제

import numpy as np

y_true = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])  # 원-핫 인코딩된 실제 값
y_pred = np.array([[0.8, 0.1, 0.1], [0.2, 0.7, 0.1], [0.2, 0.2, 0.6]]) # 확률의 합이 1

loss = -np.sum(y_true * np.log(y_pred)) / y_true.shape[0]
print("Categorical Cross-Entropy Loss:", loss)

 

📌 실행 결과  |  Categorical Cross-Entropy Loss: 0.2600

 

 

 

 

 

[머신러닝/딥러닝] 손실함수(Loss Function)

머신러닝과 딥러닝에서 손실함수는 모델이 얼마나 틀렸는지 측정하는 중요한 요소입니다. 손실함수는 모델이 학습할수 있도록 가이드를 제공해주고 이를 최소화하는 방향으로 최적화가 진행

yiheeju.tistory.com