로그 공간에서 살기
로그-확률 합치기 시작하면 가끔 로그-확률을 결합 해야 함 — 예: 확률 합의 로그. Naive 한 () 는 가 매우 음수일 때 underflow. Fix: log-sum-exp.
Max 빼기가 지수를 sane 범위에 유지. 끝에 다시 더해 정답 회복. scipy.special.logsumexp 와 torch.logsumexp 가 처리.
왜 Softmax 가 사실 log-Softmax 변장
Softmax: . Naive 구현 = 매우 음수일 때 underflow. 모던 프레임워크가 먼저 빼 — log-sum-exp 와 같은 트릭.
log(softmax(x)) 필요하면 절대 np.log(softmax(x)) 로 계산 X. log_softmax(x) 직접 — 수치적으로 안정. PyTorch, NumPy/SciPy 가 제공.
"지수 합의 로그" 필요할 때마다 라이브러리 logsumexp 써. Naive 버전은 이론에선 맞고 float32 에선 틀림.
import numpy as np from scipy.special import logsumexp
logs = np.array([-1000, -1001, -1002])
m = np.max(logs) shifted = logs - m exp_terms = np.exp(shifted) s = np.sum(exp_terms) manual = m + np.log(s)
scipy_result = logsumexp(logs)
print("manual :", manual) print("scipy :", scipy_result) print("diff :", abs(manual - scipy_result))
출력
manual : -999.5923940355556
scipy : -999.5923940355556
diff : 0.0
언더플로우를 방지하려고 하는 기법인가보다. 에러값이 점점 작아질수록 중요한작업인듯,, 잘못하면 에러가있는데도 0으로 처리해버릴수있으니