Test-Time Scaling(推論時スケーリング)とは?考える時間を増やしてLLMを賢くする仕組み

難しい数学の問題を出されたとき、あなたは即答するでしょうか。しません。紙に書き、途中で間違いに気づいて消し、別の方針を試し、最後に検算します。簡単な問題には1秒、難しい問題には10分かける — これは人間にとってあまりに当たり前の振る舞いです。

ところが、素朴に使われるLLMはそうなっていません。「2+3は?」でも「この積分を解け」でも、1トークンあたりに使われる計算量は同じ、生成されるトークン数もプロンプト次第でほぼ同じです。難しさに応じて考える量を変える、という当たり前のことをしていない。ここに、モデルの重みを1バイトも変えずに性能を引き上げる余地が残っています。

この余地を体系的に使い切ろうとするのが Test-Time Scaling(推論時スケーリング) です。従来のスケーリング則が「モデルを大きくする・データを増やす・学習計算量を積む」という学習時の3つの軸を扱ってきたのに対して、Test-Time Scalingは 推論時の計算量 という第4の軸を扱います。同じモデルに、同じ問題を、より多く考えさせるだけで精度が上がる。しかもその上がり方には、二項分布や極値分布から厳密に導ける明確な法則があります。

この考え方が実際に効いている場面を挙げておきます。

  • 数学・競技プログラミング: 答えが自動で採点できるので「検証器」が作りやすく、たくさん試して当たりを選ぶ戦略が素直に効く
  • コード生成とエージェント: テストを走らせた結果、コンパイルエラー、ツールの返り値そのものが検証信号になる。失敗したら書き直す、というループが自然に回る
  • 高リスクな判断の支援: 医療・法務・設計レビューのように「1問に10倍のコストを払ってでも間違いを減らしたい」場面では、推論時計算量を意図的に積み増す判断が合理的になる

本記事の内容

  • 学習時スケーリングと推論時スケーリングの違い — 計算量を「いつ」払うのか
  • 推論時計算量の使い道は3系統(並列サンプリング・逐次修正・探索)という整理
  • 多数決が勝つ条件 $p > 1/(m+1)$ を多項分布から厳密に導く
  • Best-of-$N$ の成功率を検証器スコアの「分離度」つきで計算し、検証器の質が天井を決めることを見る
  • ORM(結果報酬)とPRM(プロセス報酬)の粒度の差が、探索コストを指数から線形に変えること
  • compute-optimalな計算量配分 — 難しい問題に多く、易しい問題に少なく配るとはどういうことか
  • 収穫逓減・報酬ハッキング・考えすぎ(overthinking)という限界

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

計算量を「いつ」払うのか — 第4の軸

学習時スケーリングのおさらい

まず、これまでのスケーリング則が何を主張していたかを1行で思い出しておきます。損失 $L$ は、パラメータ数 $N$、学習データ量 $D$、学習計算量 $C \approx 6ND$ のそれぞれに対して、べき乗則で減っていきます。

$$ L(N, D) = E + \frac{A}{N^{\alpha}} + \frac{B}{D^{\beta}} $$

Chinchilla則はこの形の下で、予算 $C$ が与えられたときに $N$ と $D$ をどう配分すべきかを解いた結果でした(詳しくはスケーリング則の数学を参照してください)。

ここで見落とされがちな前提が1つあります。この3軸はすべて「学習が終わるまでに払う」計算量だということです。学習が終わった瞬間にモデルの能力は固定され、以降どのクエリを投げても1問あたりの計算量はほぼ一定になります。

推論時計算量 $C_{\text{test}}$ の定義

そこで、4本目の軸を明示的に立てます。1つの問題 $x$ に答えるために消費する推論計算量を $C_{\text{test}}(x)$ と書きます。Transformerの推論では、生成トークン1本あたりおよそ $2N$ FLOPs($N$ はパラメータ数)かかるので、大雑把には次の形になります。

$$ C_{\text{test}}(x) \approx 2N \times \bigl(\text{その問題のために生成した総トークン数}\bigr) $$

ポイントは括弧の中身です。ここはプロンプトと推論戦略だけで自由に動かせる量で、モデルの重みには一切触りません。長い思考を書かせればトークン数が増え、$N$ 本を並列に生成すれば $N$ 倍になり、木を探索すれば展開したノードの数だけ増えます。

学習時スケーリングの3軸と推論時計算量という第4の軸を対比した概念図

この図(概念図)の左右で、決定的に違うのは支払いのタイミングです。左の3軸は事前学習で1回だけ払い、その後の全ユーザー・全クエリで償却されます。右の第4の軸はクエリごとに毎回払う。これは裏返せば、「この問題は重要だから10倍払う、この問題はどうでもいいから1倍で済ませる」という問題ごとの意思決定が可能になるということです。学習時の軸には絶対にできない芸当です。

一方で、コスト構造の話としては厳しい面もあります。推論コストは償却されないので、Test-Time Scalingは製品の粗利に直撃します。「精度が上がるなら計算量を増やせばよい」という話ではなく、1問あたりいくらまで払うかという予算問題になる、というのが正しい理解です。この予算配分の話は記事の後半で数式にします。

では、その予算を具体的に何に使うのでしょうか。使い道は無数にあるように見えますが、整理すると3系統に落ち着きます。

推論時計算量の使い道は3系統に整理できる

並列サンプリング・逐次修正・探索という3系統を対比した模式図

上の模式図(概念図)が本記事の地図です。3つの系統を先に言葉にしておきます。

(a) 並列サンプリング系。同じ問題に対して独立に $N$ 本の解答を生成し、最後に1本を選びます。選び方が多数決ならSelf-Consistency、検証器のスコアが最大のものを選ぶなら Best-of-$N$ です。各試行が互いに情報をやりとりしないので、完全に並列化できて実時間(wall-clock)が伸びないという実務上の大きな利点があります。

(b) 逐次修正系。1本の解答を書いたあと、それを自分で読み直して問題点を指摘し、書き直す。これを繰り返します。Self-Refineやリフレクション系の手法がここに入ります。前の試行の情報を次に活かせるので原理的には効率が良いはずですが、自己検証が下手だと正解を誤答に書き換えてしまうという固有の危険があります。

(c) 探索系。解答を「ステップの列」とみなし、途中まで書いた部分解を検証器が評価し、有望な枝だけを伸ばします。ビームサーチをトークン単位ではなく推論ステップ単位に持ち上げたもの、と考えると分かりやすいでしょう。Tree-of-Thoughtや木探索がここに属します。

この3つはどれも「計算量を増やす」点では同じですが、増やした計算量が精度に変換される効率がまるで違います。効率の違いは直感では分からないので、順番に数式で押さえていきましょう。まず一番単純な並列サンプリングからです。

(a) 並列サンプリング系 — 多数決の数理

なぜ複数引くと当たるのか

まず素朴な直感から始めます。1人の専門家に聞くより、5人に聞いて多数決を取ったほうが正しそうな気がします。これはなぜでしょうか。

答えは「個々の判断に独立な誤りが乗っているなら、平均をとると誤りが打ち消し合うから」です。全員が同じ誤りを犯すなら多数決は無意味ですし、そもそも1人の正答率が5割を切っているなら、多数決は誤答のほうを増幅してしまいます。この境目がどこにあるのかを正確に知りたい、というのがここでの動機です。

LLMの場合、独立性は温度つきサンプリングによって作られます(Temperature・Top-k・Top-pサンプリング)。同じプロンプトから毎回違う推論経路が生成され、それぞれ違う場所で計算ミスをする。ここに多数決を効かせよう、というわけです。

Condorcetの陪審定理

まず、誤答が1種類しかない状況(正誤2択)を考えます。1本のサンプルが正解する確率を $p$ とし、$N$ 本を独立に引いて多数決を取ります。正解に入った票数を $K$ とすると $K \sim \mathrm{Bin}(N, p)$ なので、$N$ が奇数のとき多数決が正解する確率は

$$ M_N(p) = P\!\left(K > \frac{N}{2}\right) = \sum_{k = \lceil (N+1)/2 \rceil}^{N} \binom{N}{k} p^k (1-p)^{N-k} \tag{1} $$

です。式(1)を眺めるだけでは何も見えないので、$N \to \infty$ の挙動を調べます。大数の法則より $K/N \to p$ なので、

$$ M_N(p) \longrightarrow \begin{cases} 1 & (p > 1/2) \\ 1/2 & (p = 1/2) \\ 0 & (p < 1/2) \end{cases} $$

となります。これが Condorcetの陪審定理 です。$p = 1/2$ を境に運命がきれいに分かれる、という驚くほど鋭い性質を持っています。

収束の速さも押さえておきましょう。$p > 1/2$ のとき、Hoeffdingの不等式を $K/N$ に適用すると

$$ 1 – M_N(p) = P\!\left(\frac{K}{N} \le \frac{1}{2}\right) \le \exp\!\left(-2N\left(p – \tfrac{1}{2}\right)^2\right) \tag{2} $$

が得られます。式(2)から2つのことが読み取れます。第一に、誤り率は $N$ に対して指数的に減る。これは強力に見えます。第二に、しかし裏返すと正答率を $1-\varepsilon$ にするのに必要なサンプル数は $N \gtrsim \ln(1/\varepsilon) / \bigl(2(p-1/2)^2\bigr)$、つまり $\varepsilon$ を10分の1にするたびに $N$ を一定量ずつ足していく必要がある。精度は $\log N$ に対して線形にしか伸びません。これが後で何度も出てくる「収穫逓減」の正体です。

さらに、分母の $(p – 1/2)^2$ が効くのも重要です。$p = 0.55$ の問題で必要なサンプル数は、$p = 0.8$ の問題の $\left(\frac{0.3}{0.05}\right)^2 = 36$ 倍になります。ぎりぎりの難問ほど、多数決のコストが二次で跳ね上がるわけです。

現実の誤答は1種類ではない

ここまでは教科書どおりですが、実際のLLMに当てはめると重要な食い違いがあります。誤答は1種類ではありません。「$x=7$」が正解のとき、モデルは $x=5$、$x=-7$、$x=49$ など、いろいろな間違え方をします。そして多数決で必要なのは「過半数」ではなく「単独最多(plurality)」です。

そこでモデルを一般化します。正解が確率 $p$ で出て、誤答は $m$ 種類の選択肢に $(1-p)/m$ ずつ均等に分かれるとします。$N$ 本引いたときの得票は多項分布に従い、多数決が正解するのは「正解の票数が、どの誤答の票数よりも真に多い」ときです。正解の票数で条件付けると

$$ \Pi_N(p, m) = \sum_{k=1}^{N} \binom{N}{k} p^k (1-p)^{N-k} \cdot P\bigl(\text{残り } N-k \text{ 票を } m \text{ 箱に配って全て } k-1 \text{ 以下}\bigr) \tag{3} $$

と書けます。式(3)の後半の確率は、$t = N-k$ 個のボールを $m$ 個の箱に一様独立に投げたときの話なので、多項係数の和として厳密に書けます。

$$ P(\text{全箱} \le c) = \frac{t!}{m^t} \sum_{\substack{n_1 + \cdots + n_m = t \\ 0 \le n_i \le c}} \prod_{i=1}^{m} \frac{1}{n_i!} \tag{4} $$

式(4)の和は、箱を1つずつ足しながら「ここまでで何個使ったか」を状態にした動的計画法で計算できます。指数型母関数 $\sum_{n=0}^{c} z^n/n!$ を $m$ 個掛け合わせて $z^t$ の係数を取る操作そのものです。

さて、この一般化から何が出てくるでしょうか。$N \to \infty$ の挙動を見ます。各選択肢の得票率は、大数の法則によりその出現確率に収束します。正解の得票率は $p$、各誤答の得票率は $(1-p)/m$。したがって多数決が勝つ条件は

$$ p > \frac{1-p}{m} \quad\Longleftrightarrow\quad \boxed{\;p > \frac{1}{m+1}\;} \tag{5} $$

です。$m=1$ を代入すると $p > 1/2$ となり、Condorcetの結果がちゃんと特別な場合として出てきます。そして式(5)が言っているのは、誤答が散らばるほど多数決の勝てる条件は緩くなるということです。誤答が9種類に散るなら、1回の正答率が10%を超えてさえいれば、サンプルを増やすだけでいつかは正解にたどり着きます。

これは実務的にかなり重要な洞察です。「多数決が効くには正答率5割が必要」というのは2択問題でしか成り立たない話で、答えが自由記述に近い(=間違え方が多様な)問題ほど、多数決は低い正答率から効き始めます。逆に言えば、モデルが一貫して同じ間違い方をする問題($m$ が小さい問題)では、何本引いても無駄ということでもあります。

実際に式(3)と式(4)を計算してみましょう。

from math import comb, factorial
import numpy as np

def p_all_counts_le(t, m, c):
    """t票をm個の誤答選択肢に一様に配ったとき、全ての得票がc以下になる確率"""
    if c < 0:
        return 1.0 if t == 0 else 0.0
    if m * c < t:
        return 0.0
    A = np.zeros(t + 1); A[0] = 1.0
    for _ in range(m):                       # 誤答の箱を1つずつ足していく
        B = np.zeros(t + 1)
        for s in range(t + 1):
            if A[s] == 0.0:
                continue
            for n in range(min(c, t - s) + 1):
                B[s + n] += A[s] / factorial(n)
        A = B
    return float(A[t] * factorial(t) / m**t)

def majority_win_prob(N, p, m=1):
    """1回の正答率p・誤答がm種に分かれるとき、N回の多数決が正解する確率"""
    return sum(comb(N, k) * p**k * (1 - p)**(N - k) * p_all_counts_le(N - k, m, k - 1)
               for k in range(1, N + 1))

for m in (1, 2, 4, 9):
    row = "  ".join(f"N={N:2d}: {majority_win_prob(N, 0.35, m):.4f}" for N in (1, 11, 41))
    print(f"誤答 m={m} 種 (p=0.35, 閾値 1/(m+1)={1/(m+1):.3f}) -> {row}")

実行すると次の出力が得られます。

誤答 m=1 種 (p=0.35, 閾値 1/(m+1)=0.500) -> N= 1: 0.3500  N=11: 0.1487  N=41: 0.0239
誤答 m=2 種 (p=0.35, 閾値 1/(m+1)=0.333) -> N= 1: 0.3500  N=11: 0.2917  N=41: 0.3724
誤答 m=4 種 (p=0.35, 閾値 1/(m+1)=0.200) -> N= 1: 0.3500  N=11: 0.5112  N=41: 0.8560
誤答 m=9 種 (p=0.35, 閾値 1/(m+1)=0.100) -> N= 1: 0.3500  N=11: 0.6955  N=41: 0.9875

$p = 0.35$ というまったく同じ生成性能なのに、誤答の散らばり方だけで41本引いたときの結果が 0.0239 から 0.9875 まで、実に40倍以上も開きます。式(5)の閾値と照らすと理由は明快です。$m=1$ では $0.35 < 0.5$ なので崩壊へ、$m=2$ では $0.35$ がぎりぎり $1/3$ を超えているので極めてゆっくり上昇、$m \ge 4$ では余裕で閾値を超えているので順調に1へ向かいます。この様子を図にすると次のようになります。

多数決の正答率をサンプル数と個別正答率について二項分布から厳密計算した図

左のパネルが古典的なCondorcetの設定です。$p = 0.50$ の紫線がぴったり水平に $0.5$ を保っているのが目を引きます。サンプルを何本増やしても1ミリも改善しない。式(1)で $p=1/2$ のとき二項分布が対称になるので、これは数学的に必然です。そして $p=0.45$ の緑線は、たった $0.05$ の差で単調に下がっていきます。多数決は「良いものを増幅する」装置であると同時に「悪いものも増幅する」装置だ、ということが視覚的に分かります。

右のパネルでは $p = 0.35$ に固定して $m$ だけを変えました。$m=2$ の青線が $N=5$ 付近で一度へこんでから持ち直しているのは偶奇の効果です。票が割れやすい小さな $N$ では、正解が単独最多になれずに敗れる事象が相対的に多くなります。$m$ が大きいほど早く1に向かうという序列は、式(5)の閾値 $1/(m+1)$ と正確に対応しています。

pass@$N$ — 「選ぶ」ができれば届く上限

多数決は「$N$ 本の中で最も多いものを選ぶ」というルールでした。もし神様のような完璧な検証器があって、$N$ 本の中に正解が1本でも混ざっていれば必ずそれを選び出せるとしたら、成功率はどうなるでしょうか。答えは単純です。

$$ \text{pass@}N = 1 – (1-p)^N \tag{6} $$

これは「$N$ 本すべてが外れる確率の余事象」なので当たり前ですが、Test-Time Scalingを考えるうえで決定的に重要な量です。式(6)は生成側の能力だけで決まる上限であり、どんな選択戦略を使ってもこれを超えることはできません。

式(6)の伸び方も確認しておきます。両辺を変形すると $\log(1 – \text{pass@}N) = N \log(1-p)$ なので、失敗率の対数が $N$ に線形です。つまり $N$ を2倍にすると失敗率は2乗になる。$p=0.4$ なら、$N=8$ で失敗率 $0.6^8 = 1.7\%$、$N=16$ で $0.03\%$。ここまでは劇的に見えます。しかし $N=8$ の時点ですでに $98.3\%$ に達しているので、残りの伸びしろ自体がほとんどありません。「$N$ を増やせばまだ伸びる」という話と「増やす価値がある」という話は別だ、という当たり前のことを、式(6)ははっきり示しています。

そして現実には、完璧な検証器は存在しません。ここからが本題です。

Best-of-$N$ — 検証器の質が天井を決める

Best-of-$N$ は、$N$ 本の候補それぞれに検証器(報酬モデル)がスコア $r(x, y)$ を与え、最大スコアの1本を採用する戦略です。多数決との違いは、「多い」ではなく「良い」で選ぶ点にあります。正解が1本しか出なくても、検証器がそれを見抜けるなら採用できる。だから多数決より原理的に強いはずです。

では検証器の性能をどう定量化するとよいでしょうか。信号検出理論の発想を借りて、スコアの分布がどれだけ離れているかで測ります。正解のスコアは $\mathcal{N}(d, 1)$、誤答のスコアは $\mathcal{N}(0, 1)$ に従うとし、この $d$ を 分離度 と呼びます(統計学でいう $d’$ に相当します)。$d$ が大きいほど検証器は正解と誤答をきれいに区別できます。

このとき Best-of-$N$ の成功率は、正解が何本混ざっていたかで条件付けて計算できます。正解が $k$ 本、誤答が $N-k$ 本のとき、最大値が正解側から出る確率は

$$ Q_k = \int_{-\infty}^{\infty} k\, \varphi(x – d)\, \Phi(x – d)^{k-1}\, \Phi(x)^{N-k}\, dx \tag{7} $$

です。式(7)の読み方を補足しておきます。「正解 $k$ 本のうちどれか1本が最大値 $x$ を取る」場合の数が先頭の $k$、その1本の密度が $\varphi(x-d)$、残りの正解 $k-1$ 本がすべて $x$ 未満である確率が $\Phi(x-d)^{k-1}$、誤答 $N-k$ 本がすべて $x$ 未満である確率が $\Phi(x)^{N-k}$ です。あとは二項分布で重み付けして足すだけです。

$$ B_N(p, d) = \sum_{k=1}^{N} \binom{N}{k} p^k (1-p)^{N-k}\, Q_k \tag{8} $$

式(8)が正しいことは、2つの極限で確認できます。$d \to \infty$ では $Q_k \to 1$($k \ge 1$)なので、$B_N \to 1 – (1-p)^N = \text{pass@}N$。$d = 0$ ではすべてのスコアが同分布なので最大値が正解側である確率は $k/N$ となり、$\sum_k \binom{N}{k}p^k(1-p)^{N-k} \cdot k/N = p$、つまりランダムに1本選ぶのと同じになります。両端が意味のある値に落ちる、良い定式化です。

数値で確かめましょう。

import numpy as np
from math import comb
from scipy.special import ndtr   # 標準正規の累積分布 Φ

def best_of_n(N, p, d, eta=0.0, mu_h=0.0):
    """検証器スコアが正解 N(d,1)・誤答 N(0,1) のときの Best-of-N 成功率。
    誤答のうち割合 eta は N(mu_h,1) からスコアを引く(検証器を欺く誤答)。"""
    h = 0.002
    x = np.arange(-9.0, 9.0 + max(d, mu_h), h)
    phi = np.exp(-0.5 * (x - d)**2) / np.sqrt(2 * np.pi)   # 正解スコアの密度
    Fc = ndtr(x - d)                                       # 正解スコアの累積分布
    Fi = (1 - eta) * ndtr(x) + eta * ndtr(x - mu_h)        # 誤答スコアの累積分布
    total = 0.0
    for k in range(1, N + 1):                              # k = 正解だったサンプル数
        w = comb(N, k) * p**k * (1 - p)**(N - k)
        f = k * phi * Fc**(k - 1) * Fi**(N - k)
        total += w * float((f[:-1] + f[1:]).sum() * 0.5 * h)   # 台形則
    return total

p = 0.40
for d in (0.0, 0.5, 1.0, 2.0):
    row = "  ".join(f"N={N:3d}: {best_of_n(N, p, d):.4f}" for N in (1, 16, 128))
    print(f"分離度 d={d}: {row}")
print("完全検証器 pass@128 =", round(1 - (1 - p)**128, 4))
print("誤答の2%が検証器を欺く場合:",
      "  ".join(f"N={N:3d}: {best_of_n(N, p, 2.0, 0.02, 3.0):.4f}" for N in (16, 32, 128)))

出力は次のとおりです。

分離度 d=0.0: N=  1: 0.4000  N= 16: 0.4000  N=128: 0.4000
分離度 d=0.5: N=  1: 0.4000  N= 16: 0.6154  N=128: 0.7102
分離度 d=1.0: N=  1: 0.4000  N= 16: 0.7973  N=128: 0.9090
分離度 d=2.0: N=  1: 0.4000  N= 16: 0.9684  N=128: 0.9968
完全検証器 pass@128 = 1.0
誤答の2%が検証器を欺く場合: N= 16: 0.8958  N= 32: 0.8849  N=128: 0.8267

生成側の性能 $p = 0.40$ はどの行でも同じであることに注目してください。にもかかわらず $N=128$ の結果は $0.40$ から $1.00$ まで散らばります。この差はすべて「選ぶ側」の性能差です。とくに $d=0$ の行が完全に水平なのが象徴的で、選べない検証器を持っている限り、計算量をいくら積んでも1ミリも報われません。

そして最後の行が不穏です。$d=2.0$ という良い検証器を持っていても、誤答のうち2%が検証器を欺く(スコアが $\mathcal{N}(3, 1)$ から引かれる)だけで、$N$ を増やすと精度が下がり始めます。これが 報酬ハッキング の数理的な姿です。図にすると劇的です。

Best-of-Nの成功率を検証器スコアの分離度ごとに数値積分した図

左のパネルで、赤い逆三角の曲線(検証器に2%の穴があるケース)は $N=16$ 付近で $0.896$ の頂点をつけたあと、$N=256$ では $0.789$ まで落ちます。理由は単純で、$N$ を増やすとは「検証器を欺く誤答を引く機会」も増やすことだからです。$N$ が小さいうちは欺く誤答がそもそも生成されないので影響がなく、$N$ が大きくなるとほぼ確実に混ざり、しかも最大スコアを取ってしまう。学習された報酬モデルを Best-of-$N$ で押し切ると真の品質が途中から下がり始める、という実務でよく報告される現象は、この機構で説明がつきます。

もう一点、$d=0.5$ の青線の伸び方も見ておく価値があります。$N=16$ で $0.615$、$N=128$ で $0.710$、$N=256$ でも $0.734$ です。$N$ を16倍にして得られた改善が $0.12$ しかない。弱い検証器は「効かない」のではなく「対数的にしか効かない」というのが正確な言い方で、実務的にはコストが見合わないという意味で同じことです。

右のパネルは同じ $p=0.40$ で選び方だけを4通り変えたものです。$N=65$ の時点で、誤答が集中する多数決は $0.051$、誤答が散る多数決は $0.951$、検証器つき Best-of-$N$ は $0.994$、上限の pass@$N$ は $1.000$。同じモデル、同じ計算量、違うのは選び方だけでこれだけ開きます。Test-Time Scalingの実装で最も投資対効果が高いのが検証器である、という結論はここから来ています。

さて、並列サンプリングは「$N$ 本を独立に引く」という設計でした。せっかく1本目を書いたのだから、その情報を2本目に活かせないでしょうか。それが次の系統です。

(b) 逐次修正系 — 直す力と壊す力の綱引き

自己修正ループの素朴な期待

自己修正の発想は自然です。まず答えを書かせ、次に「この答えの誤りを指摘してください」と自己批評させ、その批評をもとに書き直させる。人間の推敲そのものです。前の試行を捨てずに使うので、独立に $N$ 本引くより効率がよさそうに見えます。

ところが実験してみると、自己修正を繰り返すと精度がむしろ下がるという報告が繰り返し出ています。なぜでしょうか。単純な確率モデルを1つ立てると、理由がはっきりします。

2状態マルコフ連鎖として書く

解答の状態を「正解」か「誤答」の2つだけにします。1回の修正ラウンドで、

  • いま正解なら、確率 $\alpha$ で誤答に書き換えてしまう(存在しない誤りを指摘して直してしまう = 自己検証の偽陽性)
  • いま誤答なら、確率 $\beta$ で正解に直せる(誤りを正しく見つけて修正できる = 真陽性)

とします。$t$ ラウンド後の正答率を $a_t$ と書くと、遷移は

$$ a_{t+1} = a_t (1 – \alpha) + (1 – a_t)\beta \tag{9} $$

です。式(9)は $a_t$ について線形なので、不動点を求めて差を追えば一般解が出ます。不動点 $a^\ast$ は $a^\ast = a^\ast(1-\alpha) + (1-a^\ast)\beta$ を解いて

$$ a^\ast = \frac{\beta}{\alpha + \beta} \tag{10} $$

両辺から $a^\ast$ を引くと $a_{t+1} – a^\ast = (1 – \alpha – \beta)(a_t – a^\ast)$ なので、

$$ a_t = a^\ast + (1 – \alpha – \beta)^t\,(a_0 – a^\ast) \tag{11} $$

式(11)が自己修正ループのすべてを語っています。$0 < \alpha + \beta < 2$ なら $a_t$ は必ず $a^\ast$ に収束します。そして $a^\ast$ は初期正答率 $a_0$ にまったく依存しません。つまり十分に修正を重ねた後の性能は、$\alpha$ と $\beta$ の比だけで決まってしまう。

ここから決定的な結論が出ます。$a_0 > a^\ast$、すなわち

$$ a_0 > \frac{\beta}{\alpha + \beta} \quad\Longleftrightarrow\quad \alpha\, a_0 > \beta\,(1 – a_0) \tag{12} $$

のとき、修正すればするほど精度は下がります。式(12)の左辺は「壊す確率 × 正解している問題の割合」= 単位ラウンドあたりに壊される期待数、右辺は「直す確率 × 誤答の割合」= 直される期待数です。壊す量が直す量を上回れば下がる。当たり前ですが、元の性能 $a_0$ が高いほど左辺が大きくなるため、賢いモデルほど自己修正で損をしやすい、という反直感的な帰結が出てきます。

自己修正ループを2状態マルコフ連鎖として解析した図

左のパネルは $a_0 = 0.40$ から出発した4つのケースです。$\alpha = 0$(正解を絶対に壊さない)の橙線は $a^\ast = 1$ に向かって単調に上がりますが、$\alpha = 0.25,\ \beta = 0.10$ の紫線は $a^\ast = 0.286$ へ下がっています。しかも $\alpha = 0.15,\ \beta = 0.20$ という「直す力のほうが強い」設定でも、収束先は $0.571$ にすぎません。直す力が壊す力より強くても、到達点は1にはならないのです。式(10)を見れば当たり前ですが、$\alpha > 0$ である限り $a^\ast < 1$ です。

右のパネルは $(\alpha, \beta)$ 平面上で改善領域と悪化領域を分けたものです。境界は $\beta/\alpha = a_0/(1-a_0) = 2/3$ の直線で、$a_0$ が高いほどこの直線は寝て、改善領域が狭くなります。プロットされた3点のうち2点が改善側、1点が悪化側にあります。

読み取れる実務的な教訓は3つです。第一に、自己修正の成否は $\alpha$(誤検出率)で決まる。第二に、$\alpha$ を0に近づける最も確実な方法は外部フィードバックを使うことです。ユニットテストの実行結果、コンパイラのエラー、計算機による検算 — これらは「正しいものを誤りと判定する」ことがまずないので $\alpha \approx 0$ になり、式(10)から $a^\ast \to 1$ が保証されます。「LLMは外部フィードバックなしでは自分の推論を修正できない」という広く知られた実験結果は、この $\alpha$ の話に還元できます。第三に、修正ラウンド数を無制限に回すのは危険です。式(11)は $a^\ast$ への収束を保証しますが、それが $a_0$ より低ければ、回すほど損をします。

並列サンプリングと逐次修正は、どちらも「解答1本まるごと」を単位にしていました。もっと細かい粒度で計算量を使えないでしょうか。それが3つ目の系統です。

(c) 探索系 — ステップ単位で評価する

ビームサーチを推論ステップに持ち上げる

ビームサーチは本来、トークン列の対数尤度を最大化する近似探索でした。ビーム幅 $B$ 本の部分列を保持し、各ステップで展開してスコア上位 $B$ 本だけを残す、という手続きです。

Test-Time Scalingの文脈では、これを単位を変えて使います。トークンではなく「推論ステップ」(数式変形1行、証明の1補題、コードの1関数)を展開単位にし、スコアには言語モデルの対数尤度ではなく検証器の評価値を使います。この置き換えが本質的です。対数尤度は「もっともらしい文章か」を測る量であって「正しい推論か」を測る量ではないからです。実際、尤度最大の推論経路が正解である保証はどこにもありません。

$s$ をステップ列 $(z_1, \dots, z_i)$ とし、検証器が部分解の見込みを $v(x, z_{1:i}) \in [0,1]$ で返すとすると、ステップ単位ビームサーチは次の形になります。

$$ \mathcal{B}_{i+1} = \operatorname*{arg\,top-}B_{\,z_{1:i} \in \mathcal{B}_i,\; z_{i+1} \sim \pi(\cdot \mid x, z_{1:i})} v(x, z_{1:i+1}) $$

さらに一歩進めると、各ノードから数ステップ先までロールアウトして結果を見てから評価する 先読み(lookahead) や、訪問回数と価値のバランスを取る木探索に発展します。Tree-of-Thoughtはこの系統の代表です。

なぜ探索は並列より効率がよいのか

探索が並列サンプリングより計算効率で有利になる理由は、単純ですが見落とされがちです。共通接頭辞を使い回せるからです。

$N$ 本を独立に生成すると、生成トークン数は $N \times L$($L$ はチェーン長)になります。一方、木探索では、根に近い部分は複数の枝で共有されるので、同じ「葉の本数」を得るのに必要な生成トークン数がずっと少なくて済みます。KVキャッシュの観点でも、共有接頭辞のキャッシュを再利用できるので、メモリと計算の両方で得をします。

もう一つの利点が早期の枝刈りです。並列サンプリングは、最初のステップで壊れた解答でも最後まで書き切ってから捨てます。探索は壊れた時点で捨てられる。この差が、チェーンが長くなるほど効いてきます。ただしこの利点は「壊れた時点で壊れたと分かる」ことが前提です。それができるかどうかが、次に扱う検証器の設計の話に直結します。

検証器の質が上限を決める — ORM と PRM

2種類の報酬モデル

推論時に使う検証器(報酬モデル)には、評価の粒度で2つの流儀があります。

ORM(Outcome Reward Model / 結果報酬モデル) は、完成した解答全体を受け取って正しさのスコアを返します。

$$ r_{\text{ORM}}(x, z_{1:L}) \in [0, 1] $$

学習ラベルは「最終答えが正解だったか」だけで作れるので、データ収集が圧倒的に安いのが利点です。数学問題なら答え合わせをするだけ、コードならテストを走らせるだけで、自動的に大量のラベルが手に入ります。

PRM(Process Reward Model / プロセス報酬モデル) は、各ステップまでの部分解に対してスコアを返します。

$$ r_{\text{PRM}}(x, z_{1:i}) \in [0, 1] \qquad (i = 1, \dots, L) $$

こちらは「どこで壊れたか」を教えてくれます。代償はラベルの高さで、ステップごとの正誤を人手でアノテーションするか(PRM800Kのような大規模なアノテーション作業がこれです)、各ステップから多数回ロールアウトして「そこから正解に到達できた割合」を疑似ラベルにする必要があります。

ORMとPRMの評価粒度の違いと、探索コストの指数・線形の差

粒度の差が探索コストを指数から線形に変える

この粒度の差がどれだけ効くのかを、単純な設定で見積もってみましょう。1つの推論ステップが正しく書ける確率を $q$ とし、$L$ ステップすべてが正しいときだけ最終解が正解になるとします(誤りが後で自然に治ることはないと仮定)。このとき1本のチェーンが正解である確率は $q^L$ です。

ORMだけを使う場合、できることは「チェーンを丸ごと生成して、ダメなら丸ごと捨てて引き直す」ことだけです。成功までの試行回数は幾何分布に従うので期待値は $1/q^L$、1回の試行で $L$ ステップ生成するので、

$$ \mathbb{E}[\text{生成ステップ数}]_{\text{ORM}} = \frac{L}{q^L} \tag{13} $$

PRMを使う場合、各ステップを書いた直後に検証できるので、失敗したステップだけを引き直せます。1ステップを通すまでの期待試行数は $1/q$、それが $L$ ステップ分なので、

$$ \mathbb{E}[\text{生成ステップ数}]_{\text{PRM}} = \frac{L}{q} \tag{14} $$

式(13)と式(14)の差は劇的です。$L$ に対して指数的に増える量と、線形にしか増えない量の違いだからです。比を取ると $q^{-(L-1)}$ で、これは $L$ とともに指数的に開きます。

具体的な数値を見ましょう。$q = 0.9$、$L = 20$ のとき、式(13)は $20 / 0.9^{20} = 164.5$ ステップ、式(14)は $20/0.9 = 22.2$ ステップで、比は 7.4倍。$q = 0.8$、$L = 20$ まで下げると $1734.7$ 対 $25.0$ で 69.4倍 になります。図の右パネルの対数軸で、実線(ORM)が右上へ指数的に駆け上がるのに対し、破線(PRM)がほぼ横ばいなのがこの差です。

チェーンが長くなるほどPRMの価値が上がるという結論は重要です。逆に言えば、$L$ が2〜3程度の短い推論では、高価なPRMを用意する意味はほとんどありません。長い思考を売りにする推論モデルほど、ステップ単位の検証が本質的になる、という関係があります。

もちろん式(13)(14)は理想化です。実際には、(i) PRMのステップ判定にも誤りがあり、正しいステップを誤って棄却すれば無駄が増える、(ii) ステップの正誤は独立でなく、前のステップの誤りが後で発覚することがある、(iii) 「そこから正解に到達できた割合」で疑似ラベルを作ると、たまたま運良く正解に着いた誤りステップに高いスコアが付く、といった綻びがあります。それでも桁の見積もりとしては正しいので、設計判断の指針になります。

集約の仕方でも変わる

PRMのステップスコア $v_1, \dots, v_L$ から解答全体のスコアをどう作るか、にも設計の余地があります。よく使われるのは3つです。

$$ V_{\min} = \min_i v_i, \qquad V_{\text{prod}} = \prod_i v_i, \qquad V_{\text{last}} = v_L $$

$V_{\min}$ は「一番弱い輪が全体を決める」という考え方で、推論の連鎖は1箇所壊れれば終わりなので理屈に合っています。$V_{\text{prod}}$ は各ステップの正しさが独立という仮定に対応しますが、$L$ が大きいと値が0に潰れて比較しづらくなります。$V_{\text{last}}$ は実装が最も軽く、PRMが暗黙に前の文脈を見ている場合には十分に働きます。実務では $V_{\min}$ から試すのが素直です。

検証器まわりの結論

ここまでを整理すると、Test-Time Scalingの精度は3層で決まっています。

  1. 上限:$\text{pass@}N = 1-(1-p)^N$。生成側の多様性と正答率だけで決まる天井
  2. 到達点:検証器の分離度 $d$ が決める。$d$ が小さいと $\log N$ でしか近づけない
  3. 崩壊:検証器に系統的な穴があると、$N$ を増やすほど下がる

そして「計算量をどれだけ積むか」は、この3層とは別に予算という制約を受けます。次はその配分の話です。

計算量をどう配るか — compute-optimalな配分

問題設定

$|Q|$ 問の問題集があり、問題 $i$ の1回あたり正答率を $p_i$ とします。総サンプル予算 $B$ を各問題に $n_i$ 本ずつ配り、$\sum_i n_i = B$ を守りながら期待正解数を最大化したい。完全検証器を仮定すると(式(6))、目的関数は

$$ \max_{n_1, \dots, n_{|Q|}} \; \sum_{i} \Bigl[1 – (1-p_i)^{n_i}\Bigr] \quad \text{s.t.} \quad \sum_i n_i = B, \; n_i \in \mathbb{Z}_{\ge 0} \tag{15} $$

です。$n_i$ を連続に緩和してラグランジュ乗数 $\lambda$ を導入し、$\partial / \partial n_i = 0$ とすると

$$ -(1-p_i)^{n_i} \ln(1-p_i) = \lambda \quad\Longrightarrow\quad n_i^\ast = \frac{\ln\!\bigl(-\lambda / \ln(1-p_i)\bigr)}{\ln(1-p_i)} \tag{16} $$

が最適性条件です。式(16)は分かりにくいので、離散版の限界利得で読み替えましょう。問題 $i$ に $n$ 本目を足したときの利得の増分は

$$ \Delta_i(n) = \bigl[1 – (1-p_i)^{n+1}\bigr] – \bigl[1 – (1-p_i)^{n}\bigr] = p_i (1 – p_i)^{n} \tag{17} $$

です。式(17)は $n$ について単調減少なので、目的関数は各 $i$ について凹。分離可能な凹関数を予算制約下で最大化する問題は、限界利得が最大の相手に1本ずつ配る貪欲法で厳密に最適解が得られます。最適解では、$n_i > 0$ であるすべての問題で $\Delta_i(n_i – 1) \ge \lambda \ge \Delta_i(n_i)$ が成り立ち、$p_i < \lambda$ の問題には1本も配られません。

何が起きるか:3つの領域

式(17)を眺めると、興味深い構造が見えます。$n = 0$ での限界利得は $p_i$ そのものなので、最初の1本は易しい問題ほど価値が高い。しかし易しい問題は $(1-p_i)^n$ が急速に0に近づくので、2本目以降の価値が一気に落ちます。逆に難しい問題は最初の1本の価値が低いものの、価値の減り方も緩やかです。

この綱引きから、予算は3つの領域に分かれます。

  • 易しすぎる問題($p_i$ が1に近い):1〜2本で十分。それ以上は無駄
  • 難しすぎる問題($p_i$ が $\lambda$ 未満):1本も配らない。何本引いても当たらないので諦めるのが最適
  • 中間の問題:ここに予算が集中する

「難問に多く配る」というスローガンは、正確には「解ける見込みのある難問」に多く配るでなければいけません。実際に解いてみましょう。

import numpy as np

rng = np.random.default_rng(11)
P = np.clip(rng.beta(1.3, 2.2, size=300), 1e-3, 0.999)   # 300問の難易度分布
P.sort()

def greedy_alloc(P, B):
    """限界利得 p(1-p)^n が最大の問題に1本ずつ配る(分離凹なので厳密に最適)"""
    n = np.zeros(len(P), dtype=int)
    gain = P.copy()                     # n=0 での限界利得は p
    for _ in range(B):
        j = int(np.argmax(gain))
        n[j] += 1
        gain[j] = P[j] * (1 - P[j])**n[j]
    return n

def solved(P, n):
    return float(np.sum(1 - (1 - P)**n))

for per in (1, 4, 12, 32):
    n_opt = greedy_alloc(P, per * len(P))
    print(f"1問あたり平均{per:2d}本: 最適配分 {solved(P, n_opt):5.1f} 問 / "
          f"均等配分 {solved(P, np.full(len(P), per)):5.1f} 問 / "
          f"1本も割かれない問題 {(n_opt == 0).mean() * 100:.1f}%")

出力です。

1問あたり平均 1本: 最適配分 118.5 問 / 均等配分 106.5 問 / 1本も割かれない問題 36.0%
1問あたり平均 4本: 最適配分 221.1 問 / 均等配分 213.0 問 / 1本も割かれない問題 6.7%
1問あたり平均12本: 最適配分 282.6 問 / 均等配分 270.0 問 / 1本も割かれない問題 0.7%
1問あたり平均32本: 最適配分 299.2 問 / 均等配分 290.1 問 / 1本も割かれない問題 0.0%

同じ予算でも配り方だけで7〜13問の差が出ています。とくに予算が絞られた「1問あたり平均1本」のケースでは、最適配分は36%の問題を完全に見捨てることで、残りに複数本を回し、均等配分より12問多く解いています。「全部の問題に平等に1回ずつ挑戦する」のは、直感的には公平ですが、期待正解数の観点では明確に劣ります。図で見るとこの構造がはっきりします。

難易度分布に対するcompute-optimalな計算量配分を貪欲法で厳密に解いた図

左のパネルが最適配分 $n_i^\ast$ を $p_i$ に対してプロットしたものです(総予算1200本、300問)。きれいな逆U字になっています。$p_i < 0.062$ の問題には0本、ピークは $p_i \approx 0.12$ 前後で6本、そこから右へ階段状に減り、$p_i > 0.7$ の易しい問題は1〜3本、最も易しい問題($p_i = 0.94$)はわずか1本です。均等配分の水平線(4本)と比べると、易しい問題から予算を奪って中程度の難問に回している構図が見えます。

右のパネルでは、均等配分がどの予算でも最適配分に届いていません。差は予算とともに単調に変わるわけではなく、7.3問から12.6問の間を行き来しています。予算が小さいときは「諦める判断」で差がつき、予算が大きいときは「易しい問題への過剰投資を止める判断」で差がつくためです。

現実の壁:$p_i$ は事前に分からない

式(15)の解は $p_i$ を知っている前提で導きました。しかし実際には、問題を見た時点でその問題の正答率は分かりません。これがcompute-optimalな配分の最大の実務的障害です。

現実的な対処は逐次的な推定です。まず全問題に少数のサンプル(たとえば4本)を配り、その4本の一致度を難易度の代理指標として使います。4本が全員同じ答えなら易しいと判断して打ち切り、バラバラなら難しいと判断して追加予算を配る。多数決の一致率は $p$ の単調増加関数なので、これは筋の通った推定になります。さらにPRMがあれば、途中ステップのスコアの低さからも難易度を推定できます。

もう一つのつまみが思考長の制御です。「考えるのをやめる/続ける」をトークン列に直接介入して制御する方法があり、たとえば終了しようとしたところに「Wait,」のような継続トークンを差し込んで思考を延長したり、逆に思考予算に達したら強制的に「したがって答えは」に切り替えて打ち切ったりします(budget forcing と呼ばれる手法群)。この単純な介入だけで、思考トークン数と精度の間に単調な関係を作れることが知られています。

これらはすべて「外から」計算量を注入する手段でした。では、モデル自身に「長く考える」ことを覚えさせることはできないのでしょうか。

長く考える方策を学習で獲得する — 推論モデルへの接続

外付けと内在化

ここまで扱った手法は、すべて推論時に外から足すものでした。プロンプトで思考を促し、複数本サンプリングし、検証器で選ぶ。モデル自体は何も変わっていません。

これに対して、「長い思考を書く」という振る舞いそのものを方策として学習させる路線があります。OpenAIのo1系やDeepSeek-R1に代表される推論モデルがこれです。学習の枠組みは強化学習で、報酬には「最終答えが正解か」という検証可能な信号(RLVR: Reinforcement Learning with Verifiable Rewards)を使います。数学なら答え合わせ、コードならテストの合否です。

面白いのは、報酬が「正解したか」だけであって「長く考えろ」とはどこにも書いていないのに、学習が進むと生成される思考が自然に長くなることです。長く考えたほうが正解率が上がるなら、報酬最大化はその方向へ方策を押します。「行き詰まったら別の方針を試す」「自分の計算を検算する」といった振る舞いも、明示的に教えていないのに出現します。

この学習に使われるアルゴリズムの1つが GRPO で、PPOのcriticをグループ内の相対順位で置き換えることでメモリと計算を大幅に削減しています。詳しくはGRPOとは?DeepSeek-R1を生んだ強化学習をPPOとの違いから完全解説を参照してください。報酬モデルの学習と方策最適化の基礎についてはRLHFの仕組みを3ステップで完全理解するが前提になります。

外付けと内在化の関係

この2つは競合ではなく、補完関係にあります。

内在化の利点はコスト効率です。外付けの Best-of-$N$ は $N$ 本ぶんの計算量を毎回払いますが、学習で「良い思考」を方策に埋め込めば、1本の生成で同等の質に近づけます。式(6)の言葉で言えば、内在化は $p$ そのものを上げる操作です。$p$ が上がれば pass@$N$ の天井も上がるので、外付けの効きも良くなります。

外付けの利点は柔軟性です。学習が済んだあとでも、重要な問題には $N$ を増やすという判断ができます。推論モデルに対してさらに多数決や Best-of-$N$ を重ねると精度が上がるのは、この独立性のおかげです。

そして両者は同じ落とし穴を共有します。報酬ハッキングです。RLで検証器を最適化対象にすると、方策は検証器の穴を突く方向へ進みます。図4の左パネルで見た「$N$ を増やすと下がる」現象は、$N$ を増やす代わりに学習ステップを増やしても同じ形で現れます。報酬設計の落とし穴については報酬設計の理論と実践が詳しいです。

限界とコスト

魅力的な話ばかり書いてきたので、正直に代償を整理します。

収穫逓減は避けられない

式(2)、式(6)、式(8)のいずれからも同じ結論が出ました。精度は計算量の対数に対して線形にしか伸びません。計算量を10倍にして得られる改善と、100倍にして得られる改善は、だいたい同じ幅です。「計算量を増やせば無限に賢くなる」わけではなく、実用的な範囲はせいぜい1〜2桁だと考えるべきです。図4の左パネルで $d=0.5$ の曲線が $N$ を16倍にして $0.12$ しか伸びなかったのは、その典型例でした。

レイテンシは系統によって性質が違う

同じ「計算量10倍」でも、体感は大きく異なります。

  • 並列サンプリング:$N$ 本を同時に走らせられるので、GPUが足りる限り実時間は伸びません。コストだけが $N$ 倍になります
  • 逐次修正:ラウンドを直列に回すので、実時間もラウンド数に比例して伸びます。対話型のUIでは致命的になり得ます
  • 長い思考:トークンを1本ずつ順に生成するので、実時間は思考長に比例します。ここは投機的デコーディングのような生成高速化技術と組み合わせる価値が大きい領域です

「精度が上がるならレイテンシは気にしない」で済む用途(バッチ処理、オフライン分析)と、そうでない用途(チャット、コード補完)を分けて設計する必要があります。

コストの非対称性

繰り返しになりますが重要なので再掲します。学習コストは全クエリで償却されるのに対し、推論コストは1クエリごとに発生します。月100万クエリを捌くサービスで1問あたりの計算量を10倍にすると、推論費用がそのまま10倍になります。Test-Time Scalingは「無料の性能向上」ではなく、明確な単価の上昇と引き換えの性能向上です。

だからこそ前節の配分の議論が効いてきます。全クエリに一律10倍を配るのではなく、難しいクエリにだけ配る。式(15)の枠組みは、そのまま製品の予算設計に持ち込めます。

報酬ハッキング

図4で見たとおり、検証器に系統的な穴があると、計算量を増やすほど精度が下がります。しかも厄介なのは、検証器のスコア自体は上がり続けることです。「モデルの評価指標は改善しているのに実際の品質は落ちている」という、最も見つけにくい種類の劣化が起きます。

対策は地味です。検証器のスコアとは独立な評価セットを別に持ち、$N$ を振ったときの真の精度を定期的に測る。図4の左パネルのような曲線を自分のシステムで描いてみて、ピークがどこにあるかを知る。そのうえでピークの手前で $N$ を止める。これが実務上ほぼ唯一の防御です。

考えすぎ(overthinking)

最後に、比較的新しく認識されるようになった問題です。推論モデルは、易しい問題に対しても長大な思考を書いてしまう傾向があります。「2+3は?」に数百トークンの検討を費やすのは、コストの無駄であるだけでなく、精度の面でも損をします。

なぜ精度が落ちるのでしょうか。式(9)〜(12)の枠組みで説明がつきます。長く考えるということは、実質的に自己修正ラウンドを多く回すことです。$a_0$ がすでに高い(易しい問題なので最初から正解できている)状態で、$\alpha > 0$ の修正を重ねれば、式(12)の条件を満たして精度は下がります。易しい問題ほど、考えるほど損をするという構造です。

対策は、やはり難易度に応じた計算量制御です。思考予算を問題ごとに変える、一定トークン数で強制的に打ち切る、簡単そうな問題は推論モデルではなく通常のモデルにルーティングする、といった手が使われます。式(15)の最適配分が「易しい問題には1〜2本しか配らない」と言っていたのと、同じ結論に別方向から到達しているわけです。

検証器が作れない領域

そもそもTest-Time Scalingの効きは、検証器の作りやすさに強く依存していました。数学・コード・論理パズルのように正誤が機械的に判定できる領域では劇的に効きます。一方で、エッセイの良し悪し、戦略提案の妥当性、デザインの好ましさといった正解が定義できない領域では、$d$ を大きくすること自体が困難です。多数決も、答えが自由記述だと「同じ答え」の判定ができないので素朴には使えません(意味的な等価性でクラスタリングする拡張はありますが、その判定自体がまた誤差源になります)。

Test-Time Scalingの適用範囲を見極めるには、まず「この問題に対して、そこそこ信頼できる検証器を作れるか」を問うのが最短です。作れないなら、計算量を積んでも報われません。

まとめ

本記事では、Test-Time Scaling(推論時スケーリング)について解説しました。

  • 第4の軸:従来のスケーリング則が扱ってきたパラメータ数・データ量・学習計算量に加えて、推論時計算量 $C_{\text{test}}$ という軸がある。学習時の3軸と違い、これは問題ごとに動かせるが、クエリごとに毎回払う必要がある
  • 3系統:並列サンプリング(Best-of-$N$・多数決)、逐次修正(自己反省ループ)、探索(ステップ単位のビームサーチ・木探索)。どれも計算量を増やす点は同じだが、精度への変換効率がまるで違う
  • 多数決の数理:誤答が $m$ 種類に分かれるとき、$N \to \infty$ で多数決が勝つ条件は $p > 1/(m+1)$。Condorcetの $p > 1/2$ は $m=1$ の特別な場合にすぎず、間違え方が多様な問題ほど多数決は低い正答率から効き始める
  • 検証器が天井を決める:生成側の上限は $\text{pass@}N = 1-(1-p)^N$。そこに実際どこまで届くかは検証器の分離度 $d$ で決まり、$d=0$ なら計算量をいくら積んでも $p$ のまま。さらに検証器に系統的な穴があると、$N$ を増やすほど精度が下がる(報酬ハッキング)
  • 逐次修正の落とし穴:自己修正は $a_{t+1} = a_t(1-\alpha) + (1-a_t)\beta$ という2状態マルコフ連鎖で、収束先は $a^\ast = \beta/(\alpha+\beta)$。$a_0 > a^\ast$ なら修正するほど悪化する。$\alpha$(正解を壊す確率)を0に近づけるには外部フィードバックが要る
  • ORMとPRM:結果だけを見るORMでは正解1本を得る期待コストが $L/q^L$(指数)、ステップ単位で見るPRMなら $L/q$(線形)。チェーンが長いほどPRMの価値が上がる
  • compute-optimalな配分:限界利得 $p_i(1-p_i)^{n_i}$ を揃えるのが最適で、結果として予算は「解ける見込みのある中程度の難問」に集中する。易しすぎる問題にも難しすぎる問題にも配らないのが正解
  • 限界:精度は $\log$(計算量)でしか伸びない。推論コストは償却されない。逐次系はレイテンシに直撃する。報酬ハッキングと考えすぎ(overthinking)は、どちらも「増やしすぎると下がる」型の失敗

Test-Time Scalingを一言でまとめるなら、「賢さを学習時に買い切るのではなく、必要なときに必要なだけ借りる」技術です。そして借りた計算量が実際に賢さに変わるかどうかは、ほぼ完全に検証器の質が握っています。検証器を作れる問題領域を見つけることが、この技術を使ううえで最初にやるべき仕事になります。

次のステップとして、以下の記事も参考にしてください。