> Result that goes infinity
- 5/0.0000000 ... 001 = Inf, Related with "Exponential"
- log(0.000000000 ... 001) == Inf, Related with "Log"
> Instability in Loss-Related Items
- Softmax
- Multiple classification problems / Cross Entropy Log-Softmax
- Binary Classification Problems / Binary Cross Entropy
- NaN (Not a Number)
> logit의 개념
> Softmax만 사용할 때 (cross entropy loss는 사용하지 않음)
- exponential을 수행하는 과정에서 문제가 생긴다.
1. numerator(분자)인 single term of exponential에서, 일반적으로 e의 709승까지는 어찌어찌 표현한다 해도, e의 710부터는 Inf(무한 상수)로 표시되어버린다.
2. 이뿐만 아니라, denominator(분모)인 summation of exponential은 더 Numerical Instability의 위험이 있다고 생각할 수 있다.
- 물론 이 과정에서 Normalization을 수행함으로써 logit을 줄여 이러한 risk를 줄일 수 있다.
- Batch Normalization (Normalize across batch dim.)
- Layer Normalization (Normalize across feature dim.)
- 하지만 주로 denominator(분모)인 summation of exponential을 계산하는 과정에서 지수가 700만 넘어가도 계산이 되지 않으므로 제한이 많다.
- 그래서 Naive하게 Softmax를 구현해보면 다음과 같고, softmax([1000, 2000, 3000]) 을 호출하면 NaN을 리턴한다.
def softmax(x):
exps = np.exp(x)
return exps/np.sum(exps)
(Inf + Inf = NaN)
- 이 Softmax를 Numerical stable하도록 Implement 하는 방법은 무엇일까?
더보기
<최대 지수상수 Z = exponential 중 최대값>
- Softmax에 exp(-Z)를 곱하는 방법
- numerator는 기존 numerator가 Z인 경우 1 (Z-Z=0, 0을 지수로 하는 경우), 그 외의 경우 음수의 지수가 된다.
- denominator는 모든 지수를 더하기 때문에, Z인 지수를 더할 때 1을 더하게 되므로 최소 1이 넘지만, 그래도 음수의 지수를 가지는 exponential을 더하게 되므로 값이 현저히 낮아진다. (overall 1은 넘는다)
- 전체적으로 graph를 shift하는 개념이기 때문에, 값의 분포에 영향을 미치지는 않으므로 Softmax의 의미를 잃지 않으면서 Numerical stability를 보장하는 방법이다.
이를 코드로 구현하면 아래와 같고, 아까와 같이 stable_softmax([1000, 2000, 3000])을 호출하면, [0, 0, 1]이 리턴된다.
def stable_softmax(x):
shift_x = x - np.max(x)
exps = np.exp(shift_x)
return exps/np.sum(exps)
그리고 Deep Learning Library에는 이미 이런 방식으로 구현되어 있다.
> Softmax와 Cross Entropy Loss를 같이 사용할 때
- stable한 Softmax를 거쳤다고 해도, 이후 Cross Entropy Loss에 이 값이 들어가면 어떤 결과가 나올까?
- 앞의 접은 글에 있던 stable_Softmax 를 사용해 (0., 0., 1.) 이라는 결과를 얻었고, 이를 Cross Entropy Loss에 넣으면 어떤 문제점이 발생할까?
"Log 함수는 값이 0에 가까울수록 기하급수적으로 커진다!"
즉, log가 붙은 수식에서 Numerical Instability가 발생할 여지가 크다는 소리다.
그렇다면 softmax + log가 모두 risky part인데, 어떻게 이를 해결할까?
더보기
softmax, Cross Entropy를 따로따로 계산하려 하지 말고,
logit과 최대상수 Z(아래 식에서는 c)를 이용해 한 번에 계산하자!
이를 LogSumExp Trick이라고도 한다.
그래서 classification model에서 logit에 softmax를 씌우지 않은 상태로 stable log softmax를 호출하는 방식으로 이를 해결하기도 한다.
또는 logit에 LogSoftmax을 먹여, Negative Log Likelihood Loss를 호출하는 방식도 numerical stable하다고 한다.