Tech カテゴリのイメージ

Top-pとは?候補数を固定せずに次のトークンを選ぶ

文章生成で候補を毎回「上位3個」に絞ると、上位1個に確率が集中している場面でも、複数の候補が拮抗する場面でも、同じ数だけ残る。Top-pは候補数の代わりに確率の合計へ基準を置く。確率が高い順に足し、合計が指定した pp 以上になる最小の候補集合から抽選する方法だ。Nucleus Samplingとも呼ばれる。

前の記事のTemperatureは候補の確率分布の偏りを変えた。Top-pは、その分布から抽選に参加できる候補を絞る。2つは同じ操作ではない。

0.8なら「確率が0.8以上の候補」ではない

説明用の5候補について、確率が順に 0.45, 0.30, 0.15, 0.07, 0.03 だとする。Top-pを 0.8 に設定すると、上から足した値は 0.45 → 0.75 → 0.90 となる。2個ではまだ届かないので、3個目まで残す。

残す候補の元の合計は0.90だ。抽選前にこの3個だけで合計1へ再正規化すると、およそ 0.500, 0.333, 0.167 になる。下位2個はこの抽選では選ばれない。Top-pの0.8は各候補の最低確率でも、選んだ候補が80%の確率で正しいという意味でもない。

確率の合計はしきい値をちょうど上回るとは限らない。最後に追加した候補の分だけ0.8を超えても、その候補は残す。

同じTop-pでも残る個数が変わる

次のコードは、確率の異なる2場面で同じTop-pを適用する。値は説明用に作った分布で、実在するモデルの予測値ではない。

def nucleus(probabilities, threshold):
if not 0 < threshold <= 1:
raise ValueError("threshold must be in (0, 1]")
ranked = sorted(
enumerate(probabilities),
key=lambda item: item[1],
reverse=True,
)
kept = []
mass = 0.0
for index, probability in ranked:
kept.append((index, probability))
mass += probability
if mass >= threshold:
break
normalized = [(index, round(probability / mass, 3))
for index, probability in kept]
return normalized, round(mass, 3)
for probabilities in (
[0.45, 0.30, 0.15, 0.07, 0.03],
[0.80, 0.10, 0.05, 0.03, 0.02],
):
chosen, mass = nucleus(probabilities, 0.8)
print(probabilities, "=>", chosen, "mass", mass)

実行結果:

[0.45, 0.3, 0.15, 0.07, 0.03] => [(0, 0.5), (1, 0.333), (2, 0.167)] mass 0.9
[0.8, 0.1, 0.05, 0.03, 0.02] => [(0, 1.0)] mass 0.8

最初の分布では3個、2番目では1個だけが残る。候補番号は元の配列の位置だ。どちらも同じしきい値0.8だが、分布が違えば抽選集合の大きさも変わる。これが固定個数を残すTop-kとの違いである。

このコードはすでに確率へ変換された配列を受け取る最小例だ。実装ではモデルのlogitsから確率を求め、低確率候補を除外して抽選する。Hugging Face Transformersの top_p も、確率を高い順に並べたとき合計がしきい値以上になる最小集合を残す設定として説明されている。

抽選しなければ効果が見えにくい

候補を絞ったあと、通常は残った分布からサンプリングする。常に最高確率のトークンだけを選ぶ貪欲法では、Top-pで下位候補を除外しても、この例の選択結果は変わらない。パラメータ名だけを設定しても、生成側でサンプリングが有効か確認する必要がある。

TemperatureとTop-pを組み合わせると、Temperatureで変えた分布をもとに、残る候補が決まる。ただし処理の順序や他の候補制約はライブラリ・サービスの実装に依存する。値だけを比べて別のサービスの出力が同じになるとは言えない。

候補を絞っても事実性は保証されない

Top-pは低確率の長い尾からの抽選を抑える手法であり、情報の正誤を検査する機構ではない。最も高い候補が誤っていれば、しきい値を下げてそこだけを残しても誤りは直らない。設定の効果を見るときは、語調や繰り返しだけでなく、同じ評価用入力で事実性や必要な制約も確認する。

原論文は、固定的なデコード方法で生じる単調な反復や、低確率の尾からのサンプリングによる品質低下を検討し、動的な候補集合を提案した。ここでの5候補の例はその仕組みの計算を示すもので、原論文の性能結果や特定モデルの推奨値を再現したものではない。

参照資料

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