Re Reference AI

技術

Seedとは

乱数シード

乱数生成の初期値。同じ値を指定することでLLMの出力サンプリング結果を再現できる

LLMデコーディング再現性

ひとことで言うと

AIの出力のランダムさを決める初期値。同じ値なら同じ結果を再現できる。

概要

Seed(乱数シード)とは、LLMがTemperatureTop-p等の設定に基づいて次のトークンをサンプリングする際に使う擬似乱数生成器の初期値。 コンピュータの乱数は特定の初期値(シード)から決定的に生成される擬似乱数であるため、他のパラメータと入力プロンプトが同一であれば、同じシード値を指定することで出力を再現しやすくなる。 テストやデバッグ、実験結果の再現性確保などの用途で用いられる。 GPU上の浮動小数点演算には非決定的な要素が残る。そのため、同じシード値を指定しても、実装やハードウェア構成によっては出力が常に一致するとは限らない。 APIによってはシード指定機能自体を提供していない場合もある。また、内部実装の変更により同一シードでも出力が変わりやすく、再現性を厳密に求める用途では注意が必要。

背景

Temperature等による確率的サンプリングを行うLLMは、同じ入力でも実行のたびに異なる出力を返しうる。 この非決定性は創造性の面では有用だが、テストやデバッグ、研究の再現性という観点では障害になる。 Seedを固定できる仕組みは、この非決定性を制御する手段として提供されている。

歴史

2023年11月: OpenAIがChat Completions APIに再現可能な出力(reproducible outputs)機能として`seed`パラメータと`system_fingerprint`を追加し、同じ設定・入力であれば出力を再現しやすくする仕組みを公式に提供した。

アーキテクチャ

内部的には、擬似乱数生成器(PRNG)の初期状態をシード値によって固定し、TemperatureTop-p等に基づく確率的なトークン選択をこの乱数列に従って行う。 シードと全ての生成パラメータ・入力が同一であれば、同じ乱数列をたどり同じトークン列が選ばれやすくなる。

コード例

seedを指定して出力の再現性を高める

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "サイコロを1回振った結果を教えてください。"}],
    seed=42,
    temperature=0.7,
)

print(response.choices[0].message.content)
print(response.system_fingerprint)  # バックエンド構成が変わったかの確認に使える

利点

  • 同じ設定・シードであれば出力を再現しやすくなり、デバッグやテストに有用
  • 実験結果の比較・検証がしやすくなる
  • 他のサンプリングパラメータを変更した際の影響を比較しやすくなる

欠点

  • モデルの更新やインフラ(GPU構成・バッチ処理等)の違いにより、同じシードでも同一の出力が保証されるとは限らない
  • Temperatureが0に近い場合はシードの影響がほぼ無くなる
  • 全てのAPI・モデルがシード指定に対応しているわけではない

比較

  • TemperatureSeedはTemperature等のサンプリングパラメータと組み合わせて使うことで、確率的な出力を再現可能にする

関連用語

TemperatureLLM

よくある質問

Seedを指定すれば必ず同じ出力になる?

多くの場合再現性が高まるが、モデルの更新やサーバー側の実行環境の違いにより、完全な再現が保証されるとは限らない。

system_fingerprintとは?

OpenAIのAPIが返す、モデルの実行環境(バックエンド構成)を示す識別子。 この値が変化した場合、同じシードを指定していても出力の一致は保証されなくなる、という手がかりになる。

参考文献

関連Zenn記事