Loss Function

손실 함수(Loss Function)란?

손실 함수는 모델의 예측값과 실제값 사이의 차이를 측정하는 함수이다. 모델은 손실 함수의 값을 최소화하는 방향으로 학습하며, 문제의 유형(회귀, 분류)에 따라 적절한 손실 함수를 선택해야 한다.

회귀 문제의 손실 함수

1. MSE (Mean Squared Error)

MSE는 예측값과 실제값의 차이를 제곱하여 평균을 낸 값이다.

L=1ni=1n(yiy^i)2L = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2

특징:

  • 큰 오차에 더 큰 페널티를 부여한다
  • 이상치(outlier)에 민감하다
  • 미분 가능하여 경사 하강법에 적합하다

용도:

  • 일반적인 회귀 문제
  • 이상치가 적고 정규 분포에 가까운 데이터
  • 큰 오차를 강하게 처벌하고 싶을 때

예시:

# TensorFlow/Keras
model.compile(optimizer='adam', loss='mse')

2. MAE (Mean Absolute Error)

MAE는 예측값과 실제값의 차이의 절댓값을 평균낸 값이다.

L=1ni=1nyiy^iL = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|

특징:

  • 모든 오차에 동일한 가중치를 부여한다
  • 이상치에 덜 민감하다 (robust)
  • 미분 가능하지만 0에서 미분 불가능하다

용도:

  • 이상치가 많은 데이터
  • 모든 오차를 동등하게 다루고 싶을 때
  • 이상치의 영향을 줄이고 싶을 때

예시:

# TensorFlow/Keras
model.compile(optimizer='adam', loss='mae')

3. Huber Loss

Huber Loss는 MSE와 MAE를 결합한 손실 함수이다.

수식:

  • yy^δ|y - \hat{y}| \leq \delta 일 때: Lδ=12(yy^)2L_\delta = \frac{1}{2}(y - \hat{y})^2
  • yy^>δ|y - \hat{y}| > \delta 일 때: Lδ=δyy^12δ2L_\delta = \delta|y - \hat{y}| - \frac{1}{2}\delta^2

특징:

  • 작은 오차는 MSE처럼 제곱, 큰 오차는 MAE처럼 선형으로 처리한다
  • 이상치에 강건하면서도 미분 가능하다
  • δ\delta 하이퍼파라미터를 조정할 수 있다

용도:

  • 이상치가 있지만 MSE의 장점도 활용하고 싶을 때
  • MSE와 MAE의 중간 성격이 필요할 때

예시:

# TensorFlow/Keras
import tensorflow as tf
model.compile(optimizer='adam', loss=tf.keras.losses.Huber(delta=1.0))

분류 문제의 손실 함수

1. Binary Crossentropy

Binary Crossentropy는 이진 분류 문제에서 사용하는 손실 함수이다.

L=1ni=1n[yilog(y^i)+(1yi)log(1y^i)]L = -\frac{1}{n}\sum_{i=1}^{n}[y_i \log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i)]

특징:

  • 출력층에 Sigmoid 활성화 함수와 함께 사용한다
  • 예측 확률과 실제 레이블의 차이를 측정한다
  • 확률 분포의 차이를 측정하는 크로스 엔트로피를 사용한다

용도:

  • 이진 분류: 스팸 메일 분류, 질병 진단, 고객 이탈 예측 등
  • 출력층: Sigmoid 활성화 함수
  • 출력 뉴런 수: 1개

예시:

# TensorFlow/Keras
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy')

2. Categorical Crossentropy

Categorical Crossentropy는 다중 분류 문제에서 사용하며, 레이블이 원-핫 인코딩된 경우에 사용한다.

L=1ni=1nc=1Cyi,clog(y^i,c)L = -\frac{1}{n}\sum_{i=1}^{n}\sum_{c=1}^{C}y_{i,c}\log(\hat{y}_{i,c})

특징:

  • 출력층에 Softmax 활성화 함수와 함께 사용한다
  • 레이블이 원-핫 벡터 형태여야 한다 (예: [0, 0, 1, 0])
  • 각 클래스에 대한 확률 분포를 비교한다

용도:

  • 다중 분류: 이미지 분류, 감정 분석 등
  • 출력층: Softmax 활성화 함수
  • 레이블 형태: 원-핫 인코딩 (예: [0, 0, 1, 0])

예시:

# TensorFlow/Keras
# 레이블: [0, 0, 1, 0] (원-핫 인코딩)
model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy')

3. Sparse Categorical Crossentropy

Sparse Categorical Crossentropy는 다중 분류 문제에서 사용하며, 레이블이 정수 형태인 경우에 사용한다.

L=1ni=1nlog(y^i,yi)L = -\frac{1}{n}\sum_{i=1}^{n}\log(\hat{y}_{i,y_i})

특징:

  • 출력층에 Softmax 활성화 함수와 함께 사용한다
  • 레이블이 정수 형태여야 한다 (예: 2)
  • Categorical Crossentropy와 수학적으로 동일하지만 레이블 형태가 다르다

용도:

  • 다중 분류: 이미지 분류, 감정 분석 등
  • 출력층: Softmax 활성화 함수
  • 레이블 형태: 정수 (예: 2)

예시:

# TensorFlow/Keras
# 레이블: 2 (정수)
model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')

손실 함수 선택 가이드

문제 유형손실 함수출력층 활성화 함수레이블 형태예시
회귀MSE없음 (Linear)실수값주택 가격 예측
회귀 (이상치 많음)MAE없음 (Linear)실수값이상치가 많은 데이터
이진 분류Binary CrossentropySigmoid0 또는 1스팸 메일 분류
다중 분류Categorical CrossentropySoftmax원-핫 벡터이미지 분류 (원-핫)
다중 분류Sparse Categorical CrossentropySoftmax정수이미지 분류 (정수)

선택 시 고려사항

회귀 문제

  1. MSE vs MAE

    • 이상치가 적고 큰 오차를 강하게 처벌: MSE
    • 이상치가 많고 모든 오차를 동등하게: MAE
    • 둘의 중간: Huber Loss
  2. 데이터 분포

    • 정규 분포에 가까움: MSE
    • 이상치가 많음: MAE 또는 Huber Loss

분류 문제

  1. 이진 vs 다중 분류

    • 2개 클래스: Binary Crossentropy
    • 3개 이상 클래스: Categorical Crossentropy 또는 Sparse Categorical Crossentropy
  2. 레이블 형태

    • 원-핫 인코딩: Categorical Crossentropy
    • 정수 레이블: Sparse Categorical Crossentropy (메모리 효율적)

요약

  • 회귀: MSE (일반), MAE (이상치 많음), Huber Loss (중간)
  • 이진 분류: Binary Crossentropy + Sigmoid
  • 다중 분류: Categorical Crossentropy (원-핫) 또는 Sparse Categorical Crossentropy (정수) + Softmax

손실 함수는 모델의 학습 방향을 결정하므로, 문제의 특성과 데이터의 분포를 고려하여 적절한 함수를 선택하는 것이 중요하다.