Tech カテゴリのイメージ

Temperatureとは?次トークンの選び方を確率で確かめる

同じ入力を与えたのに、LLMの返答が毎回少し違うことがある。モデルが語彙上の候補へ付けた点数を、そのまま最大値だけで決めず、確率に従って次のトークンを抽選するからだ。Temperatureは、抽選前の確率分布の偏りを調整する。

前の記事では、logits [2, 1, 0] をsoftmaxへ通すと、3候補の確率がおよそ [0.665, 0.245, 0.090] になる例を扱った。ここでは同じ点数のままTemperatureだけを変え、何が変わり、何が変わらないかを見る。

logitsを割ってからsoftmaxに入れる

Temperatureを TT とすると、候補 ii の確率は次の形で計算できる。

pi(T)=exp⁡(zi/T)∑jexp⁡(zj/T),T>0p_i(T)=\frac{\exp(z_i/T)}{\sum_j\exp(z_j/T)},\qquad T>0

ziz_i は候補のlogitだ。T=1T=1 なら通常のsoftmaxと同じになる。0<T<10<T<1 なら点数の差が拡大し、高得点の候補に確率が集まる。T>1T>1 なら点数の差が縮まり、低得点の候補にも確率が配られる。

ここで変わるのは確率の配分であり、正のTemperatureだけではlogitsの大小関係は入れ替わらない。最も高い候補は同じでも、抽選時に他の候補が選ばれる頻度は変わる。

3候補で確率を計算する

次のコードは標準Pythonだけで動く。例のlogitsは説明用に手で決めた値で、実在するLLMの出力ではない。

from math import exp
logits = [2.0, 1.0, 0.0] # 候補: 猫、犬、。
def softmax_temperature(logits, temperature):
if temperature <= 0:
raise ValueError("temperature must be positive")
scaled = [value / temperature for value in logits]
peak = max(scaled)
weights = [exp(value - peak) for value in scaled]
total = sum(weights)
return [value / total for value in weights]
for temperature in (0.5, 1.0, 2.0):
probs = softmax_temperature(logits, temperature)
values = ", ".join(f"{p:.3f}" for p in probs)
print(f"T={temperature:.1f}: {values} (sum={sum(probs):.3f})")

実行結果:

T=0.5: 0.867, 0.117, 0.016 (sum=1.000)
T=1.0: 0.665, 0.245, 0.090 (sum=1.000)
T=2.0: 0.506, 0.307, 0.186 (sum=1.000)

T=0.5T=0.5 では最有力の「猫」が約86.7%になり、T=2T=2 では約50.6%まで下がる。どちらも各候補の確率は0以上、合計は1だ。peak を引くのは指数計算の数値的なあふれを避けるためで、分布自体は変えない。

Temperatureが低いだけでは出力は固定されない

Temperatureは抽選で使う確率を調整するパラメータだ。低くしても、最上位以外の確率は一般に0にならない。この例の T=0.5T=0.5 でも「犬」は約11.7%、「。」は約1.6%残る。抽選を続ければ選ばれる可能性がある。

一方、常に最大確率の候補を選ぶ貪欲法では、この3候補の順位はTemperatureを変えても同じなので、選ばれるのは毎回「猫」だ。Hugging Face Transformersの生成設定でも、do_sample=False は貪欲選択、do_sample=True はサンプリングを選ぶ。Temperatureの数値だけで「ランダム生成になる」とは言えない。

T=0T=0 は上記の割り算に入れられない。APIによっては「0」を特別に扱う場合があっても、それをこの式へ代入してよいわけではない。利用するサービスの仕様を別途確認する。

正確さのつまみではない

Temperatureを下げれば正しい答えになる、という理解は危うい。モデルが誤った候補を高く採点していれば、その誤った候補へ確率を集中させるだけだ。逆に高くすれば候補は散らばるが、事実確認の仕組みが追加されるわけではない。

文章の変化には、TemperatureのほかにTop-pやTop-kの候補制限、モデルの設定、入力文脈なども関わる。実際のサービスでは利用できるパラメータや組み合わせが異なる。まずは「モデルのlogits」「確率の調整」「候補からの選択」を別の段階として捉えると、設定の意味を見失いにくい。

次はTop-pで候補集合をどのように絞るかを見る。Temperatureが確率の偏りを変えるのに対し、Top-pは抽選に残す候補の範囲を決める。

参照資料

生成AI・機械学習講座の一覧へ