Self-Consistencyサンプリング
複数の推論経路を比較して投票します。
「Self-Consistencyサンプリング」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
1本のチェーンは脆い
1本のChain-of-Thoughtだけでは、初期段階で誤った方向へ進み、そのまま立て直せないことがあります。Self-consistency(Wang et al., 2022)は、多数の独立した推論経路をサンプリングし、通常は多数決によって最終回答を集約することで、この問題に対処します。
直感的には、正しい推論は多様な経路を通っても同じ答えに収束しますが、誤りはばらばらになります。集約によって、一貫したシグナルが増幅されます。
def self_consistency(prompt, n=20, temperature=0.7):
answers = []
for _ in range(n):
chain = llm(prompt, temperature=temperature)
answers.append(extract_answer(chain))
return majority_vote(answers)経路にわたる周辺化が機能する理由
Self-consistencyは、推論経路にわたる周辺化を近似します。1つの潜在的な導出を信頼するのではなく、多数の導出を統合した、最も確率の高い最終回答を推定します。
これは回答分布のモンテカルロ推定です。特に回答空間が小さく離散的な場合、その分布の最頻値は、個別にサンプリングしたどの経路よりも通常は信頼性が高くなります。
from collections import Counter
def majority_vote(answers):
norm = [normalize_answer(a) for a in answers]
counts = Counter(norm)
answer, votes = counts.most_common(1)[0]
confidence = votes / len(norm)
return answer, confidence温度による多様性
Self-consistencyには多様な経路が必要です。貪欲法やほぼゼロの温度では、ほぼ同一のチェーンが生成されるため、この手法の効果が失われます。適度な温度(多くの場合0.5〜0.8)を使い、必要に応じてtop-p samplingも使って経路を分散させてください。
温度が高すぎると個々のチェーンの品質が低下します。温度は単一チェーンの品質ではなく、アンサンブル全体の精度が最大になるように調整してください。
def tune_temperature(prompt, val_set, temps=(0.4, 0.6, 0.8, 1.0)):
best = max(
temps,
key=lambda t: ensemble_accuracy(prompt, val_set, temp=t, n=20)
)
return best回答の正規化は重要
同値の回答が同じものとして認識されなければ、投票は正しく集計できません。集計前に正規化してください。単位を削除し、数値を標準形にそろえ、テキストを小文字化し、分数と百分率を解析し、タスク固有の同値性を適用します。
正規化が不十分だと、正しい回答の多数派が表記の違いによって分散し、少数派の回答が投票に勝ってしまいます。
def normalize_answer(a):
a = a.strip().lower().rstrip('.')
a = a.replace(',', '').replace('$', '').replace('%', '')
try:
return str(round(float(a), 6)) # numeric canonical form
except ValueError:
return aサンプルはいくつ必要か
サンプル数nを増やすと精度は向上しますが、収穫逓減が起こり、タスクの難易度によっては10〜40個程度で頭打ちになることがよくあります。サンプルを1つ増やすたびに、コストとレイテンシーは線形に増加します。
検証セットでnを変えて評価し、サンプルを追加してもコストに見合う効果が得られなくなる曲線の屈曲点を選んでください。
def sweep_n(prompt, val, ns=(1,3,5,10,20,40)):
return {n: ensemble_accuracy(prompt, val, n=n) for n in ns}
# Choose n at the accuracy/cost knee, not the maximum適応的な早期停止
適応的サンプリングによって計算量を節約できます。投票結果が決定的になったら、経路のサンプリングを止めます。5個のサンプルを取得した時点で1つの回答が大差でリードしているなら、さらにサンプルを取得しても勝者が変わる可能性は低いでしょう。
これにより、本当に難しく意見が分かれる項目に計算量を集中させ、簡単な項目には低コストで回答できます。
def adaptive_sc(prompt, max_n=40, margin=0.6, min_n=5):
answers = []
for i in range(max_n):
answers.append(extract_answer(llm(prompt, temperature=0.7)))
if i + 1 >= min_n:
ans, conf = majority_vote(answers)
if conf >= margin:
return ans, conf, i + 1
return majority_vote(answers)重み付き投票と検証器を利用した投票
単純な多数決では、すべての経路を同等に扱います。経路に対してモデルが割り当てた尤度、学習済み検証器のスコア、または各チェーンの妥当性に対する自己評価に基づいて、投票に重みを付けることもできます。
検証器で重み付けしたself-consistencyは、確信を持って誤るものの頻繁に現れる失敗パターンの順位を下げられるため、重み付けしない投票を上回ることがよくあります。
def weighted_vote(chains):
scores = {}
for c in chains:
a = normalize_answer(extract_answer(c))
scores[a] = scores.get(a, 0.0) + verifier_score(c)
return max(scores, key=scores.get)一致度から信頼度を得る
投票差は、役立つ信頼度シグナルです。全員一致の回答は、6対5の僅差の回答よりはるかに信頼できます。この情報を後続のロジックに渡してください。一致度が低い項目は、エスカレーション、人手によるレビュー、またはより強力なモデルへ振り分けます。
これにより、self-consistencyは精度を高めるだけでなく、キャリブレーションの仕組みにもなります。
def route(prompt):
ans, conf = adaptive_sc(prompt)[:2]
if conf < 0.5:
return escalate_to_stronger_model(prompt)
return ans限界:連続的なタスクと自由記述のタスク
多数決は、離散的で比較可能な回答空間を前提とします。自由形式の生成、長文、あるいは2つのサンプルが同一にならない連続値の出力には、そのまま適用できません。
このようなタスクでは、意味的に近い出力をクラスタリングする、抽出した構造化フィールドについて投票する、または完全一致を数えるのではなく判定モデルで最良のサンプルを選ぶなど、別の方法で集約してください。
def semantic_consistency(samples):
clusters = cluster_by_embedding(samples)
biggest = max(clusters, key=len) # largest agreement cluster
return representative(biggest) # medoid of the clusterコストを考慮した導入
Self-consistencyは、最もコストの高いプロンプト技法の1つです。コストはnに比例します。重要度の高い項目や難しい項目に限定し、適応的な停止と組み合わせてください。また、簡単なリクエストは単一チェーンで処理する段階的なポリシーも検討しましょう。
同じ程度の改善を得る場合、単一のより強力なモデル呼び出しのほうが安い可能性もあります。必ず、1ドル当たりの精度を比較してください。
def tiered(prompt, q):
if easy(q):
return extract_answer(llm(prompt, temperature=0))
return adaptive_sc(prompt, max_n=20)[0] # SC only when neededエンドツーエンドのSelf-consistency
完全なパイプラインは次のとおりです。温度とnを調整し、多様なチェーンをサンプリングし、回答を厳密に正規化し、投票(必要に応じて検証器で重み付け)を行い、投票差を信頼度として使い、結果が決定的になったら早期に停止し、一致度が低い項目をエスカレーションします。
これにより、単一のチェーンよりも高精度で、自己キャリブレーション可能な推論システムが得られます。
def solve(prompt):
chains = sample_until_decisive(prompt, max_n=20, temp=0.7)
ans, conf = weighted_majority(chains)
if conf < THRESH:
return escalate(prompt)
return {'answer': ans, 'confidence': conf, 'paths': len(chains)}クイックチェック
性能が低いself-consistencyの構成を診断してみましょう。
まとめ
重要なポイント:
- Self-consistencyは、多様なチェーンを多数サンプリングして投票し、推論経路にわたる周辺化を近似します。
- 機能させるには、多様性(適度な温度)と厳密な回答の正規化が不可欠です。
nを増やすと精度は向上しますが、やがて頭打ちになります。コストを管理するには、適応的な早期停止を使ってください。- 検証器で投票に重みを付け、投票差をキャリブレーションされた信頼度シグナルとして使います。
- 離散的な回答空間が必要です。自由記述のタスクでは、意味に基づくクラスタリングや判定モデルを使ってください。
よくある質問
「Self-Consistencyサンプリング」レッスンは無料ですか?
はい。「Self-Consistencyサンプリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「Self-Consistencyサンプリング」で何を学びますか?
複数の推論経路を比較して投票します。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Self-Consistencyサンプリング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Chain-of-Thoughtプロンプティング
- Self-Consistencyサンプリング
- Tree-of-Thought探索
- 推論プロンプトが役立つ場面