비즈니스 문제를 해결하고 예측하는 데이터 사이언티스트가 되고 싶다면?
#인공지능 

손실함수 (Loss Function)

머신러닝과 딥러닝에서 아주 중요한 개념 중 하나인 손실함수에 대해 이야기해보려고 합니다. 손실함수는 모델의 학습을 이끄는 나침반과 같은 역할을 합니다. 이번 글에서는 손실함수가 무엇인지, 어떤 종류가 있는지, 그리고 왜 중요한지 살펴보도록 하겠습니다.

2024-04-16 | 김정은

안녕하세요! 오늘은 머신러닝과 딥러닝에서 아주 중요한 개념 중 하나인 손실함수에 대해 이야기해보려고 합니다.
손실함수는 모델의 학습을 이끄는 나침반과 같은 역할을 합니다. 이번 글에서는 손실함수가 무엇인지, 어떤 종류가 있는지, 그리고 왜 중요한지 살펴보도록 하겠습니다.

손실함수 ?

손실함수는 머신러닝이나 딥러닝 모델이 예측한 값과 실제 값 사이의 차이를 측정하는 함수입니다. 이를 통해 모델의 성능을 평가하고, 모델이 어떤 방향으로 개선되어야 할지 알려주는 역할을 합니다. 손실함수의 값을 최소화하는 것이 모델 학습의 목표라고 할 수 있습니다.

손실함수 종류

손실함수에는 여러 종류가 있는데요, 대표적인 손실함수 몇 가지를 살펴보겠습니다.

Mean Squared Error (MSE)

  • MSE는 회귀 문제에서 많이 사용되는 손실함수입니다.
  • 예측값과 실제값의 차이를 제곱한 후 평균을 취하는 방식으로 계산됩니다.

 

    $$ MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 $$

 

여기서$n$은 데이터의 개수, $y_i$는 실제값, \hat{y}_i는 예측값을 나타냅니다.

Binary Cross-Entropy

  • 이진 분류 문제에서 사용되는 손실함수입니다.
  • 예측 확률과 실제 클래스 사이의 차이를 측정합니다.

 

    $$BCE = -\frac{1}{n}\sum_{i=1}^{n}[y_i \log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i)]$$

 

여기서 $y_i$는 실제 클래스(0 또는 1), \hat{y}_i는 모델이 예측한 확률값을 나타냅니다.

Categorical Cross-Entropy

  • 다중 클래스 분류 문제에서 사용되는 손실함수입니다.
  • 각 클래스에 대한 예측 확률과 실제 클래스 사이의 차이를 측정합니다.

 

    $$ CCE = -\frac{1}{n}\sum_{i=1}^{n}\sum_{j=1}^{m}y_{ij}\log(\hat{y}_{ij}) $$

 

여기서 $n$은 데이터의 개수, $m$은 클래스의 개수, $y_{ij}$$i$번째 데이터의 실제 클래스(One-hot encoding), $\hat{y}_{ij}$는 모델이 예측한 $j$번째 클래스의 확률값을 나타냅니다.

Huber Loss

  • Huber Loss는 MSE와 유사하지만, 이상치에 덜 민감합니다.
  • 오차가 작을 때는 MSE와 동일하게 제곱 오차를 사용하지만, 오차가 클 때는 절댓값 오차를 사용합니다.

 

    $$ L_{\delta}(y, f(x)) = \begin{cases} \frac{1}{2}(y - f(x))^2 & \text{for } |y - f(x)| \le \delta, \\ \delta (|y - f(x)| - \frac{1}{2}\delta) & \text{otherwise.} \end{cases} $$

 

여기서 $y$는 실제값, $f(x)$는 예측값, $\delta$는 오차의 기준값입니다.
$\delta$ 이하의 오차는 제곱 오차를 사용하고, $\delta$를 초과하는 오차는 절댓값 오차에 $\delta$를 곱한 형태로 계산됩니다.

Hinge Loss

  • Hinge Loss는 Support Vector Machine (SVM)에서 주로 사용되는 손실 함수입니다.
  • 이진 분류 문제에서 사용되며, 올바른 클래스에 대한 예측값이 1보다 크고, 틀린 클래스에 대한 예측값이 -1보다 작도록 encourages합니다.

 

    $$ L(y, f(x)) = \max(0, 1 - y \cdot f(x)) $$

 

여기서 $y$는 실제 클래스 레이블 (+1 또는 -1), $f(x)$는 예측값입니다.
올바른 클래스에 대한 예측값이 1보다 크고, 틀린 클래스에 대한 예측값이 -1보다 작을 때 손실은 0이 됩니다.
그렇지 않은 경우, 손실은 $1 - y \cdot f(x)$로 계산됩니다.

Kullback-Leibler Divergence

  • KL Divergence는 두 확률 분포 사이의 차이를 측정하는 데 사용됩니다.
  • 머신러닝에서는 주로 Variational Autoencoder (VAE)나 Generative Adversarial Network (GAN)에서 사용됩니다.

 

    $$ D_{KL}(P \| Q) = \sum_{x \in X} P(x) \log(\frac{P(x)}{Q(x)}) $$

 

여기서 $P(x)$는 실제 데이터의 확률 분포, $Q(x)$는 모델이 생성한 데이터의 확률 분포입니다.KL Divergence는 실제 분포 $P(x)$와 모델 분포 $Q(x)$ 사이의 차이를 측정합니다.$D_{KL}(P | Q)$가 0에 가까울수록 두 분포가 유사하다는 것을 의미합니다.

Focal Loss

  • Focal Loss는 객체 탐지 문제에서 클래스 불균형을 다루기 위해 제안되었습니다.
  • Cross-Entropy Loss에 가중치를 부여하여, 잘못 분류된 예제에 더 집중하도록 합니다.

 

    $$ FL(p_t) = -\alpha_t (1 - p_t)^{\gamma} \log(p_t) $$

 

여기서 $p_t$는 모델이 예측한 올바른 클래스의 확률, $\alpha_t$는 클래스 불균형을 다루기 위한 가중치, $\gamma$는 잘못 분류된 예제에 대한 가중치를 조절하는 포커싱 파라미터입니다. $(1 - p_t)^{\gamma}$ 항이 잘못 분류된 예제에 대해 손실에 큰 가중치를 부여합니다. $\alpha_t$는 클래스 불균형 문제를 해결하기 위해 사용됩니다.

이 외에도 다양한 손실 함수들이 있으며, 새로운 손실 함수들도 계속해서 연구되고 있습니다. 문제의 특성과 데이터의 분포에 따라 적절한 손실 함수를 선택하는 것이 중요합니다.

손실함수를 왜 써야할까?

그렇다면 손실함수는 왜 필요할까요?

예를 들어, 우리가 집 가격을 예측하는 모델을 만든다고 가정해봅시다. 이 때, MSE를 손실함수로 사용할 수 있겠죠. 모델이 예측한 가격과 실제 가격의 차이를 제곱하여 평균을 구하면, 모델의 예측 성능을 평가할 수 있습니다. 이를 바탕으로 모델이 실제 가격에 더 가까운 예측을 하도록 학습을 진행할 수 있습니다.

만약 손실함수를 사용하지 않는다면, 모델이 어떤 방향으로 개선되어야 할지 알 수 없겠죠. 손실함수는 모델 학습의 나침반 역할을 해주는 셈입니다.

손실함수 최적화하는 방법

손실함수의 값을 최소화하기 위해서는 경사하강법(Gradient Descent)을 사용합니다. 경사하강법은 손실함수의 기울기(gradient)를 계산하여, 기울기의 반대 방향으로 모델의 가중치를 업데이트하는 방식으로 동작합니다. 이 때, 학습률(Learning Rate)은 각 업데이트 단계에서 가중치를 얼마나 조정할지 결정하는 역할을 합니다.

또한, 배치 크기(Batch Size)는 한 번에 몇 개의 데이터를 사용하여 기울기를 계산할지 결정합니다. 최적화 알고리즘(Optimizer)의 선택도 중요한데, Adam, RMSprop, SGD 등 다양한 알고리즘이 있습니다.

손실함수 최적화 알고리즘

Gradient Descent (경사 하강법)

  • 경사 하강법은 손실 함수의 기울기(gradient)를 이용하여 모델의 파라미터를 업데이트하는 방법입니다.
  • 기울기는 손실 함수를 각 파라미터로 편미분하여 계산합니다.
  • 파라미터를 기울기의 반대 방향으로 일정 크기(학습률)만큼 업데이트합니다.

 

    $$ \theta_{t+1} = \theta_t - \eta \cdot \nabla_{\theta} J(\theta) $$

 

여기서 $\theta$는 모델의 파라미터, $\eta$는 학습률, $\nabla_{\theta} J(\theta)$는 손실 함수의 기울기입니다.

Stochastic Gradient Descent (SGD, 확률적 경사 하강법)

  • SGD는 경사 하강법의 변형으로, 매 업데이트마다 전체 데이터 대신 일부 데이터(미니배치)를 사용합니다.

 

    $$ \theta_{t+1} = \theta_t - \eta \cdot \nabla_{\theta} J(\theta; x^{(i:i+n)}, y^{(i:i+n)}) $$

 

여기서 $x^{(i:i+n)}$$y^{(i:i+n)}$$i$번째부터 $i+n$번째까지의 입력 데이터와 레이블입니다.

SGD는 전체 데이터를 사용하는 것보다 계산 효율이 높고, 국소 최적점에서 벗어날 수 있는 장점이 있습니다.

Momentum (모멘텀)

  • Momentum은 SGD에 관성의 개념을 도입한 방법입니다.
  • 이전 업데이트의 방향을 일정 부분 유지하여, 업데이트의 안정성과 수렴 속도를 높입니다.

 

    $$ v_t = \gamma v_{t-1} + \eta \cdot \nabla_{\theta} J(\theta) , \theta_{t+1} = \theta_t - v_t $$

 

여기서 $v_t$는 시간 $t$에서의 업데이트 속도, $\gamma$는 모멘텀 계수입니다.

Adagrad

  • Adagrad는 파라미터별로 학습률을 조정하는 방법입니다.
  • 업데이트가 많이 이루어진 파라미터의 학습률은 낮추고, 적게 이루어진 파라미터의 학습률은 높입니다.

 

    $$ g_{t, i} = \nabla_{\theta_i} J(\theta_t) , G_{t, ii} = \sum_{\tau=1}^t g_{\tau, i}^2 , \theta_{t+1, i} = \theta_{t, i} - \frac{\eta}{\sqrt{G_{t, ii} + \epsilon}} \cdot g_{t, i} $$

 

여기서 $g_{t, i}$는 시간 $t$에서 $i$번째 파라미터의 기울기, $G_{t, ii}$$i$번째 파라미터의 기울기 제곱합, $\epsilon$는 분모가 0이 되는 것을 방지하기 위한 작은 상수입니다.

RMSprop

  • RMSprop은 Adagrad의 단점을 보완한 방법으로, 기울기의 제곱합을 지수 이동 평균으로 계산합니다.

 

    $$ E[g^2]t = \gamma E[g^2]{t-1} + (1 - \gamma) g_t^2 , \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} g_t $$

 

여기서 $E[g^2]_t$는 시간 $t$까지의 기울기 제곱의 지수 이동 평균입니다.

Adam (Adaptive Moment Estimation)

  • Adam은 Momentum과 RMSprop의 아이디어를 결합한 방법입니다.
  • Momentum과 유사하게 기울기의 지수 이동 평균을 계산하고, RMSprop과 유사하게 기울기 제곱의 지수 이동 평균을 계산합니다.

 

$$ m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t ,

 v_t= \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 ,

 \hat{m}_t= \frac{m_t}{1 - \beta_1^t} ,

 \hat{v}t= \frac{v_t}{1 - \beta_2^t} ,

 \theta{t+1}= \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t $$

 

여기서 $m_t$$v_t$는 각각 기울기와 기울기 제곱의 지수 이동 평균, $\beta_1$$\beta_2$는 지수 이동 평균의 계수, \hat{m}_t\hat{v}_t는 초기 단계에서의 편향을 보정한 값입니다.

이상으로 대표적인 손실함수 최적화 알고리즘을 소개했습니다. 각 알고리즘은 고유의 특성과 장단점이 있으므로, 문제의 특성과 데이터의 분포에 따라 적절한 알고리즘을 선택하는 것이 중요합니다. 또한, 학습률과 같은 하이퍼파라미터의 조정을 통해 최적화 성능을 높일 수 있습니다.

마치며

손실함수는 머신러닝과 딥러닝 모델 학습에서 핵심적인 역할을 합니다. 문제의 유형과 데이터의 특성에 맞는 손실함수를 선택하는 것이 중요하며, 손실함수를 최적화하는 과정을 통해 모델의 성능을 높일 수 있습니다. 다양한 손실함수와 최적화 기법에 대한 이해는 머신러닝/딥러닝 엔지니어에게 필수적인 역량이라고 할 수 있겠네요.

이상으로 손실함수에 대해 알아보았습니다. 머신러닝과 딥러닝 공부에 도움이 되셨기를 바랍니다. 감사합니다!

 

참고자료