softmax로 확률을 출력하고 싶은데
최종 출력값이 너무 커서
낮은 차수의 테일러 근사는 exp와 오차도 크고
overflow가 생길 수 있다는 단점도 존재
이를 해결하기 위해 입력 값들에
정상화 빔을 쏴서 해결할 수 있음
우선 softmax의 형태를 보면
요딴 모양이다
여기서 x값이 경우에 따라 500 1000 2000 이런식으로 커져버리면
overflow가 일어나고 테일러 근사 시 오차가 매우 크게 발생한다.
따라서 x값들 중 최댓값이 0되도록 정상화 빔을 쏴주자
x_list = [13, 2.257, 1.69, 169.9] 라면
실제 exp 값은 약
[442413.392009, ~~, ~~, 6.1183241e+73]
정도로 매우 커지며 overflow가 발생한다.
이 때, 정상화 빔을 쏘면
x_list_정상화 = [-156.9, -167.643, -168.21, 0]
이 된다.
이러면 값이 달라진다고 생각할 수 있는데
위에 softmax의 모양을 보면
분자 분모에 사이좋게 exp가 달려있어서
정상화 해준 만큼 소거되며 softmax 값에 영향을 끼치지 않는다는 것을 확인할 수 있다.
그러면 정상화된 리스트에서
매우 작은 애들은 0으로 근사하고 테일러 근사로 일정 범위 내의 아이들만 추출해 계산하면
overflow와 오차 걱정 없이 평화로운 stable softmax가 가능하다
제목에 적힌 소맥까지는 이해했음
이정도면 걍 프로그래밍 수준 아닌가