https://gregorygundersen.com/blog/2020/02/09/log-sum-exp/
한글 자료 중에서 LogSumExp 의 정의와 사용 이유를 와닿게 작성한 포스팅이 없어서 위 글을 의역하기로 했다. 매우 훌륭하니, 영어를 잘 하신다면 꼬옥 읽어보기를 추천한다.
왜 저런 걸 해야...해?
import numpy as np
x = np.array([1000, 1000, 1000])
print(np.exp(x))
# array([inf, inf, inf])
- 필요성을 느끼려면 직접 구해보는 게 최고다.
- 나한테 벡터 X가 있다. 저 벡터를 softmax 연산을 구하기 위해 exp 를 적용하니까 inf 가 떴다.
- 컴퓨터가 표현할 수 있는 숫자의 한계를 넘었기 때문이다.
- 자, 그러면 컴퓨터한테는 이런 연산을 안 시킬 건가? 그럴 순 없다. 그래서 인간들이 이런 경우를 미리 따져둔다.
공식을 통해 이해하다
Softmax
- 매우 유명한 식이지만 간단히 말하자면, 확률 분포로 변경하기 위해 쓰인다.
- LogSumExp 설명하는데 필요해서 불렀다.
LogSumExp
- LogSumExp 의 정의다.
- 솔직히 Log 먼저 하고 Sum 하고 마지막에 Exp 할 줄 알았는데, Exp 부터 한다.
공식 유도
- Softmax 공식에서부터 출발한다.
- 양변에 log 를 취하면 위와 같아진다.
- 좌우항 서로 교환하고 다시 exp 취하다보면 맨 아래 식이 나온다.
- 이때 확률 p 는 어디서 많이 본 식의 형태로 정리된다.
- 그렇다, 바로 LSE 공식이 보인다.
- '아, LSE는 softmax 연산에서 많이 쓰이겠구나.' 정도만 받아들여도 충분하다. 맨날 천날 softmax 계산하는 거야 딥러닝하는 사람이라면 모를 수가 없다.
- 다만, 제일 위에서 언급했던 것처럼 이제 overflow 나 underflow 가 발생하는 경우를 해결해야 한다. 보통 그런 문제를 해결해야 trick 이라고 불릴 법하니까.
LogSumExp Trick
- LSE의 값을 y 라고 정의하고 식을 이리저리 전개하다보면 마지막에 도달한다
- 마지막에 C가 등장한다. 그리고 (x - c) 역시 볼 수 있다.
- 이미 눈치챈 사람도 있겠지만, x 중에서 가장 큰 값을 C로 두면 된다.
- 그러면 overflow가 발생할 일이 없다. 이걸 trick 이라고 부른다.
- 결과적으론 값이 동일하게 계산되지만, 오버플로우를 피했다.
다시 보는 예제
def logsumexp(x):
c = x.max()
return c + np.log(np.sum(np.exp(x - c)))
>>> logsumexp(x)
1001.0986122886682
>>> np.exp(x - logsumexp(x))
array([0.33333333, 0.33333333, 0.33333333])
다시 한번 이렇게 좋은 글을 써주신 Gregory Gundersen 에게 감사를 전한다.
https://github.com/gwgundersen
'NLP > 용어정리' 카테고리의 다른 글
[용어정리] self-BLEU (0) | 2024.07.23 |
---|---|
[용어정리] Dual Softmax Loss (0) | 2024.02.02 |
[용어정리] SC: Self-Consistency (1) | 2024.01.09 |
[용어정리] MSE loss vs Cross Entropy loss (0) | 2023.04.11 |
[용어정리] reparameterization trick (0) | 2023.01.03 |