AI 개념정리

오차 함수의 종류와 특징

_DK_Kim 2024. 2. 22. 18:37

Task를 잘 수행할 있도록 모델을 학습시킬 때 고려해야할 점에는 무엇이 있을까? 모델의 구조나 데이터셋 등 다양한 요소가 있겠지만, 오차 함수도 모델 학습 결과에 큰 영향을 미친다. 오늘은 이 오차 함수(Loss function)에 대해 알아보자.


1. 오차 함수(Loss function)

 

오차 함수(혹은 손실 함수라고도 함)는 학습 중 모델이 얼마만큼의 성능을 보이는 지 판단할 수 있는 함수다. 특별한 목적이 없다면, 오차 함수는 거의 대부분 양수값을 갖도록 설계한다. 이는 오차 함수를 해석할 때 편하게 보기위함과 동시에
최적화의 용이성을 고려하여양수로 선택하는 것이다.

 

대표적으로 사용하는 오차 함수는 평균제곱오차(MSE), 평균절대오차(MAE), Cross entropy 그리고 Dice Loss 등이

있다.


2. 평균제곱오차(Mean Square Error:  MSE)

 

일반적인 회귀 문제에서 많이 사용되는 오차 함수이다. 이름 그대로 예측값과 실제값의 차의 제곱을 이용하여 모델의

성능을 분석하는 방법이다. 수식은 다음과 같다.

 

$$ L = \dfrac{1}{N}\sum_{i=1}^{N}{(\hat{y}_i - y_i)^2} $$

 

 

위 수식에서 $N$ 은 한 epoch에서 사용된 전체 데이터 수, $\hat{y}$은 모델의 예측값, $y$는 실제값을 의미 한다. 

 

이 함수는 사용하기 쉽고 대부분의 경우 학습이 잘 된다는 장점이 있지만, 예욋값에 민감하다는 특징이 있다.

 

즉, 이상치(Outliers)에 민감하게 반응하기 때문에 전반적인 데이터에 대해 잘 학습하던 모델이 예욋값을 계산할 때 발생하는 큰 오차에 의해 잘못 학습될 가능성이 있다. 그리고 데이터셋이 불균형 경우도 마찬가지로 특정 데이터셋에 대해서만 학습이 이루어질 문제도 있다.

 

이러한 문제점을 보완한 방법으로 평균절대오차(Mean Absolute Error ; MAE)나 Huber Loss 등이 사용되곤한다.


3. 평균절대오차(Mean Absolute Error:  MAE)

 

앞서 소개된 MSE와 비슷하게 많이 사용되는 방법이다. 계산 방법은 거의 동일하지만 다른 점은 제곱이 아니라, 절댓값을

사용한다는 것이다. 수식은 아래와 같다.

 

$$ L = \dfrac{1}{N}\sum_{i=1}^{N}{|\hat{y}_i - y_i|} $$

 

 

절댓값을 쓰기 때문에 함수는 항상 0 이상의 값을 반환한다. 그리고 이상치에 대해 MSE보다 덜 민감하다. 예를 들어, 예측값과 실제값과의 차이가 2가 나는 sample이 있다고 생각해보자. 만약 MAE 기준에서 이 값을 생각해보면, 단순히 2라는 값을 사용하게될 것이고 MSE의 경우 이 값이 제곱되기에 4라는 더 큰 오차로 해석될 것이다.

 

위의 예시처럼 MAE는 MSE보다는 이상치에 덜 민감하다는 특징이 있다는 정도로 이해하면 될 것 같다.


4. Cross Entropy

 

Cross Entroy는 분류 혹은 분할(Segmentation)에서 많이 사용하는 오차 함수다.

모델이 예측한 확률 분포와 확률 분포 사이의 차이를 보여주는데, 앞선 두 함수와 마찬가지로 0에 가까울 수록 모델이 정확하다는 것을 의미한다. 이 함수의 수식은 다음과 같다.

 

$$ L = -\sum_{i=1}^{N}{\hat{y_i}\log{(p_i)}} $$

 

위 수식에서 $N$은 전체 class 수, $p_i$는 모델이 예측한 $i$번째 class의 확률 분포를 의미한다.

아래의 예시를 통해 Cross Entropy를 계산하는 방법을 살펴보자.

 

  Dog Cat Car
Ground Truth   1.0 0.0 0.0
Model Prediction 
0.70 0.22 0.08

 

위의 표와 같이 모델이 예측값을 반환했을 때, loss값을 계산해보면 아래와 같다.

$$ L = -(1.0\times \log{(0.7)} + 0.0\times\log{(0.22)} + 0.0\times\log{(0.08)} ) = -\log{(0.7)} $$

 

위의 예시는 일반적인 분류문제에 적용한 경우다. 그렇다면 segmentation에서는 어떻게 적용할 수 있을까?

우선 $N$개의 class를 가진 $H \times W$ 크기의 segmentation map을 예측한다고 가정해보자.

 

Cross entropy는 모든 클래스에 대해 예측 확률 분포와 실제 확률 분포를 통해 계산된다.그리고 Segmentation은 한 픽셀 당 분류 문제로 생각할 수 있다. 즉, 모든 픽셀에 대해 위 예제처럼의 과정을 진행해주면 된다.

즉, 아래의 수식을 계산해주면 된다.

 

$$ L = \sum_{i=1}^{H}\sum_{j=1}^{W}\sum_{k=1}^{N}   {- y_{(j,i),k} \log{ (p_{(j,i),k})   }}$$

 

위 식에서 $y_{(j,i),k}$와 $p_{(j,i),k}$는 각각 $ j, i$에 위치한 픽셀에서 $k$번째 class의 확률 분포값이다. 

이렇게 픽셀 단위로 계산하는 방법을 "Pixel-wise Cross Entropy"라고도 한다. 

 

경우에 따라, 클래스간 불균형이 심한 데이터셋을 학습할 경우 특정 클래스를 계산할 때 가중치를 부여하여 학습하기도 한다. 이렇게 학습하는 경우는 "Class-weighted Cross Entropy" 라고 한다.

 

Segmentation 관점에서 조금 더 설명하자면, Cross entropy는 픽셀에 대한 예측 정확성을 높일 수 있지만 class가 불균형 데이터셋을 학습할 때 특정 class에 치우쳐 학습될 문제가 있다. 때문에, Dice Loss 같은 오차 함수와 같이 사용하여 이러한

부분을 보완하기도 한다.


5. Dice Loss

Dice Loss는 segmentation에서 주로 사용하는 오차 함수다. 예측값과 실제값과의 유사도를 수치로 보여주는 값으로 Dice 계수를 사용하여 계산된다. 이 함수에 대해 알아보기전에 Dice 계수 먼저 알아보자.

 

Dice 계수

1945년 Lee Raymond Dice에 의해 정의된 개념으로 Dice 계수(혹은 Sørensen-Dice 계수)라고도 한다.

간단히 설명하면 두 샘플간의 overlap 비율을 통해 유사도를 수치화한 것이다. 계산은 아래와 같다.

 

$$ Dice \ coeffcient  = D = \dfrac{2\times | X \cap Y |}{|X| + |Y|} $$

 

 

위 수식에 볼 수 있듯, 두 집합의 겹치는 부분이 커질 수록 계수는 1에 가까워진다.

Dice Loss는 $1-D$로 정의된다.

 

위는 이론적인 구현 방법이고, Dice Loss를 실제 코드에서 구현하는 방법은 주로 아래의 방법을 사용한다.

 

$$ L = 1 - \frac{2 \times \sum{(p_i \times y_i)} }{\sum{p_i} + \sum{y_i}} $$

 

 

위 수식에서 $p_i$와 $y_i$는 각각 $i$번째 class에 대 예측 확률 분포와 실제 확률 분포를 나타낸다.

 

만일, 학습하고자 하는 데이터셋이 class 불균형이 심하다면 Cross Entropy보다 DiceLoss를 사용하는 것이 학습이 더 잘될 가능성이 높다. 다시 한번 강조하지만, 무조건 좋다는 것이 아니라 가능성이 높다라는 점에 주목하자.
이러한 이유를 정리하면 아래와 같다.

 

  1. 모든 class에 대한 동등한 가치 :
    - Dice Loss :
      각 class에 대한 예측값과 실제값 간의 overlap을 기반으로 계산되므로, class의 크기나 빈도에 관계없이
      성능을 추정. 즉, 소수의 class와 다수의 class가 동등하게 평가됨.
    - Cross Entropy :
      개별 픽셀 혹은 데이터 포인트에 대한 예측 오류를 게산하기 때문에, 다수의 class에 대한 오류가 전체 loss
      계산에 더 큰 영향을 미칠 수 있음. 때문에, 모델이 다수의 class에 치우쳐서 학습이 진행될  수 있음.
  2. 예측값과 실제값 간의 관계 초점 :
    - Dice Loss :
      예측된 객체와 실제 객체 간의 overlap을 기준으로 평가됨. 또한, 이 평가값을 기준으로 최적화가 이루어지므로
      객체간의 경계에 대한 정확도를 향상시킴.
    - Cross Entropy :
      확률 분포에 기반해서, 각 픽셀의 클래스 예측값과 실제값 간의 차이를 기준으로 평가됨. 때문에 공간적 연관성이나
      형태같은 기하적인 정보는 덜 반영될 수 있음.   

 

하지만, 경험상 DiceLoss와 Cross Entropy 두 함수 중 하나의 함수만 사용하기보다 두 함수를 함께 사용하는 경우가 학습이 더 잘 될 확률이 높다. 모든 경우에 대해서 DiceLoss가 더 좋은 결과를 보장하지도 않을 뿐더러, 굳이 하나의 함수로만

오차 함수를 정의할 필요도 없기 때문이다.


 

이렇게 모델을 학습하기 위한 오차 함수는 정말 다양하다. 소개된 오차 함수를 제외하고도 task에 따라 정말 다양한

오차 함수가 존재한다. 모델을 잘 학습하기 위해서는 좋은 모델을 구상하는 것도 좋지만, 좋은 오차 함수를 설계하는 것도

아주 중요하다. 이러한 설계 감각도 결국, 경험에서 얻을 수 있으므로 부지런히 코드를 짜고 연구해봐야겠다.

 

 

 

 

 

728x90