ZeroDivisionError: Temperature is 0

Eunbin Park·2026년 9월 5일
post-thumbnail

softmax가 exp(logit / T)인데 T=0이면 나누기 0 아닌가?

이런 일은 일어나지 않는다.

왜??

Temperature Softmax

Pi=exp(zi/T)jexp(zj/T)P_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}

T=0T = 0를 대입하면 zi/0z_i/0 이 된다. 그러므로 순수하게 이 식을 구현한다면 실제로 에러가 나는 건 맞다 !

LLM API에서의 temperature=0은 진짜로 softmax식에 0을 넣는 게 아니다 !

# 이것은 예시일 뿐! 실제 이렇게 동작하지 않음!
if temperature == 0:
    next_token = argmax(logits)
else:
    probs = softmax(logits / temperature)
    next_token = sample(probs)

→ temperature softmax를 계산하지 않고 가장 logit이 큰 토큰을 바로 선택하는 방식이다.

단! 이는 API/라이브러리 구현마다 다를 수 있다. 어떤 구현은 temperature=0을 greedy decoding으로 특별 처리하고, 어떤 구현은 아주 작은 epsilon으로 clamp하거나, sampling 설정과 조합해서 별도의 처리를 할 수도 있다.


Temperature가 줄어들 때의 확률의 변화

Logit 값이 [3,2,1][3, 2, 1] 이라고 하자.

T=1T=1 이라면,

Softmax([3,2,1])Softmax([3, 2, 1])
[0.665,0.245,0.090][0.665, 0.245, 0.090]

T=0.5T=0.5 이라면,

[6,4,2][6, 4, 2]
[0.867,0.117,0.016][0.867, 0.117, 0.016]

정도로 분포가 뾰족해진다

T=0.1T=0.1 이라면,

[30,20,10][30, 20, 10]
[0.99995,0.00005,0][0.99995, 0.00005, 0]

정도로 완전완전 뾰족뾰족해진다

그래서 T0+T \rightarrow 0^+ 로 보내는 것은 사실상 argmax(z)argmax(z) 로 수렴한다.

Temperature = 0은 편의상 greedy decoding 이라고 정의해 사용하는 것!

엄밀히 따져보쟈

T=0T = 0T0+T \rightarrow 0^+는 엄밀히 다르다.

T=0T = 0

softmax(z/0)softmax(z/0)

수학적으로 undefined

T0+T \rightarrow 0^+

limT0+softmax(z/T)\lim_{T \to 0^+} \mathrm{softmax}(z/T)

최대 logit에 확률이 몰리는 분포가 된다

Logit이 [10,9,8][10,9,8] 인 경우

T = 2.0[0.51, 0.31, 0.19]
T = 1.0[0.67, 0.24, 0.09]
T = 0.5[0.87, 0.12, 0.02]
T = 0.1[~1.0, ~0, ~0]
T → 0    →  argmax → 첫 번째 토큰

T>1T > 1 일 때는 평평해지고, 0<T<10 < T < 1 일 때는 뾰족해지고, T0+T \rightarrow 0^+ 이면 거의 one-hot이 된다.

T0+T \rightarrow 0^+

T를 0으로 만들지 않고, 0보다 큰 값들로 점점 0에 가깝게 만든다. 0⁺의 +는 0의 오른쪽, 즉 양수 쪽에서 접근한다는 뜻

중요한 건 T=0을 실제로 대입하는 게 아니라는 것

알쓸신잡!

temperature라는 개념과 이름은 통계물리학에서 가져왔다 !

0개의 댓글