Self-Consistencyサンプリングとは、Self-Consistency手法において複数の推論パスを生成するための確率的デコーディングプロセスである。温度パラメータ(temperature)、top-k、top-pなどのサンプリング制御パラメータを適切に設定し、同一プロンプトから多様かつ質の高い推論経路を生成する。サンプル数nの選択は精度とコストのトレードオフであり、Wang et al.(2022)の実験ではn=10〜40で最良の費用対効果が得られた。
Self-Consistencyの核心は、単一の決定的な推論パスに依存せず、複数の確率的推論パスをサンプリングして集約する点にある。このサンプリングプロセスの品質がSelf-Consistency全体の性能を左右する。通常のLLM推論ではgreedy decoding(温度0)を用いて最も確率の高いトークンを逐次選択するが、Self-Consistencyでは意図的に温度を上げて(temperature > 0)サンプリングを行い、推論パスの多様性を確保する。
サンプリングの基本原理は、LLMの出力分布から独立に複数のサンプルを抽出するということである。各サンプルは異なるトークン選択の連鎖を経て、異なる推論ステップと最終回答を生成する。重要なのは、正しい回答に到達する推論パスが複数存在するという前提であり、これが多数決による精度向上の基盤となる。
温度パラメータはソフトマックス関数の鋭さを制御し、サンプリングの多様性を直接的に規定する。
P(token_i) = exp(logit_i / T) / Σ_j exp(logit_j / T)
ここでTが温度パラメータである。T→0でgreedy decoding(最大確率トークンのみ選択)、T→∞で一様分布(完全ランダム)に近づく。
| 温度 | 多様性 | 品質 | Self-Consistency適性 | 典型的用途 |
|---|---|---|---|---|
| 0.0 | なし(決定的) | 最高(単一パス) | 不適(パス多様性ゼロ) | 通常のCoT推論 |
| 0.1〜0.3 | 極低 | 高 | 低(多様性不足) | 軽微なバリエーション |
| 0.5 | 中程度 | 高 | 最適(多くのタスク) |
| 算術推論Self-Consistency |
| 0.7 | 中〜高 | 中〜高 | 良好 | 常識推論Self-Consistency |
| 1.0 | 高 | 中 | 可(ノイズ増加) | 創造的タスク |
| 1.5以上 | 極高 | 低 | 不適(ノイズ過大) | 実験的用途のみ |
Wang et al.(2022)の実験では、温度0.5がGSM8K(算術推論)で最良の結果を示し、温度0.7がStrategyQA(常識推論)で最良であった。タスクの特性に応じて温度を調整することが推奨される。
Self-Consistencyは温度サンプリング単体だけでなく、top-k や top-p(nucleus sampling)と組み合わせることで、サンプリング品質をさらに制御できる。
各ステップで確率上位k個のトークンのみを候補とし、その中からサンプリングする。低確率のノイズトークンを排除できるが、kの固定値がすべてのコンテキストに最適とは限らない。
累積確率がpを超えるまでのトークン集合からサンプリングする。確率分布の形状に適応的にトークン数が変化するため、top-kよりも柔軟である。
| タスク種別 | 温度 | Top-p | Top-k | サンプル数n |
|---|---|---|---|---|
| 算術推論(GSM8K等) | 0.5 | 0.95 | - | 10〜20 |
| 常識推論(StrategyQA等) | 0.7 | 0.90 | - | 10〜15 |
| 代数推論(AQuA等) | 0.5 | 0.95 | - | 15〜30 |
| 科学推論(ARC等) | 0.7 | 0.95 | - | 10〜20 |
| コード生成 | 0.8 | 0.95 | 50 | 10〜20 |
サンプル数nはSelf-Consistencyの精度と計算コストを直接制御する最も重要なハイパーパラメータである。
| サンプル数n | 精度(%) | 改善幅(vs greedy) | 相対コスト |
|---|---|---|---|
| 1(greedy) | 56.5 | - | 1× |
| 5 | 70.2 | +13.7 | 5× |
| 10 | 72.8 | +16.3 | 10× |
| 20 | 74.0 | +17.5 | 20× |
| 40 | 74.4 | +17.9 | 40× |
データから明らかなように、n=1→5で最大の精度ジャンプ(+13.7%)が発生し、n=10以降は収穫逓減が顕著となる。n=40ではn=10と比較して+1.6%の改善に留まり、コストは4倍に増加する。実用的にはn=5〜15が最適レンジである。
精度の改善は概ねlog(n)に比例する対数曲線を描く。これは、正解パスの確率が一定値pである場合、n個の独立サンプルのうち多数が正解となる確率が二項分布のCDFで表され、nの増加に伴い急速に1に収束するためである。
Self-ConsistencyのAPIコストはサンプル数nに線形に増加するため、コスト最適化が重要である。
| モデル | 入力単価 | 出力単価 | n=1コスト | n=10コスト | n=20コスト |
|---|---|---|---|---|---|
| GPT-4o | $2.50/1M | $10.00/1M | $0.004 | $0.043 | $0.086 |
| GPT-4o-mini | $0.15/1M | $0.60/1M | $0.0003 | $0.003 | $0.005 |
| Claude 3.5 Sonnet | $3.00/1M | $15.00/1M | $0.006 | $0.060 | $0.119 |
| Claude 3.5 Haiku | $0.80/1M | $4.00/1M | $0.002 | $0.016 | $0.032 |
| Gemini 1.5 Pro | $1.25/1M | $5.00/1M | $0.002 | $0.023 | $0.046 |
Self-Consistencyのn回のサンプリングは互いに独立であるため、完全な並列実行が可能である。非同期API呼び出し(asyncio/Promise.all等)を用いれば、レイテンシはn=1の場合とほぼ同等に抑えられる。ただし、APIのレートリミット(RPM/TPM)に注意が必要であり、大量のサンプリングではスロットリングが発生する可能性がある。
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI()
async def self_consistency(prompt, n=10, temperature=0.5):
tasks = [
client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
)
for _ in range(n)
]
responses = await asyncio.gather(*tasks)
answers = [extract_answer(r.choices[0].message.content) for r in responses]
return majority_vote(answers)
明確な正解が1つ存在するタスク(算術、形式論理、多肢選択)では温度0.5が安定的に高精度を示す。回答のバリエーションが許容されるタスク(常識推論、説明生成)や、問題の難易度が高く多様な推論アプローチが有効なケースでは温度0.7が良い。まず0.5で試し、多数決の一致度が低い(例: 10票中最多が3票)場合に0.7に上げるアプローチが実践的である。
理論的にはモデルの正解確率が50%を超える限り、nの増加に伴い精度は単調増加する。しかし実測では、n=20〜40以降で精度はほぼプラトーに達する。また、モデルの正解確率が50%以下のタスク(極めて困難な問題)では、サンプル数を増やしても改善せず、むしろ多数派の誤答に収束するリスクがある。
Anthropic APIのプロンプトキャッシュでは、キャッシュヒット時の入力トークンコストが90%削減される($3.00/1M → $0.30/1M)。Self-Consistencyではn回の呼び出しで同一のsystemプロンプトとfew-shot例が再利用されるため、2回目以降の呼び出しでキャッシュが効く。n=10の場合、入力コストの約81%が削減される計算となる(1回のフルコスト + 9回のキャッシュコスト)。