Loading [MathJax]/jax/output/CommonHTML/jax.js

새소식

딥러닝

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

  • -

▮ MSE의 단점

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

e=12yo22

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

 

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

 

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

1) ˆy=σ(0.4x+0.5)  →  ˆy=0.7503
2) ˆy=σ(1.9x+3.0)  →  ˆy=0.9971

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

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

 

e=12(yo)2=12(yσ(wx+b))2

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

ew=(yo)xσ(wx+b)
eb=(yo)σ(wx+b)

1)의 결과
ew=0.2109
eb=0.1406

2)의 결과
ew=0.043
eb=0.0029

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

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

 

왜 이런 현상이 발생할까?

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

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

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

 

Cross Entropy

H(P,Q)=xP(x)logQ(x)

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

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

P(0)=1yQ(0)=1o
P(1)=yQ(1)=o

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

e=ylogo+(1y)log(1o)

 

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

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

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

ew=(y01y10)ow
=(y01y10)xσ(z)
=x(y01y10)o(1o)
=x(oy)

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

ew=x(oy)
eb=(oy)

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

ew=1.1255
eb=0.7503

2)의 결과
ew=1.4957
eb=0.9971

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

 

 

728x90
Contents