サンプリングは賭けだ — 1 回の正解 vs N 回の多数決、self-consistency で精度を買う代償を実測する

by ZeroZawa

Part 1 で、LLM が 1 トークンずつ確率分布からサンプリングしていることを覗きました。あのとき棚上げにしていたことがあります。「確率分布から選ぶ」ということは、同じ質問を何度投げても、毎回同じ答えが返ってくるとは限らない、ということです。

これは欠陥でしょうか。今回は、このブレを逆に資源として使う方法を実測します。同じ質問を何度もサンプリングし、出てきた答えの多数決を取ると、1 回だけ聞くより正答率が上がることがあります。ただし、N 回聞けばほぼ N 倍のコストがかかります。上がる精度と、払うコスト。この取引の実際の相場を、自分の Mac で測った数字で確かめます。

この連載の現在地 — 答えを「買う」側の工夫

  • ここまで分かっていること — Part 2 で self-attention が系列長の二乗(O(T²))で重くなること、Part 3 で KV キャッシュが文脈長に線形で膨らみ decode が memory-bound になることを実測しました
  • 今回新しく説明できること — greedy / temperature / top-p というサンプリングの選び方の違い、そして同じ質問を複数回サンプリングして多数決を取る self-consistency で、正答率とコストがどう動くか
  • 今回はやらないこと — PHOTON のマルチクエリ集約そのものの仕組みは Part 6 へ、ゼロからの学習は Part 5 へ送ります
  • PHOTON のどの主張につながるか — 「余分な計算(test-time compute)で品質を買い戻す」という経済そのものが、最終回で見る PHOTON のマルチクエリ集約と共通する発想です。ただし機構は別物なので、ここでは経済の相似形だけを置き、接続は最終回にまとめて行います

サンプリングの基本 — logits から一歩選ぶまで

モデルは 1 トークンごとに、語彙全体に対する確率分布(logits を softmax にかけたもの)を出力します。そこから実際にどのトークンを選ぶかには、いくつかのやり方があります。

greedy(貪欲法) は、最も確率の高いトークンを常に選びます。argmax そのものです。決定論的なので、同じ入力に対して常に同じ出力が得られます。

temperature は、softmax に入れる前に logits を x / T でスケーリングします1。T が高いほど分布は平坦になり、低い確率のトークンにもチャンスが回るようになります(多様だが荒れやすい)。逆に T が低いほど分布は尖り、最も確率の高いトークンに収束していきます。実装上、T=0 は 0 除算になるため特別扱いされ、事実上 argmax(greedy)と同じ結果になります1

top-p(nucleus sampling) は、確率の高い順にトークンを足し合わせていき、累積確率が閾値 p を超えた時点で打ち切って、その集合の中だけからサンプリングします1。分布の裾(ごく低確率で意味の通らないトークン)を切り捨てつつ、temperature が作った多様性は保つ、という役割分担です。

なぜ greedy だけでは多数決が意味を持たないのか

ここで、今回の本題につながる素朴な疑問が出てきます。「同じ質問を 10 回聞いて多数決を取れば、もっと賢くなるのではないか」。

greedy(あるいは T=0)でこれをやっても意味がありません。決定論的だからです。同じ入力・同じモデルに対して、10 回問いかければ 10 回とも寸分違わず同じ答えが返ってきます。多数決を取る母集団そのものが存在しないのです。

多数決に意味を持たせるには、まず 意見の多様性 を作る必要があります。そのために temperature を 0 より大きくして、独立に何度もサンプリングします。これが self-consistency の出発点です。

self-consistency: 実験設計

self-consistency は、chain-of-thought プロンプティングの手法です。貪欲な 1 本の推論経路の代わりに、temperature>0 で多様な推論経路を複数サンプリングし、それぞれの最終回答を集計して最も多く出た答えを採用します2。原論文では PaLM-540B を使い、GSM8K(小学校算数の文章題)で単発 56.5% だった正答率が、self-consistency(N=40)で 74.4% まで上がったと報告されています2

自分の実験では、この効果をローカルの小型モデルで測ります。使うデータセットは GSM8K の公式テストセット3から先頭 150 問を固定で選んだもの(gsm8k_subset.jsonl、committed)です。正解は #### <数値> という形式で埋め込まれています3

モデルは mlx-community/Qwen2.5-1.5B-Instruct-4bit を選びました。単発(greedy)の正答率が 54.0%(150 問中 81 問)と、極端に弱すぎず(伸びしろがある)強すぎず(すでに飽和していない)ちょうどよい帯に収まっていたためです。

実験の手順は次の通りです。

  1. 各問題について、greedy で 1 本(N=1 の基準点)と、temperature=0.7, top_p=0.95 で M=20 本を独立にサンプリングします
  2. N=3, 5, 10, 20 それぞれの maj@N 正答率は、このプール(サイズ M=20)から N 個を非復元抽出する試行を 200 回繰り返して多数決精度を平均する形で見積もります。N の数だけ生成をやり直す必要はなく、1 問あたり「greedy 1 回 + サンプル 20 回」= 21 回の生成で 5 通りの N すべてを評価できます
  3. 個々の問題の推定値をさらに、問題集合そのものを 2,000 回リサンプル(復元抽出)する bootstrap で、データセット全体の正答率の 95% 信頼区間(percentile 法)を出します4

実測: N を増やすほど正答率は上がるが、伸びは鈍る

self-consistency: N を増やすほど正答率は上がるが、伸びは鈍る

GSM8K 150問 / Qwen2.5-1.5B-Instruct-4bit / Apple M5 Pro・bootstrap 95% CI (2,000 resamples)

95%CI上限95%CI下限平均正答率
50556065707580↑ 正答率 (%)2468101214161820N (サンプル数) →
N=1とN=20の95%信頼区間はほぼ重ならず(46.0-62.0%対70.0-83.3%)、この差はノイズではない。ただしNを増やすたびの伸びは8.2→5.7→4.9→3.9ポイントと徐々に縮小する(diminishing returns)。
N(サンプル数)正答率95% CI前段からの伸び
1(greedy)54.0%[46.0%, 62.0%]
362.2%[56.5%, 67.7%]+8.2pp
567.9%[62.2%, 73.8%]+5.7pp
1072.8%[66.8%, 78.8%]+4.9pp
2076.7%[70.0%, 83.3%]+3.9pp

N=1 から N=20 まで、正答率は 54.0% から 76.7% へと着実に上がっています。N=1 と N=20 の信頼区間はほとんど重なっておらず(46.0-62.0% 対 70.0-83.3%)、この 22.7pp の差は bootstrap 2,000 回のリサンプルで見てもノイズでは説明できない実質的な改善です。

ただし、伸び方をよく見ると鈍化しています。N を 1→3 に増やしたときの伸びは +8.2pp でしたが、3→5 では +5.7pp、5→10 では +4.9pp、10→20 では +3.9pp と、N を増やすたびに得られる追加の正答率は小さくなっていきます。これは自分の実験に限った話ではなく、self-consistency 一般で観察される diminishing returns(逓減)です5。原論文の PaLM-540B(N=40 で 56.5%→74.4%、+17.9pp)と比べると規模も N も違うため単純比較はできませんが、「大きく伸びる」という方向感自体は一致しています2

コストの実態 — N 倍のクエリはほぼ N 倍の時間

コストは正確に N 倍、正答率はそれに比例しない

GSM8K 150問 / Qwen2.5-1.5B-Instruct-4bit / Apple M5 Pro・実測 wall-time

5001,0001,5002,0002,5003,0003,500↑ 総所要時間 (秒)2468101214161820N (サンプル数) →
N=1から20でクエリ数・所要時間はちょうど20倍(183.6秒→3,672.3秒)。一方で正答率は54.0%→76.7%、約1.42倍にとどまる。

正答率が上がる一方で、その代償も直接測っています。

N(サンプル数)総クエリ数実測 wall-time
1(greedy)150183.6 秒
3450550.9 秒
5750918.1 秒
101,5001,836.2 秒
203,0003,672.3 秒

N=1 から N=20 まで、クエリ数はちょうど 20 倍(150→3,000)、実測した時間もほぼ正確に 20 倍(183.6 秒→3,672.3 秒)です。一方で正答率の伸びは 54.0%→76.7%、約 1.42 倍にとどまります。N 倍のクエリを払っても、精度は N 倍にはならないのです。

さらに言えば、この効果は使うモデルにも左右されます。最近の研究では、すでに単発で高精度なモデルほど self-consistency の効果は薄れ、コストだけがサンプル数に比例して増え続けることが指摘されています5。今回、はっきりした伸びが観察できたのは、単発正答率 35〜60% 帯というちょうどよい弱さのモデルを選んだから、という側面もあります。「N 回聞けば聞くほど賢くなる」という単純な話ではなく、free ではないコストを払って、伸びしろのある場面でだけ効く買い物、というのが実像に近いところです。

多数決が効くとき、効かないとき

150 問を個別に見ていくと、self-consistency の効き方にはっきりした濃淡がありました。

  • 34 問 は、greedy では間違えたものの、20 本の多数決では正解に転じました(「救われた」問題)
  • 0 問 は、逆に greedy では正解だったのに、20 本の多数決では不正解に転じました。今回の実験では観測されませんでしたが、原理的には多数決が正解を押しのけてしまうことも起こり得ます
  • 35 問 は、20 本の多数決でも依然として不正解のままでした

この 35 問の内訳を、20 本のサンプルがどれくらいバラけていたかで見ると濃淡があります。17 問は特定の誤答に票が集中せず、20 本がバラバラの数値に散らばっていました(モデルがそもそも解き方を掴めていない、独立なノイズに近い状態)。残る 18 問は、同じ誤答に半数前後の票が集まっており、その中でも 6 問は 20 本中 10 本以上が 同じ 誤答で一致していました。

その 6 問のうち、Q41(ドラゴンと投槍の問題)が特に示唆的でした。問題は「ドラゴンの炎が届く 1,000 feet の範囲外から、射程 400 feet の槍を、射程が 3 倍になる宝石を持って投げるとき、範囲外に何 feet 出た位置から届くか」という 2 段階の計算を要求します。正解は「400×3=1,200 feet」まで届き、そこから「1,200-1,000=200 feet」で 200 が最終解です。20 本のサンプルのうち 12 本が、最初の掛け算「1,200 feet」を出した時点で「これが答えだ」と結論づけ、2 段階目の引き算を飛ばして誤答していました。これは抽出した数値からの推測ではなく、同じ設定で生成し直した完成文を読んで確認した挙動です。

これは独立なランダムノイズではありません。同じ思考の飛ばし方が、サンプルの過半数に 相関して 現れています。self-consistency の多数決は「各サンプルの誤りが互いに独立である」ことを暗黙に仮定しています。モデルが問題文の同じ箇所を同じパターンで読み違えるとき、その誤りはサンプル間で相関してしまい、何回サンプリングしても多数決では直りません。ただし、これは 35 問のうち 6 問という少数派の振る舞いです。残り大半(17 問)は票が集中すらしない、ただの「解けていない」問題でした。ブレを均せるのはランダムなノイズだけで、系統的な誤りには効かない、というのが自分の実験で見つけた限界です。

PHOTON への接続 — 別機構、同じ経済

self-consistency は「独立に複数サンプリングして多数決を取る」という仕組みです。Part 6 で扱う PHOTON のマルチクエリ集約は、これとは機構がまったく違います(アーキテクチャ・スループット層での集約です)。同じ「補償」という言葉で語ってしまうと誤解を招くので、ここでは機構の違いを明記しておきます。

それでも両者には共通する経済があります。余分な計算(test-time compute)を払って、品質を買い戻すという発想です。self-consistency は「N 倍のクエリ」という形でこの計算を払い、PHOTON は別の形でこの計算を払います。最終回では、この経済がどう物語的につながるかを本格的に見ていきます。

手元に残るもの と 次回予告

今回手を動かして残ったものを確認します。

  • 動くコード — self_consistency.py(GSM8K 150 問に対する greedy + M=20 サンプルプールの生成、maj@N の bootstrap CI 分析)
  • 測った数字 — 正答率は N=1→20 で 54.0%→76.7%(伸びは鈍化)、コストはちょうど 20 倍、34 問が多数決で救済・35 問は依然不正解(うち 6 問は 20 本中 10 本以上が同じ誤答に集中する系統的パターン、17 問は票が特定の誤答に集中しない独立ノイズ寄り、残り 12 問はその中間)
  • メンタルモデル — self-consistency はランダムなブレを資源に変える買い物であり、系統的な誤りは買えない

次回 Part 5 では、答えを「買う」側の工夫から離れ、モデルそのものを手元でゼロから学習させます。ここまで見てきた既存モデルへの後付けの工夫がすべて使えなくなる場所から、もう一度積み上げ直します。

コードはサンプルコード(companion repo)の part-04 タグで再現できます。clone と各 Part のタグは、companion repo かこの記事末尾のシリーズナビからたどれます。

参考文献

Footnotes

  1. Generation configurations: temperature, top-k, top-p, and test time compute — Chip Huyen - temperature の softmax 数式、T=0 が argmax と等価であること、top-p の定義 2 3

  2. Self-Consistency Improves Chain of Thought Reasoning in Language Models (arXiv:2203.11171) — Wang et al., 2022 - self-consistency の手法定義、PaLM-540B での GSM8K 結果(56.5%→74.4%) 2 3

  3. openai/gsm8k — Hugging Face Datasets / Training Verifiers to Solve Math Word Problems (arXiv:2110.14168) — Cobbe et al., 2021 - GSM8K データセットの概要・ライセンス(MIT)・#### 回答フォーマット 2

  4. ML Classifier Confidence Intervals — Sebastian Raschka - bootstrap による信頼区間の percentile 法

  5. Self-Consistency Is Losing Its Edge: Diminishing Returns and Rising Costs in Modern LLMs (arXiv:2511.00751) — Chiyan Loo - self-consistency の効果がモデルの強さに応じて逓減し、コストがサンプル数に線形に増える指摘 2