AI・機械学習
上級

Self-Consistencyサンプリング(セルフコンシステンシーサンプリング)

Self-Consistencyサンプリングとは、Self-Consistency手法において複数の推論パスを生成するための確率的デコーディングプロセスである。温度パラメータ(temperature)、top-k、top-pなどのサンプリング制御パラメータを適切に設定し、同一プロンプトから多様かつ質の高い推論経路を生成する。サンプル数nの選択は精度とコストのトレードオフであり、Wang et al.(2022)の実験ではn=10〜40で最良の費用対効果が得られた。

0 回閲覧
0 いいね

Self-Consistencyにおけるサンプリングの役割

Self-Consistencyの核心は、単一の決定的な推論パスに依存せず、複数の確率的推論パスをサンプリングして集約する点にある。このサンプリングプロセスの品質がSelf-Consistency全体の性能を左右する。通常のLLM推論ではgreedy decoding(温度0)を用いて最も確率の高いトークンを逐次選択するが、Self-Consistencyでは意図的に温度を上げて(temperature > 0)サンプリングを行い、推論パスの多様性を確保する。

サンプリングの基本原理は、LLMの出力分布から独立に複数のサンプルを抽出するということである。各サンプルは異なるトークン選択の連鎖を経て、異なる推論ステップと最終回答を生成する。重要なのは、正しい回答に到達する推論パスが複数存在するという前提であり、これが多数決による精度向上の基盤となる。

温度パラメータ(Temperature)の制御

温度パラメータはソフトマックス関数の鋭さを制御し、サンプリングの多様性を直接的に規定する。

温度の数学的定義

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(常識推論)で最良であった。タスクの特性に応じて温度を調整することが推奨される。

Top-k / Top-p サンプリングとの組み合わせ

Self-Consistencyは温度サンプリング単体だけでなく、top-k や top-p(nucleus sampling)と組み合わせることで、サンプリング品質をさらに制御できる。

Top-k サンプリング

各ステップで確率上位k個のトークンのみを候補とし、その中からサンプリングする。低確率のノイズトークンを排除できるが、kの固定値がすべてのコンテキストに最適とは限らない。

Top-p(Nucleus)サンプリング

累積確率がpを超えるまでのトークン集合からサンプリングする。確率分布の形状に適応的にトークン数が変化するため、top-kよりも柔軟である。

組み合わせ推奨設定

タスク種別温度Top-pTop-kサンプル数n
算術推論(GSM8K等)0.50.95-10〜20
常識推論(StrategyQA等)0.70.90-10〜15
代数推論(AQuA等)0.50.95-15〜30
科学推論(ARC等)0.70.95-10〜20
コード生成0.80.955010〜20

サンプル数(n)と精度のトレードオフ

サンプル数nはSelf-Consistencyの精度と計算コストを直接制御する最も重要なハイパーパラメータである。

nと精度の関係(GSM8K, PaLM-540B)

サンプル数n精度(%)改善幅(vs greedy)相対コスト
1(greedy)56.5-1×
570.2+13.75×
1072.8+16.310×
2074.0+17.520×
4074.4+17.940×

データから明らかなように、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に線形に増加するため、コスト最適化が重要である。

API別コスト試算(1問あたり、平均入力500トークン・出力300トークン)

モデル入力単価出力単価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

コスト最適化テクニック

  1. 段階的サンプリング: まずn=5でサンプリングし、多数決が明確(例: 5票中4票以上一致)なら終了。不明確な場合のみ追加サンプリングを行う「適応的Self-Consistency」。
  2. 小型モデルの活用: GPT-4o-miniやClaude 3.5 HaikuなどでSelf-Consistency(n=20)を実行するコストは、GPT-4oの単一推論(n=1)と同等以下。小型モデル×Self-Consistencyが大型モデル×greedyを上回るケースがある。
  3. バッチAPI活用: OpenAI Batch APIやAnthropic Message Batches APIを利用すると50%のコスト削減が可能。レイテンシ制約がなければ有効。
  4. プロンプトキャッシュ: Anthropicのプロンプトキャッシュ機能により、同一few-shotプロンプトのn回呼び出しで入力トークンコストを90%削減可能。

並列実行とレイテンシ

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)

よくある質問

Q1: 温度0.5と0.7のどちらを選ぶべきですか?

明確な正解が1つ存在するタスク(算術、形式論理、多肢選択)では温度0.5が安定的に高精度を示す。回答のバリエーションが許容されるタスク(常識推論、説明生成)や、問題の難易度が高く多様な推論アプローチが有効なケースでは温度0.7が良い。まず0.5で試し、多数決の一致度が低い(例: 10票中最多が3票)場合に0.7に上げるアプローチが実践的である。

Q2: サンプル数を増やすほど精度は必ず上がりますか?

理論的にはモデルの正解確率が50%を超える限り、nの増加に伴い精度は単調増加する。しかし実測では、n=20〜40以降で精度はほぼプラトーに達する。また、モデルの正解確率が50%以下のタスク(極めて困難な問題)では、サンプル数を増やしても改善せず、むしろ多数派の誤答に収束するリスクがある。

Q3: プロンプトキャッシュを使うとどれくらいコスト削減できますか?

Anthropic APIのプロンプトキャッシュでは、キャッシュヒット時の入力トークンコストが90%削減される($3.00/1M → $0.30/1M)。Self-Consistencyではn回の呼び出しで同一のsystemプロンプトとfew-shot例が再利用されるため、2回目以降の呼び出しでキャッシュが効く。n=10の場合、入力コストの約81%が削減される計算となる(1回のフルコスト + 9回のキャッシュコスト)。