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

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

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 と統計的にゼロと区別できません。

01
はじめに

なぜXGと比較するのか?

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に持ち込めます。

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.23
vs
0.34
XG Roller++
打ち切りロールアウト · 3プライ判断 · 7ターンで打ち切り
Sage 3Tが0.11 PRリード
Sage 2T
打ち切りロールアウト · 2プライ判断
0.27
vs
0.41
XG Roller+
打ち切りロールアウト · 2プライ判断
Sage 2Tが0.14 PRリード
Sage 1T
打ち切りロールアウト · 1プライ判断 · 5ターンで打ち切り · 72ゲーム
0.49
vs
0.53
XG Roller
打ち切りロールアウト · 1プライ判断 · 5ターンで打ち切り · 42ゲーム
Sage 1Tが0.04 PRリード
Sage 4P
4プライ先読み探索
0.43
vs
0.47
XG 4プライ
4プライ先読み探索
Sage 4Pが0.04 PRリード
Sage 3P
3プライ先読み探索
0.60
vs
0.57
XG 3プライ
3プライ先読み探索
事実上の互角 — XG 3プライが0.03 PRリード

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

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

エンジン PR チェッカー キューブ ピュアレース レース アタック プライミング アンカリング
Sage 3T 0.230.200.410.020.250.200.320.32
XG Roller++ 0.340.330.380.040.440.250.410.48
Sage 2T 0.270.240.430.020.320.200.400.36
XG Roller+ 0.410.410.390.050.600.310.470.54
Sage 1T 0.490.500.430.040.580.430.620.64
XG Roller 0.530.540.480.050.640.450.710.67
Sage 4P 0.430.420.520.080.540.390.450.60
XG 4プライ 0.470.460.520.060.590.400.570.59
Sage 3P 0.600.600.610.130.780.530.670.75
XG 3プライ 0.570.570.580.050.720.480.730.72
Sage 2P 1.681.442.910.401.841.861.871.77
Sage 1P 2.552.423.240.422.712.793.132.74
Open Sage eXtreme Gammon Sage 2Pと1Pには今回の実行で対応するXGレベルがなく、参考として示しています。
Sageの評価は、3プライを除くすべての対応レベルでXGの同等の評価より強い結果でした。3プライではXGが0.03 PR上回りますが、これはノイズの範囲内の差です。2つのエンジンは接近しており、多くのユーザーが頼りにする打ち切りロールアウトのレベルではSageが明確な優位を保っています — Roller++の0.34に対して0.23、Roller+の0.41に対して0.27です。

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

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

エンジン PR チェッカー キューブ ピュアレース レース アタック プライミング アンカリング
Sage 3T 0.280.260.410.020.400.230.310.37
XG Roller++ 0.210.200.230.010.300.180.220.25
Sage 2T 0.300.290.360.020.390.280.360.38
XG Roller+ 0.300.320.230.010.480.250.260.40
Sage 1T 0.460.470.420.030.610.420.500.57
XG Roller 0.400.410.350.030.530.340.530.45
Sage 4P 0.390.380.430.060.550.360.420.42
XG 4プライ 0.340.330.400.030.460.330.410.36
Sage 3P 0.500.490.560.080.670.470.560.56
XG 3プライ 0.410.410.400.030.540.360.520.46
Sage 2P 1.381.172.440.301.571.501.551.45
Sage 1P 2.192.072.810.362.272.442.712.30
Open Sage eXtreme Gammon 参照基準:XG 3プライ(3P階層) · XG Roller++(3T階層) · XGフルロールアウト(ロールアウト階層)。
XG自身の参照基準で採点すると順位は逆転します。2Tを除くすべての対応レベルでXGが上回り — 2TではSage 2TとXG Roller+が0.30で並びます — XG Roller++はSage 3Tの0.28に対して0.21です。どちらの表にも同じ構造的な偏りがあります。判断の3分の2近くは参照基準自身の3プライまたは打ち切りロールアウトで確定しており、ある階層を確定させたレベルは、その階層ではほぼゼロのスコアになります — ここではXG 3プライとXG Roller++、上の表ではSage 3PとSage 3Tです。より公平なテストはロールアウトにかけた判断です。そこでは評価対象のレベルではなく、フルロールアウトが判定するからです。XGのロールアウトではRoller++がSage 3Tをわずかに上回り(0.56対0.60)、SageのロールアウトではSage 3Tが大きく上回ります(0.51対0.76)。
2つの参照基準、2つの判定。Sageの参照基準ではSage 3TがXG Roller++を0.23対0.34でリードし、XGの参照基準ではRoller++が0.21対0.28でリードします。最上位のレベルでは、それぞれのエンジンが自分自身の分析に対して優位に立つのです — 争点局面の研究(第4節)が、両エンジンが明確に食い違う局面で見いだしたのと同じパターンです。2つのエンジンは非常に接近しており、どちらが上回るかは、どちらの分析を正解とするかで決まります。

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

マッチのセットでも同じ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.23
vs
0.36
XG Roller++
打ち切りロールアウト · 3プライ判断 · 7ターンで打ち切り
Sage 3Tが0.13 PRリード
Sage 2T
打ち切りロールアウト · 2プライ判断
0.26
vs
0.44
XG Roller+
打ち切りロールアウト · 2プライ判断
Sage 2Tが0.18 PRリード
Sage 1T
打ち切りロールアウト · 1プライ判断 · 5ターンで打ち切り · 72ゲーム
0.47
vs
0.51
XG Roller
打ち切りロールアウト · 1プライ判断 · 5ターンで打ち切り · 42ゲーム
Sage 1Tが0.04 PRリード
Sage 4P
4プライ先読み探索
0.41
vs
0.46
XG 4プライ
4プライ先読み探索
Sage 4Pが0.05 PRリード
Sage 3P
3プライ先読み探索
0.56
vs
0.54
XG 3プライ
3プライ先読み探索
事実上の互角 — XG 3プライが0.02 PRリード

マッチプレイ — 詳細内訳

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

エンジン PR チェッカー キューブ ピュアレース レース アタック プライミング アンカリング
Sage 3T 0.230.200.460.070.220.200.280.31
XG Roller++ 0.360.350.440.080.440.320.330.49
Sage 2T 0.260.240.400.020.350.180.310.35
XG Roller+ 0.440.440.440.090.540.440.390.55
Sage 1T 0.470.470.470.060.550.450.550.56
XG Roller 0.510.510.560.090.630.490.500.65
Sage 4P 0.410.410.470.050.500.370.440.53
XG 4プライ 0.460.450.580.090.590.440.420.60
Sage 3P 0.560.540.710.050.730.550.590.63
XG 3プライ 0.540.530.620.090.680.530.520.68
Sage 2P 1.271.231.580.391.461.241.491.39
Sage 1P 2.222.212.350.382.432.412.442.47
Open Sage eXtreme Gammon Sage 2Pと1Pには今回の実行で対応するXGレベルがなく、参考として示しています。
マッチの結果はアンリミテッドの研究と同じ傾向を示します。Sageは3プライを除くすべての対応レベルでXGの同等の評価より強く、3プライではXGが0.02 PR上回りますが、これはノイズの範囲に十分収まる差です。Sageの最も明確な優位は、ここでも多くのユーザーが頼りにする打ち切りロールアウトのレベル(3Tと2T)にあります — Roller++の0.36に対して0.23、Roller+の0.44に対して0.26です。

バックゲーム、コンテインメントゲーム、スネーク

通常の自己対戦ゲームでは、深いバックゲーム、コンテインメントゲーム、取り残された1個のチェッカーを捕らえる遠い側のプライムはめったに生じないため、アンリミテッドとマッチのセットは、エンジンがそれらをどうプレイするかについてほとんど何も語りません — そしてそれらは、エンジンが歴史的に最も弱かったポジションです。13のポジション群ベンチマークがそれらを直接測定します。各ベンチマークはアンリミテッドベンチマークと同じように — ロールアウト品質の参照基準を備えた実際の判断で — 構築されていますが、判断はその群の内側から抽出されています:

  • 10種の古典的バックゲーム。バックゲーム側が相手のホームボードで保持する2つのポイントで名付けられます — 2‑1バックゲームは相手の2ポイントと1ポイントを、5‑4は5ポイントと4ポイントを保持する、といった具合です。各ベンチマークには約1,000件の判断が含まれ、両方のアンカーがまだ保持され、その側がレースで遅れている間だけ記録されます。
  • コンテインメントゲーム。逃げる側によって定義されます。片方はすでに何個かのチェッカーをベアオフしており、ヒットされてボード全体を走って帰らなければならないチェッカーを1〜3個抱えています。レースで負けているもう片方は、残っているものを並べ替えてそれらをヒットし続けます。
  • 大規模バックゲーム — 相手のホームボードに3つ以上のアンカーを持つか、2つのアンカーに加えて7個以上のチェッカーを後方に残しているもの。
  • スネーク — ボードの相手側半分に4つ以上連続して作ったポイントが並び、相手の他のチェッカーがホームに押し込められている間に、取り残された1個のチェッカーを捕らえるもの。バックゲームというよりプライミングゲームであり、バックギャモンで最もプレイの難しい形の一つです。

各群は少数のシードポジションから始まります。Sageはそのシードから3プライで自己対戦のアンリミテッドゲームをプレイし、ポジションがまだその群に属している間に生じたすべての判断を記録し、記録された各判断をロールアウトして参照基準を作ります — 5,184ゲームを最後までプレイし、最初の3ハーフムーブはチェッカーとキューブの判断を3プライ、以降は2プライで行い、分散低減を有効にします。候補手の補完パスでは、テスト対象のエンジンが実際に選んだすべての手をロールアウトしたので、以下の各スコアはロールアウト品質の候補手に対するものです。相手がキューブを持っているキューブポジションは手番のプレイヤーの判断ではないため、採点しません。

ベンチマーク 判断数 2-ply 3-ply 4-ply 1T / Roller 2T / Roller+ 3T / Roller++
SageXG SageXG SageXG SageXG SageXG SageXG
2-1バックゲーム1,0002.262.841.011.641.031.220.611.670.410.980.380.93
3-1バックゲーム1,0012.222.220.880.950.670.720.660.910.340.590.320.48
3-2バックゲーム1,0082.072.390.911.310.780.990.650.950.440.610.250.51
4-1バックゲーム1,0011.771.830.780.820.600.530.550.690.240.470.190.45
4-2バックゲーム1,0002.161.960.731.050.690.550.630.790.360.610.270.43
5-1バックゲーム1,0031.321.770.660.760.460.640.490.600.260.410.230.32
5-2バックゲーム1,0021.531.600.490.820.480.630.530.630.330.410.240.30
4-3バックゲーム1,0021.692.130.740.800.550.580.520.760.240.550.190.44
5-3バックゲーム1,0031.862.131.020.890.580.630.680.810.350.460.210.44
5-4バックゲーム1,0012.452.740.931.150.730.780.760.970.470.550.300.49
コンテインメント3,2704.7314.622.5411.252.0510.372.297.761.307.851.056.16
スネーク97821.0039.9221.4236.6423.5336.1711.1932.998.4232.385.8532.24
大規模バックゲーム2,1034.335.762.564.442.173.681.913.141.392.751.092.64
Open Sage eXtreme Gammon 各ファミリーのロールアウト基準に対する PR。低いほど良く、各組で優れている方のエンジンを強調しています。
古典的な 10 のバックゲームを合計すると(10,021 の判断)、Sage の PR は 2-ply で 1.93、3-ply で 0.82、3T で 0.26 となり、ブランダーは 28 からゼロまで減ります。コンテインメントと大規模バックゲームはどのレベルでも 3〜4 倍難しく — 3T で 1.05 と 1.09 — スネークは別格です。2-ply で 21.00、3T でもなお 5.85。またスネークは、プライを深めても確実には改善せず、打ち切りロールアウトのレベルでのみ改善する唯一のファミリーです。これは「保持するか解放するか」という判断のファミリーに特有の姿で、選択は長いコンテインメントがどう決着するかに依存し、そこに届くのはシミュレーションだけです。スネークの行は Sage のレベルの順位ではなく、この局面ファミリーが解決からどれだけ遠いかの指標として読んでください。
これらのベンチマークにおける XG。Sage は 13 のファミリーすべてで、また合計したどのレベルでも先行しています。10 のバックゲームでは 2-ply で 1.93 対 2.16、3T で 0.26 対 0.48。差はファミリーの難度とともに広がり、3T ではコンテインメントが 1.05 対 6.16、大規模バックゲームが 1.09 対 2.64、スネークが 5.85 対 32.24 です。78 のセルのうち逆になるのは 4 つだけで、いずれも 2-ply から 4-ply の個別のバックゲームであり、そこでは両エンジンとも既に 1.1 を下回っています。XG にはプログラム用のインターフェースがないため、その判断はネイティブ形式の書き出しから Batch Analyze で再現します .xg 形式の書き出し(付録を参照)。
04
手法2

不一致ポジション

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

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

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

結果

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

チェッカープレイ

Sage 3TとXG Roller++が異なる手を選んだケース
5,687
ロールアウト済みのチェッカー判断
1,286
不一致
1,139
採点対象(共通セット)
最善手と一致 — XG自身のロールアウト基準
平均エクイティエラー — Sage 3T 0.0030 · XG Roller++ 0.0030  (PR 1.51 vs 1.49)
最善手と一致 — Sageのロールアウト基準
平均エクイティエラー — Sage 3T 0.0023 · XG Roller++ 0.0040  (PR 1.14 vs 1.98)
Sage 3T XG Roller++ どちらでもない

キューブ判断

Sage 3TとXG Roller++が異なるキューブアクションを選んだケース
282
ロールアウト済みのキューブ判断
80
不一致
最善アクションと一致 — XG自身のロールアウト基準
平均エクイティエラー — Sage 3T 0.0110 · XG Roller++ 0.0074  (PR 5.50 vs 3.69)
最善アクションと一致 — Sageのロールアウト基準
平均エクイティエラー — Sage 3T 0.0058 · XG Roller++ 0.0102  (PR 2.88 vs 5.08)
Sage 3T XG Roller++
キューブの不一致は全部で80件だけ — 小さなサンプルなので、このパネルは決定的なものではなく示唆的なものとして読んでください。
チェッカープレイ — 不一致の大多数 — では、どの手が最善かについて各ロールアウトが自身のエンジンの側につきます。XGのロールアウト基準ではXG Roller++の方が最善手と一致する頻度が高く(52.2%対37.7%)、Sageのロールアウト基準ではSage 3Tの方が高くなります(50.0%対38.1%)。不一致の選択がどれだけのエクイティを失うかで測ると、XGのロールアウト基準では両者は互角(ともに0.0030)で、Sageの基準ではSage 3Tの方が近い結果です(0.0023対0.0040)。キューブの不一致ははるかに稀で、結果はまちまちです。Sage 3Tはどちらのロールアウト基準でもロールアウトのキューブアクションと一致する頻度が高いものの、XGのロールアウト基準ではSage 3Tの外した判断の方が高くつきます。
ロールアウトが 2 つある意味。単一の基準による結果は常に「誰にとっての正解か」という問いを招きます。ここでは 2 つのロールアウトが独立したエンジンから得られており、強い 2 つのエンジンが食い違う局面では、ロールアウトどうしも食い違い、それぞれが自分を実行したエンジンの側に傾きます。争点となる局面は Sage 3T と XG Roller++ を分けません。
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つの強力なエンジン、ごく僅差

強さの研究において、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は同じところに行き着きます。

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_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

手法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
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
Open Sage は MPL-2.0 ライセンスで提供されます。同梱のベンチマークは第 3 節の表の背後にある参照そのものです。XG 基準による比較と争点局面の結果は、いずれもそこから再生成できます。必要なのは、XG の Batch Rollout が生成する対応する .xg ファイルです。