새소식

딥러닝

딥러닝에서 왜 목적함수로 MSE가 아닌 Cross Entropy를 사용할까?

  • -

▮ MSE의 단점

아래는 MSE(평균제곱오차)의 식이다.

$$ e = \frac{1}{2} \parallel y-o \parallel ^{2}_{2}  $$

목표로 하는 값 $ y $와 모델의 출력값 $ o $의 차이가 클수록 모델에게 주는 벌점($e$)도 커지는 것이 학습하는데 있어서 적합해보인다.

 

그러나 왜 딥러닝에서는 MSE를 사용하지 않을까?

 

예를 들어 입력이 1.5이고 출력값이 0인 샘플이 모델에 입력되었다고 가정하고, 아래에 다음과 같은 두 모델이 있다고 가정하자

1) $ \hat{y} = \sigma (0.4x + 0.5)  $  →  $ \hat{y} = 0.7503 $
2) $ \hat{y} = \sigma (1.9x + 3.0) $  →  $ \hat{y} = 0.9971 $

2번 모델이 원래 목표로 하는 값보다 차이가 더 크기 때문에 더 큰 벌점을 받아야 정상이다.

딥러닝에서는 loss를 줄이는 방향으로 weight와 bias를 업데이트하기 때문에, 이 업데이트에 사용되는 값이 벌점이다.
그리고 딥러닝에서는 gradient 값으로 weight와 bias를 업데이트하므로 gradient가 벌점이라고 생각할 수 있다.

 

$$ e = \frac{1}{2}(y-o)^2 = \frac{1}{2}(y-\sigma(wx+b))^2 $$

위 Loss를 weight와 bias로 각각 편미분하면 아래와 같은 gradient 식을 얻을 수 있다.

$ \frac{ \partial e}{ \partial w} = -(y-o)x \sigma '(wx+b) $
$ \frac{ \partial e}{ \partial b} = -(y-o) \sigma '(wx+b) $

1)의 결과
$ \frac{ \partial e}{ \partial w} = 0.2109 $
$ \frac{ \partial e}{ \partial b} = 0.1406 $

2)의 결과
$ \frac{ \partial e}{ \partial w} = 0.043 $
$ \frac{ \partial e}{ \partial b} = 0.0029 $

2번 식이  Loss가 더 큰데 gradient 값이 더 작은 현상이 발생하였다. 즉, 더 많이 틀린 상황에 더 낮은 벌점을 부과하게 되는 문제점이 발생한다.

물론 Loss가 더 큰 상황에 더 낮은 벌점을 부여하여도 어차피 gradient가 loss를 줄이는 방향으로 학습되기 때문에 Loss를 최소로 하는 목적 자체에는 언젠가 도달하겠지만 시간이 오래걸릴 것이다.

 

왜 이런 현상이 발생할까?

활성화함수(sigmoid를 사용했다고 가정)의 도함수는 입력값이 0일 때 가장 크고, 입력값이 커지거나 작아지면 0으로 수렴한다.

gradient 식을 보면 sigmoid의 도함수가 포함되어 있음을 알 수 있다. 
$$ \sigma'(wx+b) $$

$ wx+b $가 클 수록 gradient 값은 작아지기 때문에 위와 같은 현상이 발생하는 것이다.

 

Cross Entropy

$$ H(P,Q) = - \sum_xP(x)logQ(x) $$

$ P $는 정답 레이블, $Q $는 모델의 출력값이라고 가정하자.

정답 레이블이 0일 경우(y=0), 아래 식으로 통일할 수 있다.

$ P(0) = 1 - y            Q(0) = 1 - o $
$ P(1) = y                   Q(1) = o $

위 값을 토대로 Cross Entropy 식을 작성해보면 아래와 같다.

$$ e = -y log o + (1-y)log(1-o) $$

 

$y=1$일 때, $o=0.98$인 경우는 예측이 잘 된 경우이다.
이 때 cross entropy값은 0.0291로 매우 낮다.

반면 $y=1$일 때, $o=0.0001$이라면 예측이 잘 못된 경우이다.
이 때 cross entropy값은 13.28777로 크기 때문에 목적함수로서 적합함을 알 수 있다.

그렇다면 MSE의 느린 학습 문제를 Cross Entropy는 해결할 수 있을까?

$ \frac{\partial{e}}{\partial{w}} = -( \frac{y}{0}- \frac{1-y}{1-0}) \frac{\partial{o}}{\partial{w}} $
$ = -( \frac{y}{0}- \frac{1-y}{1-0})x\sigma'(z)  $
$ = -x( \frac{y}{0}- \frac{1-y}{1-0})o(1-o) $
$ = x(o-y) $

weight와 bias로 편미분한 gradient 식은 아래와 같다.

$ \frac{ \partial e}{ \partial w} = x(o-y) $
$ \frac{ \partial e}{ \partial b} = (o-y) $

아까 MSE를 계산할 때 사용한 같은 값들을 이용하여 계산해보면 다음과 같다.
1)의 결과

$ \frac{ \partial e}{ \partial w} = 1.1255 $
$ \frac{ \partial e}{ \partial b} = 0.7503 $

2)의 결과
$ \frac{ \partial e}{ \partial w} = 1.4957 $
$ \frac{ \partial e}{ \partial b} = 0.9971$

loss가 더 큰 2)에서 더 큰 gradient가 발생함을 확인할 수 있다!

 

 

728x90

'딥러닝' 카테고리의 다른 글

Inductive Bias  (0) 2023.04.07
Batch Normalization / Layer Normalization  (0) 2023.04.02
Automatic Mixed Precision  (0) 2022.08.01
Gradient Accumulation  (0) 2022.08.01
Keras Callback - ModelCheckpoint, ReduceLROnPlateau, EarlyStopping  (0) 2022.07.28
Contents