😎

推論時間 vs モデルサイズ|Best-of-N実験でわかった推論強化の限界! Best-of-N実験に失敗した話について

に公開

はじめに

ルミナイR&Dチームの宮脇彰梧です。
現在はマルチモーダルAIの研究を行う大学院生として、
生成AIやAIエージェントの技術を実践的に探求しています。

「モデルパラメータを大きくすれば、AIは無限に賢くなる」
長らく信じられてきたこの"Scaling Laws"(スケーリング則)の神話に、新たな変数が加わりました。それが 「推論時計算量(Test-time Compute)」 です。OpenAI o1の登場により、学習時だけでなく「推論時にどれだけ時間をかけて考えさせるか」が性能決定の支配的な要因になりつつあります。

本記事では、このパラダイムシフトを科学的に解剖し、実際にコードを書いて検証します。

  • 学べること

    • 最新論文が示す「推論スケーリング則(Test-time Compute Scaling)」の理論的背景
    • 単純な「多数決(Best-of-N)」戦略の実装とその限界
    • なぜAIは「自信満々に間違った答え」で合意形成してしまうのか
  • 結論

    • 推論時間を延ばすだけでは不十分です。「量」より「質(検証能力)」がなければ、コストが無駄になる実例を示します。

概要

OpenAI o1やGemini 2.0 Flash Thinking等の「推論モデル」の背景にある理論、Test-time Compute Scalingについて解説します。DeepMind等の最新論文を査読形式で分析した後、実際にPythonで推論時間を擬似的に増やす実験を行い、その意外な結末(失敗)から得られる教訓を共有します。

1. なぜこのテーマを選んだのか

2024年後半、LLM界隈の最大のトピックは間違いなく「Reasoning(推論)モデル」の台頭です。これまでの「次は100兆パラメータだ」という巨大化競争に対し、OpenAI o1は「パラメータはそこそこでいい、その代わり推論時に強化学習で獲得した"思考の連鎖"を回せ」という別解を提示しました。

これはエンジニアにとって朗報に見えます。「巨大なGPUクラスタ」を持つ企業しか勝てないゲームから、「推論時の工夫」で勝てるゲームへとルールが変わった可能性があるからです。しかし、そこには当然コストというトレードオフと、「単に時間をかければ賢くなるのか?」という疑問が存在します。この問いに実証的に答えるため、本テーマを選定しました。

2. 関連調査

ここでは「推論時計算量」に関する重要論文・レポートについて分析します。

📘 Paper 1: 推論スケール則の定式化

  • Source: arXiv:2408.03314 (2024)
  • Title: Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters
  • Authors: Charlie Snell (UC Berkeley), et al. (Google DeepMind)
  • 概要: 推論時の計算量を増やす2つの戦略(Verifierによる探索、解の修正)を分析。特定の条件下では、モデルサイズを14倍にするよりも、推論計算量を4倍にする方が効率的であることを実証した。

https://arxiv.org/abs/2408.03314

評価表(Peer Review Metrics)

指標 評価 コメント
新規性 ★★★★★ 「学習計算量 vs 推論計算量」の等価交換性を体系的に示した初の主要研究。
実用性 ★★★★☆ 小規模モデル(Llama-7B等)でGPT-4級の性能を出すための指針になる。
再現性 ★★★☆☆ 理論は明快だが、高品質なVerifier(報酬モデル)の訓練が必要で再現コストは高い。
技術深度 ★★★★★ "Compute-optimal"(計算最適)な配分戦略を数理的に導出している点が白眉。
妥当性 ★★★★☆ MATHデータセット等での検証は強固だが、一般ドメインへの転用性は要検証。

筆者コメント

非常に示唆に富む研究。「難しい問題ほど推論時間をかける価値がある(Easy問題では逆効果)」という発見は、システム設計において極めて重要。ただし、Verifier(答えが合っているか判定するモデル)の性能に依存するため、Verifier自体を作るコストが隠されている点には注意が必要。

📘 Paper 2: サンプリング数による暴力的な解決

  • Source: arXiv:2407.21787 (2024)
  • Title: Large Language Monkeys: Scaling Inference Compute with Repeated Sampling
  • Authors: Bradley Brown, et al. (Scaling Intelligence / Stanford)
  • 概要: 「無限の猿定理」のごとく、単純にサンプリング数(回答生成数)を増やすだけで、小型モデルがどこまで巨大モデルに肉薄できるかを検証。DeepSeek-Coder等が、多数の試行を行うことでGPT-4を凌駕するケースを報告。

https://arxiv.org/abs/2407.21787

筆者コメント

「質より量」の有効性を証明した力作。特に、コード生成や数学のような「正解判定(検証)が自動化できるタスク」においては、高価なモデルを1回呼ぶより、安価なモデルを100回呼んでテストを通ったものを採用する方が安上がりかつ高精度であるという事実は、実務上のGolden Ruleになり得る。

3. 実装・検証(Dev型:Best-of-Nの実装)

論文 Large Language Monkeys で示された「数打てば当たる(ただし賢く選ぶ)」戦略は、我々開発者が明日から使える技術です。ここでは、その最も基本的なアプローチである 「Best-of-N(多数決)」 戦略を実装し、その実力を検証します。

検証のコンセプト

通常のLLM呼び出しと、思考時間を擬似的に増やす(N回生成して選ぶ)ラッパー関数を比較します。
対象とするのは、LLMが苦手とする「年齢計算の論理パズル」です。

実装コード(Python)

import os
from collections import Counter
from typing import List
from openai import OpenAI
import dotenv
dotenv.load_dotenv()

# OpenAI API Client (または Ollama/Local LLM)
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def generate_solution(problem: str, model: str = "gpt-4o-mini", temperature: float = 0.7) -> str:
    """
    単一の解を生成する関数。
    Temperatureを上げて多様性を持たせるのがポイント。
    """
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": "あなたは数学の専門家です。最終的な答えだけをシンプルに出力してください。"},
            {"role": "user", "content": problem}
        ],
        temperature=temperature
    )
    return response.choices[0].message.content.strip()

def best_of_n_strategy(problem: str, n: int = 5) -> str:
    """
    Best-of-N 戦略(Majority Voting)の実装。
    N回生成を行い、最も頻出する答えを採用する(Self-Consistency)。
    数学や論理パズルなど、正解が一つに定まるタスクで有効。
    """
    solutions = []
    print(f"--- Running Best-of-{n} Strategy ---")
    
    # 1. Generate N solutions
    for i in range(n):
        sol = generate_solution(problem)
        solutions.append(sol)
        print(f"Attempt {i+1}: {sol}")
    
    # 2. Majority Vote
    # 簡易的に文字列完全一致でカウントするが、実務では正規化が必要
    counts = Counter(solutions)
    most_common_solution, count = counts.most_common(1)[0]
    
    confidence = count / n
    print(f"Selected Answer: {most_common_solution} (Confidence: {confidence:.2f})")
    
    return most_common_solution

# --- 実験 ---
# 典型的な、LLMが間違えやすい論理パズル
problem = "私が6歳のとき、妹は私の半分の年齢でした。そして私が10歳のとき、弟は私の半分の年齢でした。私が70歳になったとき、妹と弟の年齢の合計は何歳ですか?"

print("【Single Shot】")
print(generate_solution(problem, temperature=0.7))

print("\n【Best-of-5】")
best_of_n_strategy(problem, n=5)

実行結果

【Single Shot】
妹は68歳、弟は65歳です。合計は133歳です。

【Best-of-5】
--- Running Best-of-5 Strategy ---
Attempt 1: 妹は68歳、弟は65歳です。合計は133歳です。
Attempt 2: 妹は68歳、弟は65歳です。合計は133歳です。
Attempt 3: 妹と弟の年齢の合計は140歳です。
Attempt 4: 妹と弟の年齢の合計は130歳です。
Attempt 5: 妹は68歳、弟は60歳なので、合計は128歳です。
Selected Answer: 妹は68歳、弟は65歳です。合計は133歳です。 (Confidence: 0.40)

解説:なぜ「多数決」は間違えたのか?

今回の実験結果は、Best-of-N戦略に潜む致命的な落とし穴を浮き彫りにしました。

  • 正解の確認:

    • 私(6歳) - 妹(3歳) = 3歳差。私が70歳のとき、妹は 67歳
    • 私(10歳) - 弟(5歳) = 5歳差。私が70歳のとき、弟は 65歳
    • 正解の合計は 67 + 65 = \mathbf{132} 歳です。
  • モデルの挙動:

    • 出力結果の多数派(Confidence 0.40)は「133歳」でした。
    • Attempt 1, 2を見ると「妹は68歳」としています。これはおそらく、「私が70歳なら、64年経過している。6歳+64年=70歳、3歳+64年=67歳」とすべきところを、どこかで計算ミス、あるいは文脈の取り違え(Systematic Error)を起こしています。
  • 教訓:

    • "Hallucination Consensus"(幻覚の合意): モデルが共通して犯しやすい間違いがある場合、いくらサンプリング数を増やしても、AIは「自信満々に間違った答え」で合意形成してしまいます。
    • 単純な多数決(Majority Voting)は、ランダムなノイズ(言い回しのブレなど)を除去するには有効ですが、論理的な勘違いそのものを正す力はないことが証明されました。

4. 筆者の考察

コード実験の「失敗」と論文の知見を統合し、推論計算量の「質」について考察します。

1. 「量」は「質」を凌駕できない(Quantity \neq Quality)

Snellらの論文では推論計算量の拡大が推奨されていましたが、今回の実験で「盲目的なスケーリングの限界」が露呈しました。
安価なモデルに対し、検証プロセスなしにN回生成させても、それは「精度の低い鉄砲」を数撃っているに過ぎません。
"Compute-optimal"(計算最適)な戦略とは、単に回数を増やすことではなく、「間違った推論パスを早期に検知し、剪定(Pruning)する」仕組みとセットでなければならないのです。

2. System 2 をどう実装するか

人間がこの問題を解くとき、「67+65=133...あれ?奇数と奇数だから偶数になるはずだ」といった検算(Self-Correction)を行います。
OpenAI o1が強力なのは、多数決ではなく、この「検算プロセス」自体を強化学習している点にあります。我々がアプリ層でこれを再現するには、単なるgenerate()のループではなく、以下のようなVerifier(検証器)を挟むパイプラインが必要です。

# 理想的な推論フロー(LangGraph等で実装すべき形)
while not passed_verification:
    answer = generate_draft()       # ドラフト生成
    critique = verify_logic(answer) # 検算・論理チェック(Verifier)
    if critique == "OK":
        return answer
    else:
        feedback_to_model(critique) # 間違いを指摘して再生成

3. 「推論の経済学」とROI

今回の実験では、5回分のAPIコストを支払って「133歳」という誤答を得ました。これはROI(投資対効果)として最悪です。
ここから得られる実務的な知見は、「すべてのタスクに推論コストをかけるな」ということです。簡単な挨拶や事実質問にはBest-of-1(即答)で返し、今回のような複雑な論理パズル(Logic QA)が来たときだけ、コストをかけてReActやVerifierを起動する。そのような「ルーター(Router)モデル」の設計こそが、エンジニアの腕の見せ所となります。

5. まとめ

  1. 推論スケール則の罠: モデルを巨大化させずに計算量を投下する手法は有効だが、それは「正解率が0ではない」場合に限る。バイアスのかかった誤答は、多数決でも排除できない。
  2. Verifierの必要性: "Generate"(生成)の回数を増やすよりも、"Verify"(検証)のステップを1回挟むほうが、論理タスクにおいてはコスト対効果が高い場合がある。
  3. 現場での戦略: 闇雲にn=100にするのではなく、まずはn=5程度で「答えが割れるか」を確認し、割れるようならVerifierを起動するような動的なアーキテクチャが求められる。

https://github.com/LoNebula/Lluminai/tree/main/16_2025_12_10_llm_scailing

執筆:宮脇 彰梧(ルミナイ株式会社 / Lluminai)


【現在採用強化中です!】

  • AIエンジニア
  • PM/PdM
  • 戦略投資コンサルタント

▼代表とのカジュアル面談URL
https://pitta.me/matches/VCmKMuMvfBEk

ルミナイ - 産業データをLLM Readyにするための技術ブログ

Discussion