Backgammon Sage Proを支えるOpen Sage評価エンジンと、eXtreme Gammonのボットエンジン(XG)との定量的比較。
Open Sage のボットエンジンを、対応する評価レベル — ニューラルネットワークの直接評価、マルチプライ探索、打ち切りロールアウト — で eXtreme Gammon (XG) と比較します。XG はプログラム用のインターフェースを持たないため、Batch Analysis 機能を通じて採点します。相互に補完する 3 つの方法を用います。1 つ目は階層的な基準評価の集合を作り — 選択が明確なところでは高速評価を信頼し、僅差の判断は完全ロールアウトへ引き上げます — その基準に対して各エンジンを Performance Rating (PR) で採点します。対象は 500 局の無制限ゲーム(17,535 の判断)と 130 の 5 ポイントマッチ(18,292 の判断)です。さらに無制限ゲームについては、XG 自身の階層的な分析を基準としてこの比較全体を組み直します — まさに鏡写しの検証です。2 つ目は、Sage 3T と XG Roller++ が実際に食い違う無制限ゲームの局面だけを取り出し、両エンジンの完全ロールアウトの双方に照らして判定します。同じ基準・採点方法を、バックゲーム、コンテインメント、スネークの 13 のベンチマーク — エンジンが歴史的に最も苦手としてきた局面 — にも適用します。強さの研究では両エンジンは接近しています。Sage の基準で採点すると、多くのユーザーが頼る打ち切りロールアウトのレベルでは Sage が上回り、XG の基準で採点すると XG が上回るか互角です。3 つ目は問いを逆転させます。XG で既に解析済みの 290 の実戦トーナメントマッチを Sage で再解析し、両エンジンが各プレイヤーに与える Performance Rating を比較します。両者のレーティングはきわめてよく一致します。580 のプレイヤーレーティングで両者の相関は 98% に達し、平均差は +0.002 PR と統計的にゼロと区別できません。
eXtreme Gammon(XG)はコンピューターによるバックギャモン分析の標準的な基準であり、その評価エンジンは入手できる中で最強クラスと広く見なされています。真剣に受け止められることを目指す新しいエンジンは、「XGと比べてどうなのか?」という単純な問いに答えなければなりません。本研究は、Backgammon Sage Proの中核であるニューラルネットワークエンジンOpen Sageについて、この問いに定量的に答えるものです。
目標は、Open Sageの評価とXGの評価を、同程度の計算量のレベル同士で比較することでした。最も自然な実験 — エンジン同士に何百万ゲームも直接対戦させて結果を集計する — は現実的ではありません。XGのデスクトップアプリにはプログラムから操作できるインターフェースがなく、2つのエンジン間でポジションや手を受け渡すには手作業でクリックしていくしかないからです。強いエンジン同士のわずかな差を検出できるだけのサンプル数に達するには、あまりに時間がかかりすぎます。
そこで代わりに、XGのBatch Analysis機能を利用します。これは数百の棋譜を1回の無人実行でまとめて採点できる機能です。Open Sageが多数のゲームで両サイドをプレイし、各ゲームをXGがインポートできる標準的なテキスト形式でエクスポートし、XGにまとめて分析させ、その判定を読み戻します。この共通の土台の上で、第3節と第4節で説明する2つの異なる手法を適用します。
第3の研究(第5節)はシミュレーションから完全に離れ、XGで分析済みの実戦トーナメントマッチを題材にします。その目的は異なります。どちらのエンジンが強いかではなく、Sageでマッチを分析したプレイヤーが、XGが与えるのと同じパフォーマンスレーティングを得られるかを問うのです — そうであれば、XGでのPRの意味について長年培ってきた感覚を、そのままSageに持ち込めます。
どちらのエンジンも、精度と速度のトレードオフの中でさまざまな深さでポジションを評価できます。結果を読み解くにはこれらのレベルの理解が欠かせません。比較はつねに、2つのエンジンの対応するレベル同士で行われるからです。
直接評価(1プライ)。先読みなしの、ポジションに対するニューラルネットワークの生の出力です。最も高速な設定であり、より深いすべてのレベルの土台になります。(1プライを生のネットワーク評価とするXGの慣例に従っています。)
マルチプライ先読み(2・3・4プライ)。エンジンが数ターン先まで読み、相手の応手を考慮し、各ステップで起こりうる出目について平均を取り、各手順の末端でネットワークの生の評価を行います。プライが1つ増えるごとに精度は上がりますが、計算コストは大幅に増えます。
打ち切りロールアウト(1T、2T、3T)。固定の深さまで探索する代わりに、エンジンは短いシミュレーションゲームを多数プレイし、数ターン後に打ち切って、その時点のポジションをマルチプライ先読みで評価します。分散低減により、サンプリングされたダイスの運の大部分が相殺されます。これがXGの「Roller」設定で、固定深さの探索より強く、それでいてフルロールアウトよりはるかに軽量です。
フルロールアウト。多数のシミュレーションゲームを最後までプレイします。分散低減を用いて十分な回数を実行すれば、フルロールアウトはバックギャモンエンジンが生み出せる中で最もグラウンドトゥルースに近いものであり、本研究では一貫してこれを参照基準として用います。
| 種類 | Sage | XGの相当レベル | 内容 |
|---|---|---|---|
| 直接評価 | 1プライ | 1プライ(生の評価) | ポジションに対する1回のニューラルネットワーク評価 — 先読みなし。 |
| マルチプライ | 2P · 3P · 4P | 2プライ · 3プライ · 4プライ | 相手の応手を数ターン先まで探索し、ダイスについて平均を取る。 |
| 打ち切りロールアウト | 1T · 2T · 3T | Roller · Roller+ · Roller++ | 多数の短いシミュレーションゲームを5〜7ターンで打ち切り、マルチプライで評価(分散低減あり)。3T/Roller++は3プライ判断、2T/Roller+は2プライ、1T/Rollerは1プライを使用。 |
| フルロールアウト | ロールアウト | ロールアウト | シミュレーションゲームを最後までプレイ — 本研究における参照「正解」。 |
第1の手法では、「真の」最善手をできる限り正確に確定させた固定の判断セットに対して、各エンジンを採点します。これは、XGを他の多くのボットと比較した有名な2012年のXG研究と同じアプローチです。
まず、Sage 3P同士の自己対戦による500のアンリミテッドゲームをシミュレーションしました。3Pのようにそこそこ強いレベルは、あらゆるゲームプラン — レース、アタック、プライミング、アンカリング — にわたって現実的なポジション分布を生み出し、これこそテストしたい多様性です。次に、盤上のスコアによってすべての判断の価値が変わる130の5ポイントマッチについて、研究全体をもう一度実行しました。両方の結果を以下に示します。
すべての判断の真の最善手をフルロールアウトで確定させるのは途方もなくコストがかかり、しかも不要です。ほとんどの判断は僅差ではないからです。そこで参照基準は、段階的に深くなる3つのパスで構築し、選択が本当に微妙なところだけにロールアウトの計算量を投入します。同じ手順を両方のデータセットに適用し、各パスは確信を持って解決できる判断を確定させ、残りを次のパスに送ります:
すべての判断を3プライで評価します。最善手が次善手を0.05エクイティより大きく上回る場合、3Pの判定を正解として受け入れ、その判断を確定させます。
残った判断を3Tで再評価します。差が0.02エクイティより広がった場合、3Tの判定を正解として受け入れます。
なお0.02以内にあるものはすべて、Sageのフルロールアウトで確定させます。チェッカープレイとキューブアクションの両方に3P判断を用い、1,296ゲームずつのバッチで、エクイティの95%信頼幅が0.005を下回るまで — または上限の20,736ゲーム(16 × 1,296)に達するまで — 実行します。最も時間のかかるバックゲームのポジションは、1つあたり1時間を優に超えました。
その結果が、すべての判断がその難しさにちょうど見合った深さで解決された、階層化された参照基準です。この同じ3パスの手順を両方のデータセット — 500のアンリミテッドゲームと130の5ポイントマッチ — に対して実行し、得られた階層構成は各セットの結果と並べて以下に示します。
信頼できる評価の階層化セットが手に入れば、任意のエンジンの採点は簡単です。各ベンチマーク判断をエンジンに提示し、選んだ手またはキューブアクションの正解に対するエクイティエラーを記録し、平均エラー × 500をPRとして報告します。同じ合計を、チェッカープレイPRとキューブPRに、さらにゲームプラン別に分けて示します。
XGの採点には、はじめにで述べた追加の手順が必要でした。XGにはAPIがないため、500のアンリミテッドゲームと130のマッチの棋譜に対して、カスタムレベル — 3プライ判断、不一致があればテスト対象のレベルに引き上げ — でBatch Analysisを実行し、各ポジションにおけるXGの最善判断を、XGが出力する
.xg
ファイルから抽出して、同じ参照エクイティに対して採点しました。
500のアンリミテッドゲーム全体で、3つのパスは16,889ポジション(17,535件の判断)を次のように解決しました:
対応する5つのレベルを、これら17,535件の判断で採点しました。PRは低いほど良く、各ペアで強い方のエンジンをハイライトしています。
テストしたすべてのエンジンとレベルのPRを、判断の種類とゲームプラン別に示します。低いほど良い値です。
| エンジン | PR | チェッカー | キューブ | ピュアレース | レース | アタック | プライミング | アンカリング |
|---|---|---|---|---|---|---|---|---|
| Sage 3T | 0.23 | 0.20 | 0.41 | 0.02 | 0.25 | 0.20 | 0.32 | 0.32 |
| XG Roller++ | 0.34 | 0.33 | 0.38 | 0.04 | 0.44 | 0.25 | 0.41 | 0.48 |
| Sage 2T | 0.27 | 0.24 | 0.43 | 0.02 | 0.32 | 0.20 | 0.40 | 0.36 |
| XG Roller+ | 0.41 | 0.41 | 0.39 | 0.05 | 0.60 | 0.31 | 0.47 | 0.54 |
| Sage 1T | 0.49 | 0.50 | 0.43 | 0.04 | 0.58 | 0.43 | 0.62 | 0.64 |
| XG Roller | 0.53 | 0.54 | 0.48 | 0.05 | 0.64 | 0.45 | 0.71 | 0.67 |
| Sage 4P | 0.43 | 0.42 | 0.52 | 0.08 | 0.54 | 0.39 | 0.45 | 0.60 |
| XG 4プライ | 0.47 | 0.46 | 0.52 | 0.06 | 0.59 | 0.40 | 0.57 | 0.59 |
| Sage 3P | 0.60 | 0.60 | 0.61 | 0.13 | 0.78 | 0.53 | 0.67 | 0.75 |
| XG 3プライ | 0.57 | 0.57 | 0.58 | 0.05 | 0.72 | 0.48 | 0.73 | 0.72 |
| Sage 2P | 1.68 | 1.44 | 2.91 | 0.40 | 1.84 | 1.86 | 1.87 | 1.77 |
| Sage 1P | 2.55 | 2.42 | 3.24 | 0.42 | 2.71 | 2.79 | 3.13 | 2.74 |
上の数値はすべて、Sageの階層化された参照基準でエンジンを採点したものです。当然予想される反論はホームアドバンテージ — Sageが自身のロールアウトで測られている — でしょう。そこで、まったく鏡写しの検証を構築しました。同じ500ゲーム、同じ判断に対して、すべての階層でXG自身の分析を正解とするのです。XG 3プライが3P階層の判断を、XG Roller++が3T階層の判断を、XG自身のフルロールアウトがロールアウト階層の判断を確定させます — Sageの参照基準に階層ごとに対応するXG版です。そのうえで、すべてのエンジンをこれに対して再採点しました。
| エンジン | PR | チェッカー | キューブ | ピュアレース | レース | アタック | プライミング | アンカリング |
|---|---|---|---|---|---|---|---|---|
| Sage 3T | 0.28 | 0.26 | 0.41 | 0.02 | 0.40 | 0.23 | 0.31 | 0.37 |
| XG Roller++ | 0.21 | 0.20 | 0.23 | 0.01 | 0.30 | 0.18 | 0.22 | 0.25 |
| Sage 2T | 0.30 | 0.29 | 0.36 | 0.02 | 0.39 | 0.28 | 0.36 | 0.38 |
| XG Roller+ | 0.30 | 0.32 | 0.23 | 0.01 | 0.48 | 0.25 | 0.26 | 0.40 |
| Sage 1T | 0.46 | 0.47 | 0.42 | 0.03 | 0.61 | 0.42 | 0.50 | 0.57 |
| XG Roller | 0.40 | 0.41 | 0.35 | 0.03 | 0.53 | 0.34 | 0.53 | 0.45 |
| Sage 4P | 0.39 | 0.38 | 0.43 | 0.06 | 0.55 | 0.36 | 0.42 | 0.42 |
| XG 4プライ | 0.34 | 0.33 | 0.40 | 0.03 | 0.46 | 0.33 | 0.41 | 0.36 |
| Sage 3P | 0.50 | 0.49 | 0.56 | 0.08 | 0.67 | 0.47 | 0.56 | 0.56 |
| XG 3プライ | 0.41 | 0.41 | 0.40 | 0.03 | 0.54 | 0.36 | 0.52 | 0.46 |
| Sage 2P | 1.38 | 1.17 | 2.44 | 0.30 | 1.57 | 1.50 | 1.55 | 1.45 |
| Sage 1P | 2.19 | 2.07 | 2.81 | 0.36 | 2.27 | 2.44 | 2.71 | 2.30 |
マッチのセットでも同じ3つのパスを実行しますが、1つ追加点があります。各プレイヤーのアウェイスコアとクロフォードのフラグをすべての評価に引き渡し、正解を正しいスコアに対するマッチエクイティ(MWC)空間で計算します。130の5ポイントマッチ全体で、各パスは17,892ポジション(18,292件の判断)を次のように解決しました:
対応する5つのレベルを、これら18,292件の判断で採点しました。PRは低いほど良く、各ペアで強い方のエンジンをハイライトしています。
5ポイントマッチのセットでテストしたすべてのエンジンとレベルのPRを、判断の種類とゲームプラン別に示します。低いほど良い値です。
| エンジン | PR | チェッカー | キューブ | ピュアレース | レース | アタック | プライミング | アンカリング |
|---|---|---|---|---|---|---|---|---|
| Sage 3T | 0.23 | 0.20 | 0.46 | 0.07 | 0.22 | 0.20 | 0.28 | 0.31 |
| XG Roller++ | 0.36 | 0.35 | 0.44 | 0.08 | 0.44 | 0.32 | 0.33 | 0.49 |
| Sage 2T | 0.26 | 0.24 | 0.40 | 0.02 | 0.35 | 0.18 | 0.31 | 0.35 |
| XG Roller+ | 0.44 | 0.44 | 0.44 | 0.09 | 0.54 | 0.44 | 0.39 | 0.55 |
| Sage 1T | 0.47 | 0.47 | 0.47 | 0.06 | 0.55 | 0.45 | 0.55 | 0.56 |
| XG Roller | 0.51 | 0.51 | 0.56 | 0.09 | 0.63 | 0.49 | 0.50 | 0.65 |
| Sage 4P | 0.41 | 0.41 | 0.47 | 0.05 | 0.50 | 0.37 | 0.44 | 0.53 |
| XG 4プライ | 0.46 | 0.45 | 0.58 | 0.09 | 0.59 | 0.44 | 0.42 | 0.60 |
| Sage 3P | 0.56 | 0.54 | 0.71 | 0.05 | 0.73 | 0.55 | 0.59 | 0.63 |
| XG 3プライ | 0.54 | 0.53 | 0.62 | 0.09 | 0.68 | 0.53 | 0.52 | 0.68 |
| Sage 2P | 1.27 | 1.23 | 1.58 | 0.39 | 1.46 | 1.24 | 1.49 | 1.39 |
| Sage 1P | 2.22 | 2.21 | 2.35 | 0.38 | 2.43 | 2.41 | 2.44 | 2.47 |
通常の自己対戦ゲームでは、深いバックゲーム、コンテインメントゲーム、取り残された1個のチェッカーを捕らえる遠い側のプライムはめったに生じないため、アンリミテッドとマッチのセットは、エンジンがそれらをどうプレイするかについてほとんど何も語りません — そしてそれらは、エンジンが歴史的に最も弱かったポジションです。13のポジション群ベンチマークがそれらを直接測定します。各ベンチマークはアンリミテッドベンチマークと同じように — ロールアウト品質の参照基準を備えた実際の判断で — 構築されていますが、判断はその群の内側から抽出されています:
各群は少数のシードポジションから始まります。Sageはそのシードから3プライで自己対戦のアンリミテッドゲームをプレイし、ポジションがまだその群に属している間に生じたすべての判断を記録し、記録された各判断をロールアウトして参照基準を作ります — 5,184ゲームを最後までプレイし、最初の3ハーフムーブはチェッカーとキューブの判断を3プライ、以降は2プライで行い、分散低減を有効にします。候補手の補完パスでは、テスト対象のエンジンが実際に選んだすべての手をロールアウトしたので、以下の各スコアはロールアウト品質の候補手に対するものです。相手がキューブを持っているキューブポジションは手番のプレイヤーの判断ではないため、採点しません。
| ベンチマーク | 判断数 | 2-ply | 3-ply | 4-ply | 1T / Roller | 2T / Roller+ | 3T / Roller++ | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sage | XG | Sage | XG | Sage | XG | Sage | XG | Sage | XG | Sage | XG | ||
| 2-1バックゲーム | 1,000 | 2.26 | 2.84 | 1.01 | 1.64 | 1.03 | 1.22 | 0.61 | 1.67 | 0.41 | 0.98 | 0.38 | 0.93 |
| 3-1バックゲーム | 1,001 | 2.22 | 2.22 | 0.88 | 0.95 | 0.67 | 0.72 | 0.66 | 0.91 | 0.34 | 0.59 | 0.32 | 0.48 |
| 3-2バックゲーム | 1,008 | 2.07 | 2.39 | 0.91 | 1.31 | 0.78 | 0.99 | 0.65 | 0.95 | 0.44 | 0.61 | 0.25 | 0.51 |
| 4-1バックゲーム | 1,001 | 1.77 | 1.83 | 0.78 | 0.82 | 0.60 | 0.53 | 0.55 | 0.69 | 0.24 | 0.47 | 0.19 | 0.45 |
| 4-2バックゲーム | 1,000 | 2.16 | 1.96 | 0.73 | 1.05 | 0.69 | 0.55 | 0.63 | 0.79 | 0.36 | 0.61 | 0.27 | 0.43 |
| 5-1バックゲーム | 1,003 | 1.32 | 1.77 | 0.66 | 0.76 | 0.46 | 0.64 | 0.49 | 0.60 | 0.26 | 0.41 | 0.23 | 0.32 |
| 5-2バックゲーム | 1,002 | 1.53 | 1.60 | 0.49 | 0.82 | 0.48 | 0.63 | 0.53 | 0.63 | 0.33 | 0.41 | 0.24 | 0.30 |
| 4-3バックゲーム | 1,002 | 1.69 | 2.13 | 0.74 | 0.80 | 0.55 | 0.58 | 0.52 | 0.76 | 0.24 | 0.55 | 0.19 | 0.44 |
| 5-3バックゲーム | 1,003 | 1.86 | 2.13 | 1.02 | 0.89 | 0.58 | 0.63 | 0.68 | 0.81 | 0.35 | 0.46 | 0.21 | 0.44 |
| 5-4バックゲーム | 1,001 | 2.45 | 2.74 | 0.93 | 1.15 | 0.73 | 0.78 | 0.76 | 0.97 | 0.47 | 0.55 | 0.30 | 0.49 |
| コンテインメント | 3,270 | 4.73 | 14.62 | 2.54 | 11.25 | 2.05 | 10.37 | 2.29 | 7.76 | 1.30 | 7.85 | 1.05 | 6.16 |
| スネーク | 978 | 21.00 | 39.92 | 21.42 | 36.64 | 23.53 | 36.17 | 11.19 | 32.99 | 8.42 | 32.38 | 5.85 | 32.24 |
| 大規模バックゲーム | 2,103 | 4.33 | 5.76 | 2.56 | 4.44 | 2.17 | 3.68 | 1.91 | 3.14 | 1.39 | 2.75 | 1.09 | 2.64 |
.xg 形式の書き出し(付録を参照)。
ロールアウトPRの手法は、共通の参照基準に対して両エンジンを採点します。より鋭く直接的な問いはこうです。現実的なプレイの中で、2つのエンジンは最善手について実際にどこで意見が分かれるのか — そしてそのとき、どちらが正しいのか?
この問いには、手法1の最も難しいアンリミテッドの判断 — ロールアウト済みのポジション — で答えます。これらは今や、SageのフルロールアウトとXGのフルロールアウトの両方を備えています。その中からSage 3TとXG Roller++が異なる選択をしたすべての判断を見つけ出し、それぞれのロールアウトがどちらの選択を支持したかを問います。両方のロールアウトがあることがまさに肝心な点です。すべての不一致はSageのロールアウトとXG自身のロールアウトの両方で判定されるため、答えが単一のエンジンの正解を信じることに依存しません。
ロールアウト済みのアンリミテッドのポジション — 本研究で最も難しい判断 — 全体で、2つのエンジンは1,286件のチェッカープレイと80件のキューブ判断で意見が分かれました。各パネルは、各エンジンがロールアウトの最善判断と一致した頻度を、XG自身のロールアウトとSageのロールアウトのそれぞれを基準にして示します。
最初の2つの手法は、どちらのエンジンが強いかを問います。エンジンを使って自分のプレイを研究する人にとっては、第3の問いも同じくらい重要です。実戦マッチをXGで分析してパフォーマンスレーティングを記録し、それからまったく同じマッチをSageで分析したとき — 2つのレーティングはどれくらい近いのか?XGで特定のPRが何を意味するかの感覚を何年もかけて培ってきたプレイヤーは、Sageからも本質的に同じ数値を得られるべきです。
これを直接検証するため、すでにXGで分析済みの実戦トーナメントマッチを大量に集め、そのすべてをSageでゼロから再分析し、各エンジンが各プレイヤーに与えたパフォーマンスレーティングを比較しました。
マッチファイルは2026年の3つのトーナメントに由来し、すべて7ポイントマッチで、Máté Fehér氏のご厚意により提供されました — 競技プレイヤーが自分のゲームを研究するのとまったく同じように、すでにeXtreme Gammonで分析済みのものです。
合計290マッチ、580のプレイヤー個別レーティングです。もう1マッチは棋譜の破損のため除外しました。
580のプレイヤーレーティングをすべてまとめると、2つのエンジンはほぼ完全に一致します。平均差は統計的にゼロと区別がつかず、その差のばらつきはPR自体のばらつきに比べて小さいものです。
| プレイヤーごとのパフォーマンスレーティング | XG | Sage | 差Sage − XG |
|---|---|---|---|
| 平均 | 4.36 | 4.36 | +0.002 |
| 標準偏差 | 2.08 | 2.10 | 0.37 |
| 95%範囲 | 1.52 – 9.36 | 1.44 – 9.67 | −0.76 – +0.74 |
強さの研究において、Open Sage 3T と XG Roller++ は入手可能な最強クラスのバックギャモン評価であり、互いに接近しています。ロールアウト PR の研究は — 無制限ゲームと 5 ポイントマッチの双方で実施 — 3-ply を除くすべての対応レベルで Sage を上位とし、3-ply では両エンジンが誤差の範囲に収まります。最も明確な差は打ち切りロールアウトのレベルにあります。無制限ゲームについて XG 自身の分析を基準に組み直すと順位は逆転し、2T で両者が並ぶのを除き、すべての対応レベルで XG が上回ります。最強の評価レベルで両エンジンが食い違う局面を取り上げ、両者のロールアウトに照らして採点する争点局面の研究では、チェッカープレイは互角で — それぞれのロールアウトが自らを実行したエンジンを有利にします — キューブの不一致は判定するには稀すぎ、また割れすぎています。
したがって率直な要約は、両エンジンが非常に近い、非常に高い水準で指しており、それぞれが自らの分析に対して最も良いスコアを出すということです。Sage の基準では、その打ち切りロールアウトが XG の Roller レベルの取り逃す判断を正しく捉え、XG の基準ではその逆になります。両エンジンが明確に食い違う局面では、どちらのロールアウトも相手を明確に下位に置きません。両者が分かれるのはファミリーのベンチマーク — バックゲーム、コンテインメント、スネーク — です。同じ基準で、対応するすべてのレベルにおいて Sage は 13 すべてで先行し、コンテインメントとスネークでは 3 倍以上の差をつけます。
そして第3の研究は、Sageのユーザーが実際に直面する問いに答えます。すでにXGで評価済みの290の実戦トーナメントマッチにおいて、Sageは本質的に同じパフォーマンスレーティングを出します — プレイヤーのSageレーティングとXGレーティングの平均差は統計的にゼロと区別がつかず、その差のばらつきはPR自体のばらつきに比べて小さいのです。テストがロールアウトによる正解に対する強さであれ、実際のゲームがどうプレイされたかについての単純な一致度であれ、Open SageとXGは同じところに行き着きます。
Open Sageはオープンソースとして公開されており、両手法の背後にある完全なパイプラインはエンジンのリポジトリに同梱されています。以下のすべては
bgsage パッケージと、ローカルでビルドしたそのエンジンだけで動作します — 外部のサービスやデータセット、インフラは一切不要です。唯一の手作業による依存先はeXtreme Gammon本体で、XGにプログラムから操作できるインターフェースがないため、XG列の再生成に使います。
bgbot_cpp 拡張モジュール)をビルドします。XG列を再現するには、さらにBatch Analysisの手順のためにeXtreme Gammon(Windows)が必要です。各スクリプトはリポジトリ内でパスを解決するので、必ず bgsage/ ルートから実行してください。
パイプラインを手作業で動かす必要はありません。Anthropicのエージェント型コマンドラインコーディングツールであるClaude Codeが、エンジンのビルドとベンチマークの実行を代わりに行ってくれます。リポジトリのチェックアウトを指定して、やりたいことを説明するだけです。以下で詳述するのと同じ手順を、Claude Codeが順に進めます:
data/money_benchmark/benchmark.json.gz に対して採点し、この研究と比較できる表として出力して。」./mybot にある — 同梱ベンチマークの各判断を私のボットで評価して、参照エクイティに対するPRを計算して。」
ベンチマーク — 信頼できる評価の階層化セット — は、1本のスクリプト scripts/benchmark_money.pyで構築と採点の両方を行います。入り口は2つあります。
リポジトリには、組み上げ済みのベンチマークが
data/money_benchmark/benchmark.json.gz として同梱されています(非圧縮のJSONはGitHubのファイルサイズ上限を超えるため、スクリプトはgzipをそのまま読み込みます)。任意のSageレベルを採点すると、第3節の表の該当行が再現されます:
# lower PR is better python scripts/benchmark_money.py score --level 3ply # Sage 3P python scripts/benchmark_money.py score --level truncated3 # Sage 3T # --level: 1ply 2ply 3ply 4ply | truncated1/2/3 | rollout
まったく別のエンジンを採点するには、スクリプトが内部で使っているのと同じ規則を適用します。データセットの各判断について、あなたのエンジンの選択を取り、そのエクイティを保存されている参照(「ロールアウト」)エクイティと比較します — 平均エラー × 500がそのPRです。
適応的な3つのパスでデータセットを再作成します。ゲームはシード固定(シード 1から500ゲーム)なので、判断と参照エクイティは同じ結果になります:
# 1. simulate 500 Sage-3P self-play games (+ XG transcripts) python scripts/benchmark_money.py build --stages pass1 --n-games 500 --workers 6 # 2. re-evaluate every decision within 0.05 at 3T python scripts/benchmark_money.py build --stages pass2 --n-threads 16 # 3. roll out every decision still within 0.02 python scripts/benchmark_money.py build --stages pass3 --n-threads 16
パス 3は data/money_benchmark/benchmark.json
(およびその .gz)を書き出します。オプション Aとまったく同じ方法で採点してください。 --stages を省略すると、3つのパスがすべて順番に実行されます。
XGにはAPIがないため、その結果はXGのBatch Analysisから得ています。パス 1はXGインポート用の棋譜を data/money_benchmark/xg/ に書き出します — これらは同梱されていないので、データセットだけから始めた場合はパス 1で再生成してください。
xg/ フォルダーをカスタムレベル — 3プライ判断、不一致時はテスト対象のレベルに引き上げ — でBatch Analyzeします。このときSave Games after analyzeにチェックを入れておきます。XGはゲームごとに1つの
.xg ファイルを書き出します。
python scripts/benchmark_pr_xg_levels_all.py --benchmark moneyを実行します。これは分析した各レベルについて、各ポジションにおけるXGの最善判断を
.xg ファイルから読み取り、同じ参照エクイティに対して採点して、同じPRの内訳を出力し、XGの選択をその横に記録します。
一方、第 3 節のXG 基準による無制限ゲームの表と争点局面の研究には、最も難しい局面についての XG のロールアウトが必要です。それらの局面に対して XG の Batch Rollout を実行してください(Save Games にチェックを入れます)。 python scripts/xg_benchmark_report.py がそれらを解析します。XG 基準の表は、その後、各採点スクリプトが記録した選択からすべてのレベルを再採点します。下の方法 2 を参照してください。
# XG-reference table: harvest XG Roller++ (the 3T tier), then re-score every level; # Sage's picks come from benchmark_money.py score --level <level> --model stage11 python scripts/xg_harvest_results.py --benchmark money --set rollerpp python scripts/benchmark_pr_xg_reference_all.py --sage-suffix stage11
5ポイントマッチの研究は、
scripts/benchmark_match.pyで同じように再現できます。これは
benchmark_money.py のマッチプレイ版で、マッチの長さとマッチ数を引数で指定し、マッチスコアがすべての評価に織り込まれます。そのグラウンドトゥルースは次のファイルとして同梱されています: data/match_benchmark/5pt/benchmark.json.gz.
# score against the shipped match dataset (no rebuild) python scripts/benchmark_match.py score --match-length 5 --level truncated3 # or rebuild: 130 seeded 5-pt matches, three adaptive passes python scripts/benchmark_match.py build --match-length 5 --n-matches 130 --stages pass1 --workers 6 python scripts/benchmark_match.py build --match-length 5 --n-matches 130 --stages pass2 --n-threads 16 python scripts/benchmark_match.py build --match-length 5 --n-matches 130 --stages pass3 --n-threads 16 # XG columns: batch-analyze data/match_benchmark/5pt/xg/ per level, then python scripts/benchmark_pr_xg_levels_all.py --benchmark match --match-length 5
不一致の研究は、手法1で構築したのと同じアンリミテッドベンチマークを元に、最難関ポジションのXG自身のフルロールアウトと突き合わせます。唯一の手作業による依存先はXGのBatch Rolloutで、残りは1本のスクリプトが行います。
data/money_benchmark/xg/.
.xg ファイルです。
python scripts/xg_benchmark_report.py python scripts/xg_dispute_analysis.py --sage-picks data/money_benchmark/scores/sage_truncated3.picks.jsonl
前者はXGのロールアウトを読み取って
data/money_benchmark/xg_results/rollout.jsonlに書き出し、後者はSage 3Tの記録された選択から不一致ポジションレポート — すべての不一致をSageとXGのロールアウトに対して順に採点したもの — を出力します。
マッチプレイはこの手法ではまだ扱っていません。マッチのポジションのXGフルロールアウトが必要ですが、まだ実行していないためです。マッチでの強さは代わりに、ロールアウトPRの研究(第3節)と実戦マッチの一致度の研究(第5節)でカバーしています。
Sage と XG は直接対戦することもでき、XG の着手はその自身の解析から取られます。Sage が無制限ゲームの両サイドを指し、その棋譜を XG でバッチ解析します。XG の最善手と異なる最初の相手側の判断を XG の着手に置き換え、そこから新しいダイスで指し直します。これを相手側のすべての着手が XG のものになるまで繰り返します。ランナーはこうした対局を連続して行います(シードは次から続きます: logs/sage_vs_xg.txt)、1 局あたりの平均得点を標準誤差とともに出力します。
python scripts/run_sage_vs_xg_games.py 100 --level 3P # Sage 3P vs XG; levels 1P-4P, 1T-3T python scripts/play_sage_vs_xg.py 3P --seed 7 # one game, iterations under logs/play_sage_vs_xg/
XG が Windows デスクトップ上で実行されている必要があります。各反復は次を通じて Batch Analyze ダイアログを操作します: scripts/xg_batch_analyze.py。これは Anthropic Computer Use エージェントです(設定: ANTHROPIC_API_KEY)。これは 1 反復あたり約 1 分間、マウスとキーボードを占有します。1 局は数回の反復で収束します。XG の「too good to double」の判定はダブルなしとして数えます。
13のポジション群ベンチマークは
backgame_ref_positions/benchmark/ 以下にあり — それぞれシードポジションの
<family> starting.txt と参照基準の
<family> rollout.jsonl を1つずつ持ちます — 採点は
scripts/score_backgame_pr.pyが行い、このスクリプトはロールアウト品質の選択の割合とともにPRを報告します。
python scripts/score_backgame_pr.py --category "21 backgame" --level truncated3 python scripts/score_backgame_pr.py --category containment --level 3ply # XG: export every decision as a one-decision native .xg game, then per level (XG running): analyse, wait, score python scripts/export_folder_benchmark_xg.py generate python scripts/xg_folder_batch.py stamp python scripts/xg_folder_batch.py analyze --level xg3ply # drives XG's Batch Analyze dialog (pywinauto) python scripts/xg_folder_batch.py wait --level xg3ply python scripts/xg_folder_batch.py score --level xg3ply
.xg ファイルです。