AI & Data/Deep Learning

[딥러닝] Loss Function

테드리 2024. 8. 18. 17:09

1. Loss Function

Loss(손실)란 정답값과 예측값의 오차를 의미한다

 

Loss Function의 정의:

  • Neural Network 모델이 예측한 값 $\hat{Y}$와 실제 값 $Y$ 간의 차이의 지표를 의미한다
  • 대표적으로 MSE가 있다. $$L(Y, \hat{Y}) = \frac{1}{N} \sum_{1}^{n} (y_i - \hat{y_i})^2$$

따라서 이 $L$값이 낮아질수록 NN 모델의 성능은 좋아진다고 볼 수 있다. 즉, 손실함수의 값이 최소가 되도록 weight들의 값을 최적화하는 것이 모델 학습의 목적인 것이다.

 

2. Deep Learning의 Task

Loss Function은 풀고자 하는 Task에 따라 다르다.

 

1. Regession (회귀) : 어떤 연속적인 값을 예측하는 Task

2. Classification (분류) : 어떤 클래스의 라벨을 예측하는 Task

 

1. Regression의 Loss

(1) L2 Loss (MSE)

$$L(Y, \hat{Y}) = \frac{1}{N} \sum_{n = 1}^{N} (y_i - \hat{y_i})^2$$

  • 장점 : Convergence가 더 빠르다
  • 단점 : Anomaly에 더 민감하다

 

(2) L1 Loss (MAE)

$$L(Y, \hat{Y}) = \frac{1}{N} \sum_{n = 1}^{N} |y_i - \hat{y_i}|$$

  • 장점 : L2에 비해 anomaly에 비교적 robust하다.
  • 단점 : 0에서 미분가능하지 않다

 

(3) Huber Loss

$$\begin{cases}
 & \frac{1}{2}(y_i - \hat{y_i})^2  \quad  \quad \text{if} \;\;|(y_i - \hat{y_i})| < \delta \\
 & \delta \times (|y_i - \hat{y_i}| - \frac{\delta}{2}) \quad \quad \text{ if } \;\; \text{otherwise}
\end{cases}$$

  • 장점 : L2의 fast convergence와 L1의 Robust의 장점을 모두 겸비하고 있다
  • 단점 : 한 번만 전구간 미분가능하다

 

(4) Log - Cosh Loss

$$ log(cosh( \hat{y_i} - y_i))$$

  • Huber Loss와 유사하지만 전구간 미분이 두 번 가능하다

 

2. Classification의 Loss

Ground Truth Label : $Y_{i,c}$ = i번째 데이터의 레이블이 class c일 확률

Predicted Label : $\hat{Y}_{i,c}$ = i번째 data의 레이블이 class c라고 예측할 확률

 

(1) Cross Entropy Loss

$$\sum_{c = 1}^{C} - Y_{i,c} \cdot log \hat{Y}_{i,c}$$

 

(2) KL Divergence Loss

$$\sum_{c = 1}^{C} Y_{i,c} \cdot log( \frac{Y_{i,c}}{\hat{Y}_{i,c}})$$

  • 장점: 학습 속도가 빠르다
  • 단점: Outlier및 Noise에 더 취약, 민감하다.

 

(3) L1 Loss (MAE)

$$L(Y, \hat{Y}) = \frac{1}{N} \sum_{n = 1}^{N} |y_i - \hat{y_i}|$$

  • 장점 : Outlier및 Noise에 비교적 robust하다.
  • 단점 : 학습 속도가 Cross Entropy나 KL Divergence에 비해 느리다

 

3. Pytorch로 구현하기

<pseudo code>

# initalize loss function

loss_fnc = nn.MSELoss(reduction = "mean")

for batch in dataloader:
    input, ground_truth = batch
    optimizer = zero.grad()
    predicted = model(input)
    
    #compute loss
    loss = loss_fnc(predicted, ground_truth)
    
    loss.backward()	#backward pass
    optimizer.step()	#step function

 

  • loss.backward(): loss에 대한 gradient $\bigtriangledown_w L$ 계산
  • optimizer.step(): gradient descent하여 다음 step의 gradient를 업데이트한다

 

reduction = 'mean'과 'none'의 차이

 

(1) reduction = "none"

  • 각 데이터 sample 별로 loss를 구한다. 주로 evaluation 단계에서 사용

$$L(Y, \hat{Y}) \in \mathbb{R^b}$$

 

(2) reduction = "mean"

  • 각 데이터 sample 별로 loss를 구해서 average를 취한다. 주로 Training 단계에서 사용 $$\sum_{b = 1}^{B} L(Y, \hat{Y}) \in \mathbb{R^b}$$

Loss Function" target="_blank" rel="noopener" data-mce-href="http://Loss Function">http://Loss Function

 

GitHub - taekyounglee1224/Pytorch_DL: Hands-on deep learning models with Pytorch

Hands-on deep learning models with Pytorch . Contribute to taekyounglee1224/Pytorch_DL development by creating an account on GitHub.

github.com