エンジン研究 · ボット性能

Open SageとeXtreme Gammonのベンチマーク比較

Backgammon Sage Proを支えるOpen Sage評価エンジンと、eXtreme Gammonのボットエンジン(XG)との定量的比較。

概要

Open SageボットエンジンとeXtreme Gammon(XG)を、対応する評価レベル同士 — ニューラルネットワークによる直接評価、マルチプライ先読み、打ち切りロールアウト — で比較します。XGにはプログラムから操作できるインターフェースがないため、そのBatch Analysis機能を通じて採点しました。用いたのは、互いに補い合う3つの手法です。第1の手法では、階層化されたグラウンドトゥルース評価のセットを構築し — 選択が明確な判断は高速な評価を信頼し、僅差の判断はフルロールアウトへ段階的に引き上げます — その参照基準に対する各エンジンの成績をパフォーマンスレーティング(PR)として算出しました。対象は500のアンリミテッドゲーム(17,535件の判断)と130の5ポイントマッチ(18,292件の判断)です。さらにアンリミテッドゲームについては、XG自身の階層化分析を参照基準としてこの比較全体を組み直しました — まさに鏡写しの検証です — が、XG自身の数値で判定してもSageの打ち切りロールアウトが優位を保ちました。第2の手法では、Sage 3TとXG Roller++が本当に見解を異にするアンリミテッドのポジションを抽出し、それぞれを両エンジンのフルロールアウトで判定します。いずれの手法でも2つのエンジンは接近しており、多くのユーザーが頼りにする打ち切りロールアウトの対応レベルではSageがやや優位でした。第3の手法は問いを逆転させます。すでにXGで分析済みの290の実戦トーナメントマッチをSageで再分析し、両エンジンが各プレイヤーに与えるパフォーマンスレーティングを比較したところ、その平均差は統計的にゼロと区別がつきませんでした。

01
はじめに

なぜXGと比較するのか?

eXtreme Gammon(XG)はコンピューターによるバックギャモン分析の標準的な基準であり、その評価エンジンは入手できる中で最強クラスと広く見なされています。真剣に受け止められることを目指す新しいエンジンは、「XGと比べてどうなのか?」という単純な問いに答えなければなりません。本研究は、Backgammon Sage Proの中核であるニューラルネットワークエンジンOpen Sageについて、この問いに定量的に答えるものです。

目標は、Open Sageの評価とXGの評価を、同程度の計算量のレベル同士で比較することでした。最も自然な実験 — 2つのエンジンを何千ゲームも直接対戦させて結果を集計する — は現実的ではありません。XGのデスクトップアプリにはプログラムから操作できるインターフェースがなく、2つのエンジン間でポジションや手を受け渡すには手作業でクリックしていくしかないからです。強いエンジン同士のわずかな差を検出できるだけのサンプル数に達するには、あまりに時間がかかりすぎます。

そこで代わりに、XGのBatch Analysis機能を利用します。これは数百の棋譜を1回の無人実行でまとめて採点できる機能です。Open Sageが多数のゲームで両サイドをプレイし、各ゲームをXGがインポートできる標準的なテキスト形式でエクスポートし、XGにまとめて分析させ、その判定を読み戻します。この共通の土台の上で、第3節第4節で説明する2つの異なる手法を適用します。第3の研究(第5節)はシミュレーションから完全に離れ、XGで分析済みの実戦トーナメントマッチを題材にします。

02
背景

評価のレベル

どちらのエンジンも、精度と速度のトレードオフの中でさまざまな深さでポジションを評価できます。結果を読み解くにはこれらのレベルの理解が欠かせません。比較はつねに、2つのエンジンの対応するレベル同士で行われるからです。

直接評価(1プライ)。先読みなしの、ポジションに対するニューラルネットワークの生の出力です。最も高速な設定であり、より深いすべてのレベルの土台になります。(1プライを生のネットワーク評価とするXGの慣例に従っています。)

マルチプライ先読み(2・3・4プライ)。エンジンが数ターン先まで読み、相手の応手を考慮し、各ステップで起こりうる出目について平均を取り、各手順の末端でネットワークの生の評価を行います。プライが1つ増えるごとに精度は上がりますが、計算コストは大幅に増えます。

打ち切りロールアウト(1T、2T、3T)。固定の深さまで探索する代わりに、エンジンは短いシミュレーションゲームを多数プレイし、数ターン後に打ち切って、その時点のポジションをマルチプライ先読みで評価します。分散低減により、サンプリングされたダイスの運の大部分が相殺されます。これがXGの「Roller」設定で、固定深さの探索より強く、それでいてフルロールアウトよりはるかに軽量です。

フルロールアウト。多数のシミュレーションゲームを最後までプレイします。分散低減を用いて十分な回数を実行すれば、フルロールアウトはバックギャモンエンジンが生み出せる中で最もグラウンドトゥルースに近いものであり、本研究では一貫してこれを参照基準として用います。

対応するレベル:SageとXG

種類 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プライを使用。
フルロールアウト ロールアウト ロールアウト シミュレーションゲームを最後までプレイ — 本研究における参照「正解」。
パフォーマンスレーティング(PR)。本稿を通じて、エンジンの精度はPR — ロールアウトによる参照基準に対する1判断あたりの平均エクイティエラーを500倍した値 — で要約します。PR 0は正解との完全な一致を意味し、低いほど良い値です。
03
手法1

ロールアウトPR

第1の手法では、「真の」最善手をできる限り正確に確定させた固定の判断セットに対して、各エンジンを採点します。これは、XGを他の多くのボットと比較した有名な2012年のXG研究と同じアプローチです。

まず、Sage 3P同士の自己対戦による500のアンリミテッドゲームをシミュレーションしました。3Pのようにそこそこ強いレベルは、あらゆるゲームプラン — レース、アタック、プライミング、アンカリング — にわたって現実的なポジション分布を生み出し、これこそテストしたい多様性です。次に、盤上のスコアによってすべての判断の価値が変わる130の5ポイントマッチについて、研究全体をもう一度実行しました。両方の結果を以下に示します。

グラウンドトゥルースの構築

すべての判断の真の最善手をフルロールアウトで確定させるのは途方もなくコストがかかり、しかも不要です。ほとんどの判断は僅差ではないからです。そこで参照基準は、段階的に深くなる3つのパスで構築し、選択が本当に微妙なところだけにロールアウトの計算量を投入します。同じ手順を両方のデータセットに適用し、各パスは確信を持って解決できる判断を確定させ、残りを次のパスに送ります:

パス1 · Sage 3P

差が明確なら3プライを信頼

すべての判断を3プライで評価します。最善手が次善手を0.05エクイティより大きく上回る場合、3Pの判定を正解として受け入れ、その判断を確定させます。

0.05
確定に必要なエクイティ差
僅差の判断(0.05以内)はパス2へ
パス2 · Sage 3T

僅差の判断を打ち切りロールアウトで再確認

残った判断を3Tで再評価します。差が0.02エクイティより広がった場合、3Tの判定を正解として受け入れます。

0.02
確定に必要なエクイティ差
なお0.02以内のものはパス3へ
パス3 · フルロールアウト

最難関の判断をロールアウト

なお0.02以内にあるものはすべて、Sageのフルロールアウトで確定させます。チェッカープレイとキューブアクションの両方に3P判断を用い、1,296ゲームずつのバッチで、エクイティの95%信頼幅が0.005を下回るまで — または上限の20,736ゲーム(16 × 1,296)に達するまで — 実行します。最も時間のかかるバックゲームのポジションは、1つあたり1時間を優に超えました。

0.005
目標95%信頼幅

その結果が、すべての判断がその難しさにちょうど見合った深さで解決された、階層化された参照基準です。この同じ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件の判断)を次のように解決しました:

3Pで確定  7,652 3Tで確定  3,260 ロールアウト  5,977 アンリミテッドゲーム  16,889ポジション · 17,535判断

アンリミテッドゲーム — 直接比較

対応する5つのレベルを、これら17,535件の判断で採点しました。PRは低いほど良く、各ペアで強い方のエンジンをハイライトしています。

Sage 3T
打ち切りロールアウト · 3プライ判断 · 7ターンで打ち切り
0.21
vs
0.32
XG Roller++
打ち切りロールアウト · 3プライ判断 · 7ターンで打ち切り
Sage 3Tが0.11 PRリード
Sage 2T
打ち切りロールアウト · 2プライ判断
0.26
vs
0.41
XG Roller+
打ち切りロールアウト · 2プライ判断
Sage 2Tが0.15 PRリード
Sage 1T
打ち切りロールアウト · 1プライ判断 · 5ターンで打ち切り · 72ゲーム
0.50
vs
0.53
XG Roller
打ち切りロールアウト · 1プライ判断 · 5ターンで打ち切り · 42ゲーム
Sage 1Tが0.03 PRリード
Sage 4P
4プライ先読み探索
0.41
vs
0.46
XG 4プライ
4プライ先読み探索
Sage 4Pが0.05 PRリード
Sage 3P
3プライ先読み探索
0.58
vs
0.57
XG 3プライ
3プライ先読み探索
事実上の互角 — XG 3プライが0.01 PRリード

アンリミテッドゲーム — 詳細内訳

テストしたすべてのエンジンとレベルのPRを、判断の種類とゲームプラン別に示します。低いほど良い値です。

エンジン PR チェッカー キューブ ピュアレース レース アタック プライミング アンカリング
Sage 3T 0.210.180.360.020.240.170.310.28
XG Roller++ 0.320.310.380.040.400.240.410.44
Sage 2T 0.260.230.440.020.320.210.390.30
XG Roller+ 0.410.410.390.050.590.310.470.54
Sage 1T 0.500.520.400.040.570.430.590.73
XG Roller 0.530.540.480.050.630.440.710.66
Sage 4P 0.410.390.500.070.510.370.450.53
XG 4プライ 0.460.450.520.060.580.400.570.58
Sage 3P 0.580.580.570.140.720.520.630.74
XG 3プライ 0.570.570.580.050.710.480.730.71
Sage 2P 1.641.392.880.401.771.831.861.71
Sage 1P 2.592.483.200.782.602.793.102.89
Open Sage eXtreme Gammon Sage 2Pと1Pには今回の実行で対応するXGレベルがなく、参考として示しています。
Sageの評価は、3プライを除くすべての対応レベルでXGの同等の評価より強い結果でした。3プライではXGが0.01 PR上回りますが、これはノイズの範囲に十分収まる差です。2つのエンジンは非常に接近しており、多くのユーザーが頼りにする打ち切りロールアウトのレベルでは、Sageが一貫した優位を保っています。

アンリミテッドゲーム — XG自身の参照基準で採点

上の数値はすべて、Sageの階層化された参照基準でエンジンを採点したものです。当然予想される反論はホームアドバンテージ — Sageが自身のロールアウトで測られている — でしょう。そこで、まったく鏡写しの検証を構築しました。同じ500ゲーム、同じ判断に対して、すべての階層でXG自身の分析を正解とするのです。XG 3プライが3P階層の判断を、XG Roller++が3T階層の判断を、XG自身のフルロールアウトがロールアウト階層の判断を確定させます — Sageの参照基準に階層ごとに対応するXG版です。そのうえで、すべてのエンジンをこれに対して再採点しました。

エンジン PR チェッカー キューブ ピュアレース レース アタック プライミング アンカリング
Sage 3T 0.260.250.330.020.370.200.300.36
XG Roller++ 0.330.350.230.040.500.200.390.47
Sage 2T 0.310.300.350.020.410.270.360.37
XG Roller+ 0.380.400.230.040.580.260.390.54
Sage 1T 0.460.480.370.030.580.400.500.64
XG Roller 0.470.490.350.120.610.350.540.62
Sage 4P 0.370.360.420.060.530.340.400.39
XG 4プライ 0.450.460.400.130.600.360.480.59
Sage 3P 0.490.480.520.080.660.460.540.55
XG 3プライ 0.470.490.400.120.630.370.540.61
Sage 2P 1.351.142.400.311.501.481.521.41
Sage 1P 2.242.142.760.742.212.442.692.39
Open Sage eXtreme Gammon 参照基準:XG 3プライ(3P階層) · XG Roller++(3T階層) · XGフルロールアウト(ロールアウト階層)。
正解を入れ替えても結論は変わりません。XG自身の分析を基準にしても、打ち切りロールアウトのレベルではSageの方が近いエンジンです — 3T 0.26対Roller++ 0.332T 0.31対Roller+ 0.38 — そして4プライでも同様です。実のところ、4プライは最もクリーンなテストです。どちらのエンジンの参照基準もこのレベルからは作られていないため、自分自身に対して採点される行がなく、Sageが0.370.45でリードしています。それ以外では、この比較はSageではなくXGに有利に働きます — XG Roller++こそが3T階層の参照基準であり、XG 3プライが3P階層の参照基準なので、これらの行は正解を定義しているまさにその場所でほぼゼロのスコアになります。ここでのSageの優位は、むしろ控えめに出ていると言えます。XG自身の参照基準がXGに有利に働く唯一の列は、キューブです。
2つの参照基準、1つの結論。どちらのエンジンの分析を正解としても、Sage 3TはXG Roller++を上回り — Sageの参照基準で0.210.32、XGの参照基準で0.260.33 — 打ち切りロールアウトのレベルは優位を保ちます。最初の表に対する唯一の本質的な疑問 — 物差しがSage自身のロールアウトだったこと — こそ、この鏡写しの検証が取り除くものです。

マッチプレイ — グラウンドトゥルースの構成

マッチのセットでも同じ3つのパスを実行しますが、1つ追加点があります。各プレイヤーのアウェイスコアとクロフォードのフラグをすべての評価に引き渡し、正解を正しいスコアに対するマッチエクイティ(MWC)空間で計算します。130の5ポイントマッチ全体で、各パスは17,892ポジション(18,292件の判断)を次のように解決しました:

3Pで確定  7,522 3Tで確定  3,460 ロールアウト  6,910 マッチプレイ  17,892ポジション · 18,292判断

マッチプレイ — 直接比較

対応する5つのレベルを、これら18,292件の判断で採点しました。PRは低いほど良く、各ペアで強い方のエンジンをハイライトしています。

Sage 3T
打ち切りロールアウト · 3プライ判断 · 7ターンで打ち切り
0.19
vs
0.35
XG Roller++
打ち切りロールアウト · 3プライ判断 · 7ターンで打ち切り
Sage 3Tが0.16 PRリード
Sage 2T
打ち切りロールアウト · 2プライ判断
0.26
vs
0.44
XG Roller+
打ち切りロールアウト · 2プライ判断
Sage 2Tが0.18 PRリード
Sage 1T
打ち切りロールアウト · 1プライ判断 · 5ターンで打ち切り · 72ゲーム
0.49
vs
0.51
XG Roller
打ち切りロールアウト · 1プライ判断 · 5ターンで打ち切り · 42ゲーム
Sage 1Tが0.02 PRリード
Sage 4P
4プライ先読み探索
0.42
vs
0.46
XG 4プライ
4プライ先読み探索
Sage 4Pが0.04 PRリード
Sage 3P
3プライ先読み探索
0.57
vs
0.54
XG 3プライ
3プライ先読み探索
事実上の互角 — XG 3プライが0.03 PRリード

マッチプレイ — 詳細内訳

5ポイントマッチのセットでテストしたすべてのエンジンとレベルのPRを、判断の種類とゲームプラン別に示します。低いほど良い値です。

エンジン PR チェッカー キューブ ピュアレース レース アタック プライミング アンカリング
Sage 3T 0.190.160.400.010.170.180.250.26
XG Roller++ 0.350.350.410.080.440.320.330.45
Sage 2T 0.260.240.440.020.360.180.340.33
XG Roller+ 0.440.440.410.090.550.440.400.52
Sage 1T 0.490.490.520.050.570.440.570.63
XG Roller 0.510.510.540.090.640.500.510.62
Sage 4P 0.420.420.480.050.520.380.450.55
XG 4プライ 0.460.450.560.090.600.440.420.56
Sage 3P 0.570.560.670.050.740.560.580.68
XG 3プライ 0.540.530.610.090.690.530.520.65
Sage 2P 1.301.261.600.391.591.231.501.41
Sage 1P 2.302.292.310.692.482.432.472.56
Open Sage eXtreme Gammon Sage 2Pと1Pには今回の実行で対応するXGレベルがなく、参考として示しています。
マッチの結果はアンリミテッドの研究と同じ傾向を示します。Sageは3プライを除くすべての対応レベルでXGの同等の評価より強く、3プライではXGが0.03 PR上回りますが、これはノイズの範囲内です。Sageの最も明確な優位は、ここでも多くのユーザーが頼りにする打ち切りロールアウトのレベル(3Tと2T)にあります。
04
手法2

不一致ポジション

ロールアウトPRの手法は、共通の参照基準に対して両エンジンを採点します。より鋭く直接的な問いはこうです。現実的なプレイの中で、2つのエンジンは最善手について実際にどこで意見が分かれるのか — そしてそのとき、どちらが正しいのか?

この問いには、手法1の最も難しいアンリミテッドの判断 — ロールアウト済みのポジション — で答えます。これらは今や、SageのフルロールアウトとXGのフルロールアウトの両方を備えています。その中からSage 3TXG Roller++が異なる選択をしたすべての判断を見つけ出し、それぞれのロールアウトがどちらの選択を支持したかを問います。両方のロールアウトがあることがまさに肝心な点です。すべての不一致はSageのロールアウトXG自身のロールアウトの両方で判定されるため、答えが単一のエンジンの正解を信じることに依存しません。

  • ロールアウト済みのアンリミテッドベンチマーク — Sageのフルロールアウトで確定させた最難関の判断 — から始めます。
  • 同じポジションについて、XGに独自のフルロールアウト(Batch Rollout)を実行させます — 独立した第2のグラウンドトゥルースです。
  • Sage 3TとXG Roller++の見解が分かれる判断だけを残し、各エンジンの選択を、各ロールアウトの最善手またはキューブアクションに対して採点します。
  • 共通セット — 両エンジンの選択が両方のロールアウトでロールアウトされた不一致 — について報告し、2つの比較が同一のポジションを対象にするようにします。

結果

ロールアウト済みのアンリミテッドのポジション — 本研究で最も難しい判断 — 全体で、2つのエンジンは1,488件のチェッカープレイと69件のキューブ判断で意見が分かれました。各パネルは、各エンジンがロールアウトの最善判断と一致した頻度を、XG自身のロールアウトとSageのロールアウトのそれぞれを基準にして示します。

チェッカープレイ

Sage 3TとXG Roller++が異なる手を選んだケース
5,687
ロールアウト済みのチェッカー判断
1,488
不一致
1,357
採点対象(共通セット)
最善手と一致 — XG自身のロールアウト基準
平均エクイティエラー — Sage 3T 0.0027 · XG Roller++ 0.0048  (PR 1.34 vs 2.39)
最善手と一致 — Sageのロールアウト基準
平均エクイティエラー — Sage 3T 0.0019 · XG Roller++ 0.0059  (PR 0.97 vs 2.95)
Sage 3T XG Roller++ どちらでもない

キューブ判断

Sage 3TとXG Roller++が異なるキューブアクションを選んだケース
282
ロールアウト済みのキューブ判断
69
不一致
最善アクションと一致 — XG自身のロールアウト基準
平均エクイティエラー — Sage 3T 0.0079 · XG Roller++ 0.0086  (PR 3.96 vs 4.30)
最善アクションと一致 — Sageのロールアウト基準
平均エクイティエラー — Sage 3T 0.0041 · XG Roller++ 0.0118  (PR 2.06 vs 5.88)
Sage 3T XG Roller++
キューブの不一致は全部で69件だけ — 小さなサンプルなので、このパネルは決定的なものではなく示唆的なものとして読んでください。
チェッカープレイ — 不一致の大多数 — では、Sage 3Tの方が両方のロールアウト(XG自身のものを含む)に近いエンジンでした。ロールアウトの最善手とより高い頻度で一致し(XGのロールアウト基準で44.4%対39.3%、Sageの基準で56.2%対27.7%)、平均エラーはおよそ半分でした。キューブの不一致ははるかに稀で、互角に近い結果です — Sage 3TはSageのロールアウトには明らかに近く、XG自身のロールアウトに対してもわずかに近い結果でした。
なぜ2つのロールアウトが重要なのか。単一の参照基準による結果には、つねに「誰の正解なのか?」という問いがつきまといます。ここでは2つのロールアウトが互いに独立したエンジンに由来し、チェッカーの不一致について同じ方向を指しています — Sage 3TはXG自身のロールアウトに対してさえ近いのです。どちらのロールアウトも完璧なグラウンドトゥルースではありませんが、両者の一致こそ、単一の参照基準だけでは決して示せないものです。
05
手法3

実戦マッチでの一致度

最初の2つの手法は、どちらのエンジンが強いかを問います。エンジンを使って自分のプレイを研究する人にとっては、第3の問いも同じくらい重要です。実戦マッチをXGで分析してパフォーマンスレーティングを記録し、それからまったく同じマッチをSageで分析したとき — 2つのレーティングはどれくらい近いのか?XGで特定のPRが何を意味するかの感覚を何年もかけて培ってきたプレイヤーは、Sageからも本質的に同じ数値を得られるべきです。

これを直接検証するため、すでにXGで分析済みの実戦トーナメントマッチを大量に集め、そのすべてをSageでゼロから再分析し、各エンジンが各プレイヤーに与えたパフォーマンスレーティングを比較しました。

対象マッチ

マッチファイルは2026年の3つのトーナメントに由来し、すべて7ポイントマッチで、Máté Fehér氏のご厚意により提供されました — 競技プレイヤーが自分のゲームを研究するのとまったく同じように、すでにeXtreme Gammonで分析済みのものです。

UBC Texas 2026
100
分析したマッチ
UBC Istanbul 2026
146
分析したマッチ
UBC Japan 2026
44
分析したマッチ

合計290マッチ、580のプレイヤー個別レーティングです。もう1マッチは棋譜の破損のため除外しました。

対応する評価設定

各マッチはSageで3プライのベースで再分析し、プレイヤーの実際の手が3プライの最善手と異なる判断にはエキスパートの3Tパス — 360ゲームの打ち切りロールアウト — を適用しました。これは強力なXG分析(明確な判断にはベースのプライ、僅差の判断には打ち切りロールアウトへ引き上げ)を、対応する強さで再現したものです:Sage 3P ≈ XG 3プライSage 3T ≈ XG Roller++第2節参照)。そのうえで各エンジンが自身の評価からプレイヤーごとのPRを算出します — これが各アプリでユーザーが目にする数値です。

結果

580のプレイヤーレーティングをすべてまとめると、2つのエンジンはほぼ完全に一致します。平均差は統計的にゼロと区別がつかず、その差のばらつきはPR自体のばらつきに比べて小さいものです。

+0.002
平均差(PR)
統計的にゼロと区別がつかない — 95%信頼区間±0.03、p = 0.90。
0.37
差の標準偏差
PR自体のばらつき2.08に比べて小さい — 個々のレーティングでの不一致は、PRの変動幅に比べればわずかです。
0.98
レーティングの相関(r)
SageとXGは同じプレイヤーをほぼ同一に評価しています。
プレイヤーごとのパフォーマンスレーティング 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
実用上は、Sageでマッチを分析したプレイヤーは — 大多数のケースで — XGが与えるのと本質的に同じパフォーマンスレーティングを目にすることになります。マッチがどれだけ上手くプレイされたかの尺度として、2つのエンジンは互換性があります。
06
結論

2つの強力なエンジン、ごく僅差

2つの強さの研究を通じて、Open Sage 3TとXG Roller++はおおむね同等 — 入手できる中で最強クラスのバックギャモン評価が2つ、互いに接近している — という結果でした。ロールアウトPRの研究 — アンリミテッドと5ポイントマッチの両方で実施 — では、3プライを除くすべての対応レベルでSageの方が強く、3プライでは2つのエンジンはノイズの範囲内にあります。しかもアンリミテッドゲームでは、参照基準をXG自身の階層化分析に切り替えてもこの結果は揺るぎません。最強の評価レベル(Sage 3TとXG Roller++)で2つのエンジンの見解が分かれるポジションを取り上げ、両エンジンのロールアウトに対して採点した不一致ポジションの研究では、チェッカーの不一致についてどちらのロールアウトを基準にしてもSage 3Tの方が近いエンジンであり、キューブの不一致は稀すぎ、かつ拮抗しすぎていて結論は出せませんでした。

つまり、Sage 3TがXG Roller++よりわずかに強いことを示す一定の証拠があります。最も自然な反論 — その優位はSageを自身のロールアウトで採点したことによる見かけ上のものだ — には、検証できる範囲で答えが出ています。XG自身の参照基準で採点しても、Sageの打ち切りレベルは優位を保ちます。とはいえ差は小さく、正直にまとめれば、2つのエンジンは非常に近い、非常に高い水準でプレイしている — そしてそれこそが、私たちが目指した水準でした。

そして第3の研究は、Sageのユーザーが実際に直面する問いに答えます。すでにXGで評価済みの290の実戦トーナメントマッチにおいて、Sageは本質的に同じパフォーマンスレーティングを出します — プレイヤーのSageレーティングとXGレーティングの平均差は統計的にゼロと区別がつかず、その差のばらつきはPR自体のばらつきに比べて小さいのです。テストがロールアウトによる正解に対する強さであれ、実際のゲームがどうプレイされたかについての単純な一致度であれ、Open SageとXGは同じところに行き着きます。

Backgammon Sage Proを試す ホームに戻る
A
付録

結果を再現する

Open Sageはオープンソースとして公開されており、両手法の背後にある完全なパイプラインはエンジンのリポジトリに同梱されています。以下のすべては bgsage パッケージと、ローカルでビルドしたそのエンジンだけで動作します — 外部のサービスやデータセット、インフラは一切不要です。唯一の手作業による依存先はeXtreme Gammon本体で、XGにプログラムから操作できるインターフェースがないため、XG列の再生成に使います。

github.com/markbgsage/bgsage Open Sageエンジン · MPL-2.0 · スクリプトはすべてリポジトリのルートから実行
前提条件。お使いのプラットフォーム向けのリポジトリの手順に従って、bgsageエンジン( bgbot_cpp 拡張モジュール)をビルドします。XG列を再現するには、さらにBatch Analysisの手順のためにeXtreme Gammon(Windows)が必要です。各スクリプトはリポジトリ内でパスを解決するので、必ず bgsage/ ルートから実行してください。

Claude Codeで再現する

パイプラインを手作業で動かす必要はありません。Anthropicのエージェント型コマンドラインコーディングツールであるClaude Codeが、エンジンのビルドとベンチマークの実行を代わりに行ってくれます。リポジトリのチェックアウトを指定して、やりたいことを説明するだけです。以下で詳述するのと同じ手順を、Claude Codeが順に進めます:

「このエンジンをビルドして、同梱のベンチマークに対してSage 3TとSage 3Pを採点し、それぞれのPR、チェッカーPR、キューブPRを見せて。」
「ロールアウトPRの表を再現して:Sageの全レベル — 1プライから4プライ、および1T、2T、3T — を data/money_benchmark/benchmark.json.gz に対して採点し、この研究と比較できる表として出力して。」
「3つのビルドパスでグラウンドトゥルースのベンチマークをゼロから再構築し、それからSage 3Tをそれに対して採点して。」
「自作のボットが ./mybot にある — 同梱ベンチマークの各判断を私のボットで評価して、参照エクイティに対するPRを計算して。」

手法1 — ロールアウトPR

ベンチマーク — 信頼できる評価の階層化セット — は、1本のスクリプト scripts/benchmark_money.pyで構築と採点の両方を行います。入り口は2つあります。

A

同梱データセットに対して採点

再構築不要 · 表の検証や新しいエンジンの採点に

リポジトリには、組み上げ済みのベンチマークが 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です。

B

グラウンドトゥルースをゼロから再構築

すべての判断を再導出 · シード固定なので再現可能

適応的な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列の再現

XGにはAPIがないため、その結果はXGのBatch Analysisから得ています。パス 1はXGインポート用の棋譜を data/money_benchmark/xg/ に書き出します — これらは同梱されていないので、データセットだけから始めた場合はパス 1で再生成してください。

  1. XGで、 xg/ フォルダーをカスタムレベル — 3プライ判断、不一致時はテスト対象のレベルに引き上げ — でBatch Analyzeします。このときSave Games after analyzeにチェックを入れておきます。XGはゲームごとに1つの .xg ファイルを書き出します。
  2. 続いて python scripts/benchmark_pr_xg.pyを実行します。これは各ポジションについてXGの最善判断を .xg ファイルから読み取り、同じ参照エクイティに対して採点して、同じPRの内訳を出力します。

第3節のXG参照のアンリミテッドゲーム表 — そして不一致ポジションの研究 — には、代わりに最難関ポジションのXGによるロールアウトが必要です。それらのポジションに対してXGのBatch Rolloutを(Save Gamesにチェックを入れて)実行し、次に python scripts/xg_benchmark_report.py でそれらを読み取ると、XG参照のレベル表と不一致ポジションレポートの両方が出力されます。下記の手法 2を参照してください。

マッチプレイ

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/, then
python scripts/benchmark_pr_xg_match.py --match-length 5

手法2 — 不一致ポジション

不一致の研究は、手法1で構築したのと同じアンリミテッドベンチマークを元に、最難関ポジションのXG自身のフルロールアウトと突き合わせます。唯一の手作業による依存先はXGのBatch Rolloutで、残りは1本のスクリプトが行います。

アンリミテッドゲーム

  1. アンリミテッドベンチマークを構築します(手法1、オプション B)。パス 1はXGインポート用の棋譜も次の場所に書き出します: data/money_benchmark/xg/.
  2. XGで、Save Games after analyzeにチェックを入れた状態でそれらのポジションをBatch Rolloutします。ロールアウトされた各判断について、XG自身のロールアウトエクイティが書き込まれる先は、出力される .xg ファイルです。
  3. 収集してレポート:
python scripts/xg_benchmark_report.py

このスクリプトはXGのロールアウトを読み取って data/money_benchmark/xg_results/rollout.jsonlに書き出し、続いてXGロールアウトに対する評価レベル別PR(第3節の第2の参照基準)と不一致ポジションレポート — すべての不一致をSageとXGのロールアウトに対して順に採点したもの — の両方を出力します。

マッチプレイはこの手法ではまだ扱っていません。マッチのポジションのXGフルロールアウトが必要ですが、まだ実行していないためです。マッチでの強さは代わりに、ロールアウトPRの研究(第3節)と実戦マッチの一致度の研究(第5節)でカバーしています。

Open SageはMPL-2.0でライセンスされています。同梱のベンチマークは第3節の表の背後にある参照基準そのものです。XG参照の比較と不一致ポジションの結果はどちらも、そこから再生成できます。必要なのは、XGのBatch Rolloutで生成した対応する .xg ファイルです。