곱셈을 덧셈으로 옮기기
양수 에 대해 로그의 곱 규칙은
이야. 지수법칙 를 거꾸로 읽은 결과지. 확률을 많이 곱하는 계산에서는 이 규칙 덕분에 곱 전체 대신 로그확률의 합을 다룰 수 있어.
자료형에 따라 달라지는 밑돌림
예를 들어 이야. float32가 표현할 수 있는 가장 작은 양수보다 훨씬 작아서 0으로 밑돌지만, float64에서는 아직 0이 아닌 수로 표현돼. “컴퓨터가 모두 포기한다”가 아니라 자료형의 표현 범위를 넘으면 밑돌림이 생기는 거야.
로그 공간에서는 을 저장해. 이 값은 float32에서도 무리 없이 표현돼. 원래 확률이 꼭 필요할 때 다시 지수화할 수 있지만, 그 순간 결과가 자료형 범위 밖이면 역시 0이 될 수 있어. 그래서 비교·최적화·합산을 가능한 오래 로그 공간에 두는 거야.
로그우도가 등장하는 곳
- 최대우도추정: 관측별 확률의 곱을 최대화하는 대신 로그확률의 합을 최대화해.
- 교차엔트로피: 원-핫 분류에서는 정답 클래스의 음의 로그확률과 이어져.
- 언어모델: 다음 토큰들의 음의 로그우도를 더해 학습 목표를 만들고, 평균 로그손실에서 perplexity도 계산해.
확률의 긴 곱은 로그확률의 합으로 바꿔. 같은 수학을 더 넓은 수치 범위에서 다룰 수 있어.
import numpy as np
방법 1
x = np.prod(np.full(1000, 0.5)) print(x)
방법 2
y = np.exp(1000 * np.log(0.5)) print(y)
비교
print(x == y)
첫번째 방법에서는 확률을 계속 곱하기 때문에 언더플로우가 나버려서 0이되어버림