はじめに
チャットで生成AIを使っているとき、同じプロンプトを与えても全く違う回答になることがあります。というより、ほとんど別の表現になることが多いですね。
生成AIではシード値(seed)というものがあります。シード値は乱数の初期状態を固定し、同一の前提が揃えば出力の再現性を担保します。逆にシード値を変えると探索空間が変わり、LLMや拡散モデルは異なる答えや画像を生成します。
本稿では、同一シードが効く条件と、他パラメータとの関係を実務目線で整理します。
1. シード値とは何か(課題の定義)
- 定義:乱数生成器の初期状態(初期化ベクトル)。確率的処理の起点を決める値
- 同じになるもの:同一モデル・同一前提では、同一のノイズ列やサンプリング経路が選ばれ、出力が再現しやすくなる
- どこに効くか:
- LLM:温度サンプリングやトップP/トップKの抽選に使われる乱数
- 拡散モデル:初期ノイズ生成と各ステップのノイズ注入
- 学習/前処理:データシャッフルやデータ拡張の乱数
- シードだけでは足りない:モデル/トークナイザ/サンプラ/ステップ数/CFG/解像度/初期画像/ドライバ等が違えば、同一seedでも結果は変わる
- よくある誤解:
- 「seed=品質」ではない(品質はプロンプト/モデル/パラメータ設計に強く依存)
- seedを変えれば必ず全く別物になるとは限らない(他条件が強ければ類似度は高い)
- 実務の扱い:
- ベースラインは固定seedで記録(実験IDとともにJSON/YAMLへ保存)
- 探索はseedスイープで多様性を確保(LLMは温度スイープも併用)
- 並列処理や複数GPUでは非決定性が混ざるため、計測方針を明記
- seedの決め方:任意の整数でよい。ツールの流儀(例:-1はランダム)に従い、採用値はログへ残す
2. 仮説の提示と根拠
仮説
シード値と確率的パラメータを固定し処理系を同一にすれば、生成AIは同じ(または極めて近い)出力を再現できる。
根拠・データ
- LLM:temperature=0 top_p=1 top_k未使用 頻度/出現ペナルティ固定
- 画像生成(拡散):サンプラ種別 サンプリングステップ数 CFGスケール 解像度とリサイズ方法 初期画像とstrengthを固定
- 実装:乱数源を明示的に固定(Python NumPy PyTorch CUDA など)
- 実行環境:モデルとトークナイザのバージョン ハードウェア/ドライバ バッチングを固定
- 結果:条件を揃えた再実行でビット等価または視覚的に同等の結果を観測
代替案とリスク
- 再現性 vs 多様性
- 決定性(determinism) vs スループット
- 単GPU vs 複数GPUでの非決定性
- 量子化/最適化の差による微妙な出力差
- サンプラ/スケジューラ変更に伴う互換性の崩れ
意思決定は評価軸を明示し、可逆と不可逆を区別して最適化します。
3. 実装または具体策
実装手順を具体化し、原則へ一般化します。
- 具体:LLMで再現性を担保する設定の最小セット
- 同一モデルとトークナイザ
- 同一プロンプトとシステム指示
- temperature=0 top_p=1 top_k未使用
- 最大トークンと停止語を固定
- 具体:拡散モデルでの固定
- サンプラ種別を固定(例:Euler a DDIM などのいずれか一つ)
- num_inference_steps CFGスケール 解像度 初期画像とstrengthを固定
- ノイズ生成に同一seedを渡す
- 具体:代表的な乱数固定のコード断片
# Python / NumPy / PyTorch の乱数固定例
import os, random
import numpy as np
import torch
seed = 42
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
os.environ["PYTHONHASHSEED"] = str(seed)
# Diffusers(Stable Diffusion)の例
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5").to("cuda")
g = torch.Generator(device="cuda").manual_seed(42)
image = pipe(
"a photo of a cat",
num_inference_steps=30,
guidance_scale=7.5,
generator=g,
).images[0]
image.save("cat.png")
- 抽象:原則の一般化
- 再現性は「乱数 初期条件 アルゴリズム 実行環境」の4点セットで決まる
- 多様性はseedや確率的パラメータを動かすことで得る
- まず再現性を固定し その上で探索範囲を段階的に広げる
4. 再検証と評価
再検証
小規模な固定プロンプトセットを用い、シード値のみを変えた場合と、その他パラメータを変えた場合の差分を比較します。差分メトリクスを定義し、意図通りに多様性/再現性が制御できているかを確認します。
観点(THINK HARDER)
- ロジカル:同一シードで出力がズレる前提と原因の列挙
- クリティカル:非決定性を許す箇所の境界と影響を洗い出し
- ラテラル:画像生成はseedスイープ、LLMは温度スイープなど手法を切替
- システム思考:バッチング、キャッシュ、スループット最適化が再現性へ与える影響のループ
- ステークホルダー:開発・品質保証・運用の観点でseed取り扱いの要件整合
5 Whys
- なぜ1:同じシードなのに結果が変わった
- なぜ2:実行環境やライブラリのバージョンが異なった
- なぜ3:サンプラやスケジューラ、実装の差分があった
- なぜ4:ドライバ更新や最適化で非決定化が入った
- なぜ5:再現性要件と運用ルールが明文化されていなかった
根本的な原因に近づくほど再現性のある対策に変換できます。
示唆・次のアクション
- 検証用にseedと設定をJSONに保存
- 本番推論はseed固定で品質安定、探索はseedスイープで多様性確保
- 乱数と環境の固定手順をリーダブルに標準化
- 再現不可の要因を運用ルールに明記(動的バッチ、ドライバ更新、量子化差)
おわりに
シード値は「同じ条件で同じ結果」を実現するための取扱説明書の要です。まず再現性を固定しその上でseedや確率的パラメータを計画的に動かすことで、多様性と品質の両立が可能になります。次の一手として、プロジェクトの標準seedと固定手順を明文化し小さな再現実験を自動化しましょう。