▮ MSE의 단점
아래는 MSE(평균제곱오차)의 식이다.
e=12∥y−o∥22
목표로 하는 값 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(y−o)2=12(y−σ(wx+b))2
위 Loss를 weight와 bias로 각각 편미분하면 아래와 같은 gradient 식을 얻을 수 있다.
∂e∂w=−(y−o)xσ′(wx+b)
∂e∂b=−(y−o)σ′(wx+b)
1)의 결과
∂e∂w=0.2109
∂e∂b=0.1406
2)의 결과
∂e∂w=0.043
∂e∂b=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)=1−yQ(0)=1−o
P(1)=yQ(1)=o
위 값을 토대로 Cross Entropy 식을 작성해보면 아래와 같다.
e=−ylogo+(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는 해결할 수 있을까?
∂e∂w=−(y0−1−y1−0)∂o∂w
=−(y0−1−y1−0)xσ′(z)
=−x(y0−1−y1−0)o(1−o)
=x(o−y)
weight와 bias로 편미분한 gradient 식은 아래와 같다.
∂e∂w=x(o−y)
∂e∂b=(o−y)
아까 MSE를 계산할 때 사용한 같은 값들을 이용하여 계산해보면 다음과 같다.
1)의 결과
∂e∂w=1.1255
∂e∂b=0.7503
2)의 결과
∂e∂w=1.4957
∂e∂b=0.9971
loss가 더 큰 2)에서 더 큰 gradient가 발생함을 확인할 수 있다!