
softmax가 exp(logit / T)인데 T=0이면 나누기 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 설정과 조합해서 별도의 처리를 할 수도 있다.
Logit 값이 이라고 하자.
이라면,
이라면,
정도로 분포가 뾰족해진다
이라면,
정도로 완전완전 뾰족뾰족해진다
그래서 로 보내는 것은 사실상 로 수렴한다.
Temperature = 0은 편의상 greedy decoding 이라고 정의해 사용하는 것!
와 는 엄밀히 다르다.
수학적으로 undefined
최대 logit에 확률이 몰리는 분포가 된다
Logit이 인 경우
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 → 첫 번째 토큰
일 때는 평평해지고, 일 때는 뾰족해지고, 이면 거의 one-hot이 된다.
T를 0으로 만들지 않고, 0보다 큰 값들로 점점 0에 가깝게 만든다. 0⁺의 +는 0의 오른쪽, 즉 양수 쪽에서 접근한다는 뜻
중요한 건 T=0을 실제로 대입하는 게 아니라는 것
temperature라는 개념과 이름은 통계물리학에서 가져왔다 !