Research/ML, DL

딥러닝 손실 함수(loss function) 정리: MSE, MAE, binary/categorical/sparse categorical crossentropy

bskyvision.com 2020. 6. 24. 09:25

딥러닝 모델은 실제 라벨과 가장 가까운 값이 예측되도록 훈련되어집니다. 이때 그 가까운 정도를 측정하기 위해 사용되는 것이 손실 함수(loss funciton)입니다. 오늘은 많이 사용되는 손실 함수들 중에 제가 직접 사용해본 것들에 대해 정리하고자 합니다. 

 

1. MSE(mean squared error)

MSE는 회귀(regression) 용도의 딥러닝 모델을 훈련시킬때 많이 사용되는 손실 함수입니다. 공식은 다음과 같습니다. 

 

$L = \frac{1}{2}\sum_{i=1}^{N}(y_i - t_i)^2$   ...(MSE)

 

여기서 $y_i$는 예측값이고 $t_i$는 실제값 또는 라벨을 의미합니다. 그리고 N은 훈련 샘플의 갯수로 보시면 됩니다. 

 

2. MAE(mean absolute error)

MAE는 MSE와 거의 비슷합니다. 에러 제곱의 평균이 아니라 에러 절대값의 평균을 구해줍니다. MAE도 회귀 용도의 딥러닝 모델을 훈련시킬때 많이 사용됩니다. 

 

$L = \frac{1}{2}\sum_{i=1}^{N}|y_i - t_i|$   ...(MAE)

 

3. binary crossentropy

만약 이진 분류기를 훈련하려면, binary crossentropy 손실함수를 사용하면 됩니다. 이진 분류기라는 것은 True 또는 False, 양성 또는 음성 등 2개의 클래스를 분류할 수 있는 분류기를 의미합니다. binary crossentropy는 다음과 같은 공식으로 쓸 수 있습니다. 

 

$L = -\frac{1}{N}\sum_{i=1}^{N}t_ilog(y_i)+(1-t_i)log(1-y_i)$   ...(binary crossentropy)

 

손실함수는 예측값과 실제값이 같으면 0이 되는 특성을 갖고 있어야 합니다. 예측값과 실제값이 모두 1로 같을 때($y_i = t_i = 1$) 손실함수값이 0이 되는지 한번 확인해보겠습니다. 참고로 이진 분류기의 경우 예측값이 0과 1사이의 확률값으로 나옵니다. 1에 가까우면 하나의 클래스(예를 들어, True 클래스)일 확률이 큰 것이고, 0에 가까우면 다른 하나의 클래스(예를 들어, False 클래스)일 확률이 큰 것이죠. 상황을 간단하게 하기 위해서 샘플이 하나만 있다고 가정하겠습니다.

 

$L = -[1log1 + (1-1)log(1-1)] = 0$

 

예측값과 실제값이 같은 경우에는 기대했던 대로 손실함수값은 0이 됩니다. 이번에는 예측값은 0, 실제값은 1인 상황에는($y_i = 0, t_i = 1$) 어떻게 되는지 살펴보겠습니다. 

 

$L = -[1log0 + (1-1)log(1-0)] = \infty $

 

양의 무한대가 됩니다. 그런데 일반적으로 확률이 0이 나오지는 않기 때문에 꽤 큰 수가 나온다고 생각하면 됩니다. 이러한 특성을 갖고 있기 때문에 binary crossentropy가 이진 분류에 적절히 사용될 수 있는 손실함수인 것입니다. 

 

4. categorical crossentropy

categorical crossentropy는 분류해야할 클래스가 3개 이상인 경우, 즉 멀티클래스 분류에 사용됩니다. 라벨이 [0,0,1,0,0], [1,0,0,0,0], [0,0,0,1,0]과 같이 one-hot 형태로 제공될 때 사용됩니다. 공식은 다음과 같습니다. 

 

$L = -\frac{1}{N}\sum_{j=1}^{N}\sum_{i=1}^{C}t_{ij}log(y_{ij})$   ...(categorical crossentropy)

 

여기서 C는 클래스의 갯수입니다. 

 

이번에도 샘플이 하나만 있다고 가정하고, 실제값과 예측값이 완전히 일치하는 경우의 손실함수값을 살펴보겠습니다. 0이 나와야합니다. 실제값과 예측값이 모두 [1 0 0 0 0]이라고 가정하겠습니다. 

 

$L = - (1log1 + 0log0 + 0log0 + 0log0 + 0log0) = 0$

 

계산했더니 0이 나왔습니다. 이번에는 실제값은 [1 0 0 0 0], 예측값은 [0 1 0 0 0]인 경우의 손실함수값을 구해보겠습니다. 

 

$L = - (1log0 + 0log1 + 0log0 + 0log0 + 0log0) = \infty $

 

계산했더니 양의 무한대가 나왔습니다. 일반적으로 예측값은 [0.02 0.94 0.02 0.01 0.01]와 같은 식으로 나오기 때문에 양의 무한대가 나올리는 없지만, 큰 값이 나오는 것만은 분명합니다. 이러한 특성을 가지고 있기 때문에 categorical crossentropy는 멀티클래스 분류 문제의 손실함수로 사용되기에 적합합니다. 

 

5. sparse categorical crossentropy

sparse categorical crossentropy 역시 멀티클래스 분류에 사용되는 손실함수입니다. 이름에 sparse 하나가 추가되었죠. 그러면 sparse categorical crossentropy가 사용되는 경우는 언제일까요? 바로 라벨이 0, 1, 2, 3, 4와 같이 정수의 형태로 제공될 때입니다. 

 

오늘 MSE, MAE, binary crossentropy, categorical crossentropy, sparse categorical crossentropy 손실함수에 대해서 알아봤습니다. 추후에 제가 다른 손실 함수들을 사용하는 일이 있게 되면 그때 글을 또 업데이트하도록 하겠습니다. 

 

 

관련글

[1] 손실함수(loss)와 평가지표(metric)란? 그 차이는?

[2] [정보이론] 정보량과 엔트로피의 의미

[3] [python] 피어슨 상관계수를 모델의 손실함수 또는 평가지표로 사용하려면

 

 

참고자료

[1] https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181a  

[2] https://github.com/keras-team/keras/issues/6444, "mathematical formula for categorical crossentropy"

[3] https://peltarion.com/knowledge-center/documentation/modeling-view/build-an-ai-model/loss-functions/categorical-crossentropy, peltarion, "Categorical crossentropy"

 

 

(이 글은 2021-2-14에 마지막으로 수정되었습니다.)