Backgammon Sage Pro'ya güç veren Open Sage değerlendirme motorunun, eXtreme Gammon'ın bot motoru (XG) ile nicel bir karşılaştırması.
Open Sage bot motorunu eXtreme Gammon (XG) ile eşleşen değerlendirme seviyelerinde karşılaştırıyoruz — doğrudan sinir ağı değerlendirmesi, çok katmanlı (multi-ply) arama ve kesilmiş rollout'lar. XG programatik bir arayüz sunmadığı için onu Batch Analysis özelliği üzerinden puanlıyoruz. Birbirini tamamlayan üç yöntem kullanıyoruz. Birincisi katmanlı bir referans değerlendirme kümesi kurar — seçim net olduğunda hızlı değerlendirmelere güvenir, yakın kararları tam rollout'lara yükseltir — ve her motoru bu referansa karşı bir Performance Rating (PR) ile puanlar; 500 sınırsız oyun (17.535 karar) ve 130 beş sayılık maç (18.292 karar) üzerinden. Sınırsız oyunlar için ardından aynı karşılaştırmanın tamamını XG'nin kendi kademeli analizini referans alarak yeniden kuruyoruz — tam bir ayna görüntüsü. İkinci yöntem, Sage 3T ile XG Roller++'ın gerçekten ayrıldığı sınırsız oyun pozisyonlarını ayırır ve her birini iki motorun tam rollout'larına karşı değerlendirir. Aynı referans ve puanlama yöntemi, backgame, containment ve snake ailelerinden on üç benchmark'a uygulanır — motorların tarihsel olarak en kötü oynadığı pozisyonlar. Güç çalışmalarında iki motor birbirine yakındır: Sage'in referansına göre puanlandığında Sage, çoğu kullanıcının dayandığı kesilmiş rollout seviyelerinde öndedir; XG'ninkine göre puanlandığında ise XG öndedir ya da başabaştır. Üçüncü yöntem soruyu tersine çevirir: XG'de zaten analiz edilmiş 290 gerçek turnuva maçını Sage'de yeniden analiz eder ve iki motorun her oyuncuya verdiği Performance Rating'i karşılaştırırız. İki derece birbirini çok yakından izler: 580 oyuncu derecesinde iki derece arasında %98'lik bir korelasyon vardır ve ortalama fark yalnızca +0,002 PR olup istatistiksel olarak sıfırdan ayırt edilemez.
eXtreme Gammon (XG), bilgisayarla tavla analizinde standart bir referanstır ve değerlendirme motoru mevcut en güçlü motorlardan biri olarak kabul edilir. Ciddiye alınmak isteyen her yeni motorun basit bir soruyu yanıtlaması gerekir: XG ile karşılaştırıldığında nerede duruyor? Bu çalışma, Backgammon Sage Pro'nun arkasındaki sinir ağı motoru Open Sage için bu soruyu nicel olarak yanıtlamayı amaçlıyor.
Amacımız, Open Sage'in değerlendirmelerini XG'ninkilerle benzer çaba seviyelerinde karşılaştırmaktı. En doğal deney — motorları milyonlarca oyunda karşı karşıya getirip sonucu saymak — pratik değil: XG masaüstü uygulaması programatik bir arayüz sunmuyor, bu yüzden pozisyonları ve hamleleri iki motor arasında taşımak elle, tıklaya tıklaya yürütülen bir süreç. İki güçlü motor arasındaki küçük farkları ayırt edecek büyüklükte bir örnekleme ulaşmak çok uzun sürerdi.
Bunun yerine, yüzlerce kayda geçirilmiş oyunu tek bir gözetimsiz geçişte puanlayabilen XG'nin Toplu Analiz (Batch Analysis) özelliğini kullanıyoruz. Open Sage çok sayıda oyunda iki tarafı da oynuyor; her oyun XG'nin içe aktarabildiği standart bir metin biçiminde dışa aktarılıyor; XG hepsini analiz ediyor; biz de kararlarını geri ayrıştırıyoruz. Bu ortak temelin üzerine, Bölüm 3 ve Bölüm 4'te anlatılan iki ayrı yöntem uyguluyoruz.
Üçüncü bir çalışma (Bölüm 5) simülasyonları tamamen bir kenara bırakıp XG'de analiz edilmiş gerçek turnuva maçlarından yola çıkıyor. Amacı farklı: hangi motorun daha güçlü olduğunu sormak yerine, bir maçı Sage'de analiz eden bir oyuncunun XG'nin vereceği Performance Rating'in aynısını alıp almadığını soruyor — böylece XG'de bir PR'ın ne anlama geldiğine dair yıllar içinde oluşmuş sezgi doğrudan Sage'e taşınabiliyor.
Her iki motor da bir pozisyonu, doğruluktan hız adına ödün vererek çeşitli derinliklerde değerlendirebilir. Sonuçları okumak için bu seviyeleri anlamak şarttır, çünkü karşılaştırma her zaman iki motorun eşleştirilmiş seviyeleri arasında yapılır.
Doğrudan değerlendirme (1-ply). Sinir ağının bir pozisyon için ürettiği ham çıktı; ileri bakış yok. En hızlı ayar budur ve daha derin her seviye bunun üzerine kurulur. (1-ply'ın ham ağ değerlendirmesini ifade ettiği XG geleneğini izliyoruz.)
Çok-ply ileri bakış (2-, 3-, 4-ply). Motor birkaç tur ilerisine bakar; rakibin yanıtlarını hesaba katar, her adımda olası zar atışları üzerinden ortalama alır ve her varyantın sonunda ham bir ağ değerlendirmesi yapar. Her ek ply daha doğru ve belirgin biçimde daha maliyetlidir.
Kısaltılmış rollout'lar (1T, 2T, 3T). Motor sabit bir derinliğe kadar aramak yerine çok sayıda kısa simüle oyun oynar, bunları birkaç tur sonra keser ve ortaya çıkan pozisyonu çok-ply ileri bakışla değerlendirir. Varyans azaltma, örneklenen zarlardaki şansın büyük kısmını dengeler. Bunlar XG'nin “Roller” ayarlarıdır; sabit derinlikli aramadan daha güçlüdür ve tam rollout'tan çok daha ucuz kalır.
Tam rollout. Çok sayıda simüle oyunun sonuna kadar oynanması. Yeterli hacimde ve varyans azaltmayla çalıştırıldığında tam rollout, bir tavla motorunun üretebileceği gerçeğe en yakın şeydir; bu çalışma boyunca referans ölçüt olarak onu kullanıyoruz.
| Tür | Sage | XG karşılığı | Ne yapar |
|---|---|---|---|
| Doğrudan | 1-ply | 1-ply (ham değerlendirme) | Pozisyonun tek bir sinir ağı değerlendirmesi — ileri bakış yok. |
| Çok-ply | 2P · 3P · 4P | 2-ply · 3-ply · 4-ply | Rakibin yanıtlarını birkaç tur derinliğinde arar, zarlar üzerinden ortalama alır. |
| Kısaltılmış rollout | 1T · 2T · 3T | Roller · Roller+ · Roller++ | Çok sayıda kısa simüle oyun; 5–7 tur sonra kesilip çok-ply ile değerlendirilir, varyans azaltma uygulanır. 3T/Roller++ 3-ply kararlar kullanır; 2T/Roller+ 2-ply; 1T/Roller 1-ply. |
| Tam rollout | Rollout | Rollout | Sonuna kadar oynanan simüle oyunlar — bu çalışmadaki referans “gerçek”. |
İlk yöntem, her motoru “gerçek” en iyi oyununu olabildiğince doğru biçimde belirlediğimiz sabit bir karar kümesine göre puanlar. XG'yi bir dizi başka botla karşılaştıran, iyi bilinen 2012 XG çalışmasında kullanılan yaklaşımın aynısını izler.
Sage 3P'nin kendi kendine oynadığı 500 sınırsız oyun simüle ederek başladık. 3P gibi orta-güçlü bir seviye her oyun planında — yarış, saldırı, blok, çıpa — gerçekçi bir pozisyon dağılımı üretir; test etmek istediğimiz çeşitlilik tam da budur. Ardından tüm çalışmayı, tahtadaki skorun her kararın değerini değiştirdiği 130 beş puanlık maç için ikinci kez yürüttük; her iki kümenin sonuçları aşağıdadır.
Her karar için gerçek en iyi oyunu tam rollout ile belirlemek çok pahalı olurdu — ve gereksiz, çünkü kararların çoğu yakın değildir. Bu yüzden referansı, rollout çabasını yalnızca seçimin gerçekten şüpheli olduğu yerlere harcayarak kademeli üç geçişte kuruyoruz. Aynı reçete iki veri kümesine de uygulanır; her geçiş güvenle çözebildiği kararları karara bağlar, kalanını bir sonrakine devreder:
Her karar 3-ply'da değerlendirilir. En iyi hamlenin bir sonrakini 0,05 equity'den fazla geçtiği yerlerde 3P kararı gerçek kabul edilir ve karar kapanır.
Kalan kararlar 3T'de yeniden değerlendirilir. Farkın artık 0,02 equity'den geniş olduğu yerlerde 3T kararı gerçek kabul edilir.
Hâlâ 0,02 içinde kalan her şey tam bir Sage rollout'uyla karara bağlanır: hem pul oyunu hem küp aksiyonları için 3P kararlar; equity üzerindeki %95 güven aralığı 0,005'in altına düşene — ya da 20.736 yol (16 × 1.296) tavanına ulaşılana — kadar 1.296'lık yol partileri hâlinde çalıştırılır. En yavaş geri oyun pozisyonları tek tek bir saatten çok daha uzun sürdü.
Sonuç, her kararın tam olarak zorluğunun gerektirdiği derinlikte çözüldüğü katmanlı bir referanstır. Aynı üç geçişli reçeteyi iki veri kümesi üzerinde de yürüttük — 500 sınırsız oyun ve 130 beş puanlık maç — ve ortaya çıkan kademe bileşimleri aşağıda her kümenin sonuçlarının yanında gösteriliyor.
Elde katmanlı bir güvenilir değerlendirme kümesi olunca herhangi bir motoru puanlamak basittir: her kıyaslama kararını motora sunar, seçtiği hamlenin ya da küp aksiyonunun gerçeğe göre equity hatasını kaydeder ve ortalama hata × 500 değerini PR olarak raporlarız. Aynı toplam, pul oyunu ve küp PR'larına, ayrıca oyun planına göre ayrıştırılır.
XG'yi puanlamak, girişte anlatılan ek adımı gerektirdi. XG'nin API'si olmadığından, Toplu Analizini 500 sınırsız oyun ve 130 maç transkripti üzerinde özel bir seviyeyle — 3-ply kararlar, anlaşmazlık olan her yerde test edilen seviyeye yükseltme — çalıştırdık ve XG'nin her pozisyon için tercih ettiği kararı, ürettiği
.xg
dosyalarından ayrıştırıp aynı referans equity'lere göre puanladık.
500 sınırsız oyun boyunca üç geçiş 16.889 pozisyonu (17.535 karar) şöyle çözdü:
Beş eşleştirilmiş seviye, bu 17.535 karar üzerinden puanlandı. Düşük PR daha iyidir; her çiftte daha güçlü motor vurgulanmıştır.
Test edilen her motor ve seviye için PR; karar türüne ve oyun planına göre ayrıştırılmış. Düşük olan daha iyidir.
| Motor | PR | Pul | Küp | Saf yarış | Yarış | Saldırı | Blok | Çıpa |
|---|---|---|---|---|---|---|---|---|
| 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-ply | 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-ply | 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 |
Yukarıdaki her sayı motorları Sage'in kademeli referansına göre notlar. Akla gelen ilk itiraz ev sahibi avantajıdır — Sage kendi rollout'larına göre ölçülüyor. Bu yüzden tam ayna görüntüsünü kurduk: aynı 500 oyun ve aynı kararlar, ama her kademede gerçek olarak XG'nin kendi analizi. 3P kademesindeki kararları XG 3-ply, 3T kademesindekileri XG Roller++, rollout yapılan kararları ise XG'nin kendi tam rollout'u karara bağlar — Sage referansının kademe kademe XG karşılığı. Ardından her motor buna göre yeniden puanlanır.
| Motor | PR | Pul | Küp | Saf yarış | Yarış | Saldırı | Blok | Çıpa |
|---|---|---|---|---|---|---|---|---|
| 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-ply | 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-ply | 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 |
Maç kümesi aynı üç geçişi tek bir eklemeyle yürütür: her oyuncunun kala skoru ve Crawford bayrağı her değerlendirmeye işlenir, böylece gerçek, doğru skora göre maç equity'si (MWC) uzayında hesaplanır. 130 beş puanlık maç boyunca geçişler 17.892 pozisyonu (18.292 karar) şöyle çözdü:
Beş eşleştirilmiş seviye, bu 18.292 karar üzerinden puanlandı. Düşük PR daha iyidir; her çiftte daha güçlü motor vurgulanmıştır.
5 puanlık maç kümesinde test edilen her motor ve seviye için PR; karar türüne ve oyun planına göre ayrıştırılmış. Düşük olan daha iyidir.
| Motor | PR | Pul | Küp | Saf yarış | Yarış | Saldırı | Blok | Çıpa |
|---|---|---|---|---|---|---|---|---|
| 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-ply | 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-ply | 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 |
Motorun kendi kendine oynadığı sıradan oyunlar nadiren derin bir geri oyun, bir hapsetme oyunu ya da tek bir geride kalmış pulu tutan bir uzak taraf bloğu üretir; bu yüzden sınırsız oyun ve maç kümeleri bir motorun bunları nasıl oynadığı hakkında pek az şey söyler — oysa bunlar motorların tarihsel olarak en zayıf olduğu pozisyonlardır. On üç pozisyon ailesi kıyaslama kümesi bunları doğrudan ölçer; her biri sınırsız oyun kıyaslama kümesi gibi kurulmuştur — her biri rollout kalitesinde bir referans taşıyan gerçek kararlar — ama kararlar ailenin içinden alınır:
Her aile küçük bir tohum pozisyon kümesinden başlar. Sage bu tohumlardan kendine karşı 3-ply'da sınırsız oyunlar oynar, pozisyon hâlâ aileye aitken ortaya çıkan her karar kaydedilir ve kaydedilen her karar için referansını üretmek üzere rollout yapılır — sonuna kadar oynanan 5.184 yol, ilk üç yarım hamlede 3-ply pul ve küp kararlarıyla, sonrasında 2-ply, varyans azaltma açık. Aday tamamlama geçişleri, test edilen bir motorun fiilen seçtiği her hamle için rollout yaptı; böylece aşağıdaki her puan rollout kalitesinde bir adaya göredir. Küpün rakibe ait olduğu bir küp pozisyonu sıradaki oyuncu için bir karar değildir ve puanlanmaz.
| Kıyaslama kümesi | Karar | 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 geri oyunu | 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 geri oyunu | 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 geri oyunu | 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 geri oyunu | 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 geri oyunu | 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 geri oyunu | 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 geri oyunu | 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 geri oyunu | 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 geri oyunu | 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 geri oyunu | 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 |
| Hapsetme | 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 |
| Snake | 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 |
| Masif geri oyun | 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 dışa aktarımları (bkz. Ek).
Rollout PR yöntemi iki motoru ortak bir referansa göre puanlar. Daha keskin, daha doğrudan soru şu: gerçekçi oyunda iki motor en iyi hamle konusunda nerede gerçekten ayrışıyor — ve ayrıştıklarında hangisi haklı?
Bunu Birinci Yöntem'deki en zor sınırsız oyun kararları üzerinde yanıtlıyoruz — rollout yapılan pozisyonlar; bunların her biri artık hem tam bir Sage rollout'u hem de tam bir XG rollout'u taşıyor. Aralarında Sage 3T ile XG Roller++'ın farklı seçim yaptığı her kararı bulup her rollout'un hangi seçimi tercih ettiğini soruyoruz. İki rollout'a birden sahip olmak işin özü: her anlaşmazlık Sage'in rollout'una ve XG'nin kendi rollout'una göre yargılanır, böylece yanıt hiçbir zaman tek bir motorun gerçeğine güvenmeye dayanmaz.
Rollout yapılan sınırsız oyun pozisyonlarında — çalışmanın en zor kararları — iki motor 1.286 pul oyununda ve 80 küp kararında ayrışıyor. Her panel, her motorun rollout'un en iyi kararıyla ne sıklıkla örtüştüğünü gösteriyor — sırasıyla XG'nin kendi rollout'una ve Sage'in rollout'una göre puanlanmış.
İlk iki yöntem hangi motorun daha güçlü olduğunu sorar. Kendi oyununu incelemek için motor kullanan herkes için üçüncü bir soru da bir o kadar önemlidir: gerçek bir maçı XG'de analiz edip performans derecenizi not ettikten sonra aynı maçı Sage'de analiz ederseniz — iki derece birbirine ne kadar yakın çıkar? XG'de belirli bir PR'ın ne anlama geldiğine dair yıllarca sezgi geliştirmiş bir oyuncu, Sage'den de esasen aynı sayıyı almalıdır.
Bunu doğrudan sınamak için XG'de zaten analiz edilmiş geniş bir gerçek turnuva maçı koleksiyonu aldık, her birini Sage'de sıfırdan yeniden analiz ettik ve iki motorun her oyuncuya verdiği performans derecesini karşılaştırdık.
Maç dosyaları 2026'daki üç turnuvadan geliyor; hepsi 7 puanlık maçlar ve Máté Fehér tarafından cömertçe sağlandı — rekabetçi bir oyuncunun kendi oyunlarını inceleyeceği gibi, eXtreme Gammon'da zaten analiz edilmiş hâlde.
Toplamda 290 maç ve 580 bireysel oyuncu derecesi. Bir maç daha bozuk transkripsiyon nedeniyle dışarıda bırakıldı.
580 oyuncu derecesinin tamamı bir araya getirildiğinde iki motor neredeyse birebir uyuşuyor. Ortalama fark istatistiksel olarak sıfırdan ayırt edilemez ve bu farkın yayılımı, PR'ın kendi yayılımının yanında küçük kalıyor.
| Oyuncu başına performans derecesi | XG | Sage | FarkSage − XG |
|---|---|---|---|
| Ortalama | 4.36 | 4.36 | +0.002 |
| Standart sapma | 2.08 | 2.10 | 0.37 |
| %95 aralık | 1.52 – 9.36 | 1.44 – 9.67 | −0.76 – +0.74 |
Güç çalışmalarında Open Sage 3T ve XG Roller++, mevcut en güçlü tavla değerlendirmelerinden ikisidir ve birbirlerine yakındır. Rollout PR çalışması — hem sınırsız oyun hem de 5 sayılık maçlar için yürütülmüştür — Sage'i 3-ply dışında her eşleşen seviyede daha güçlü bulur; 3-ply'de iki motor gürültü sınırları içindedir ve en net üstünlük kesilmiş rollout seviyelerindedir. Çalışma sınırsız oyunlar için XG'nin kendi analizi referans alınarak yeniden kurulduğunda sıralama tersine döner: XG, iki motorun başabaş olduğu 2T dışında her eşleşen seviyede öndedir. İki motorun en güçlü değerlendirme seviyesinde ayrıldığı pozisyonları alıp bunları her iki motorun rollout'larına karşı puanlayan tartışmalı pozisyon çalışması, pul oyununda başabaştır — her rollout kendisini üreten motoru kayırır — küp anlaşmazlıkları ise karar vermek için fazla seyrek ve fazla bölünmüştür.
Dürüst özet şu: iki motor çok benzer ve çok yüksek bir seviyede oynuyor ve her biri kendi analizine göre en iyi sonucu alıyor. Sage'in referansına göre kesilmiş rollout'ları, XG'nin Roller seviyelerinin kaçırdığı kararları doğru bulur; XG'ninkine göre ise tersi geçerlidir; iki motorun açıkça ayrıldığı pozisyonlarda da hiçbir motorun rollout'u diğerini belirgin biçimde geride bırakmaz. İki motorun ayrıştığı yer aile benchmark'larıdır — backgame'ler, containment oyunları ve snake: aynı ölçütle ve her eşleşen seviyede Sage on üçünün tamamında öndedir ve containment oyunlarıyla snake'te üç kat veya daha fazla farkla.
Üçüncü çalışma ise bir Sage kullanıcısının gerçekten karşılaştığı soruyu yanıtlıyor: XG'nin zaten derecelendirdiği 290 gerçek turnuva maçında Sage esasen aynı performans derecesini üretiyor — bir oyuncunun Sage ve XG dereceleri arasındaki ortalama fark istatistiksel olarak sıfırdan ayırt edilemez ve bu farkın yayılımı PR'ın kendi yayılımının yanında küçük. İster rollout ile oluşturulmuş bir gerçeğe karşı güç, ister gerçek bir oyunun nasıl oynandığı konusunda basit bir uyum sınansın, Open Sage ile XG aynı yere varıyor.
Open Sage açık kaynak olarak yayımlanır ve iki yöntemin arkasındaki eksiksiz işlem hattı motorun deposuyla birlikte gelir. Aşağıdaki her şey yalnızca
bgsage paketine ve motorunun yerel bir derlemesine dayanır — harici hizmet, veri kümesi ya da altyapı gerekmez. Elle yürütülen tek bağımlılık, XG sütunlarını yeniden üretmek için kullanılan eXtreme Gammon'ın kendisidir, çünkü XG'nin programatik arayüzü yoktur.
bgbot_cpp uzantısını) platformunuza uygun depo yönergelerini izleyerek derleyin. Herhangi bir XG sütununu yeniden üretmek, Toplu Analiz adımı için ayrıca eXtreme Gammon (Windows) gerektirir. Her betik yollarını deponun içinde çözer; bu yüzden betikleri bgsage/ kökünden çalıştırın.
İşlem hattını elle sürmek zorunda değilsiniz. Anthropic'in komut satırında çalışan ajan tabanlı kodlama aracı Claude Code, motoru derleyip kıyaslamaları sizin için çalıştırabilir. Onu deponun bir kopyasına yöneltin ve ne istediğinizi anlatın; aşağıda ayrıntıları verilen adımların aynısını yürütür:
data/money_benchmark/benchmark.json.gz dosyasına göre puanla ve çalışmayla karşılaştırabileceğim bir tablo olarak yazdır.”./mybot dizininde — birlikte gelen kıyaslama kümesindeki her kararı botumla değerlendir ve referans equity'lere göre PR'ını hesapla.”
Kıyaslama kümesi — katmanlı güvenilir değerlendirme kümesi — tek bir betik tarafından kurulur ve puanlanır: scripts/benchmark_money.py. İki giriş yolu vardır.
Depo, derlenmiş kıyaslama kümesini
data/money_benchmark/benchmark.json.gz olarak sunar (sıkıştırılmamış JSON GitHub'ın dosya boyutu sınırını aşar; betikler gzip'i şeffaf biçimde okur). Herhangi bir Sage seviyesini puanlamak, Bölüm 3 tablosundaki satırını yeniden üretir:
# 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
Tamamen farklı bir motoru puanlamak için betiğin içeride kullandığı kuralın aynısını uygulayın: veri kümesindeki her karar için motorunuzun seçimini alın ve equity'sini kayıtlı referans (“rollout”) equity'siyle karşılaştırın — ortalama hata × 500 o motorun PR'ıdır.
Üç uyarlamalı geçiş veri kümesini yeniden oluşturur. Oyunlar tohumlanmıştır (tohum 1'den 500 oyun), dolayısıyla kararlar ve referans equity'ler aynı çıkar:
# 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. Geçiş şunu yazar: data/money_benchmark/benchmark.json
(ve onun .gzdosyasını); tam olarak A Seçeneği'ndeki gibi puanlayın. --stages verilmezse üç geçişin tümü sırayla çalışır.
XG'nin API'si yoktur, dolayısıyla sonuçları XG'nin Toplu Analizinden gelir. 1. Geçiş, XG'ye aktarılacak transkriptleri şuraya yazar: data/money_benchmark/xg/ — bunlar depoyla birlikte gelmez, bu yüzden yalnızca veri kümesinden başladıysanız 1. geçişle yeniden üretin.
xg/ klasörünü özel bir seviyeyle — 3-ply kararlar, anlaşmazlıklarda test edilen seviyeye yükseltme — ve Save Games after analyze işaretli olarak Toplu Analiz edin. XG oyun başına bir
.xg yazar.
python scripts/benchmark_pr_xg_levels_all.py --benchmark money, bu betik XG'nin pozisyon başına en üst kararını analiz edilen her seviye için
.xg dosyalarından okur, aynı referans equity'lere göre puanlar, aynı PR dökümünü yazdırır ve XG'nin seçimlerini yanına kaydeder.
Bölüm 3'teki XG referanslı sınırsız oyun tablosu — ve tartışmalı pozisyon çalışması — ise en zor pozisyonların XG rollout'larını gerektirir. XG'nin Batch Rollout özelliğini bu pozisyonlar üzerinde çalıştırın (Save Games işaretli); python scripts/xg_benchmark_report.py bunları ayrıştırır. XG referanslı tablo ardından her seviyeyi, her puanlama betiğinin kaydettiği seçimlerden yeniden puanlar. Aşağıdaki İkinci Yöntem'e bakın.
# 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 puanlık maç çalışması aynı şekilde
scripts/benchmark_match.pyile yeniden üretilir —
benchmark_money.py betiğinin maç oyunu ikizi; maç uzunluğu ve maç sayısı argüman olarak verilir ve maç skoru her değerlendirmeye işlenir. Referansı şu dosyayla birlikte gelir: 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
Anlaşmazlık çalışması, Birinci Yöntem için kurulan aynı sınırsız oyun kıyaslama kümesinden beslenir; en zor pozisyonlar XG'nin kendi tam rollout'uyla çapraz referanslanır. Elle yürütülen tek bağımlılık XG'nin Toplu Rollout'udur; gerisini tek bir betik yapar.
data/money_benchmark/xg/.
.xg dosyaları.
python scripts/xg_benchmark_report.py python scripts/xg_dispute_analysis.py --sage-picks data/money_benchmark/scores/sage_truncated3.picks.jsonl
İlki XG'nin rollout'larını
data/money_benchmark/xg_results/rollout.jsonldosyasına ayrıştırır; ikincisi ise Sage 3T'nin kayıtlı seçimlerinden tartışmalı pozisyon raporunu — her anlaşmazlık sırasıyla Sage ve XG rollout'larına göre puanlanmış — yazdırır.
Maç oyunu henüz bu yöntemle kapsanmıyor: maç pozisyonlarının XG tam rollout'u gerekiyor ve bunu çalıştırmadık. Maç gücü bunun yerine Rollout PR çalışması (Bölüm 3) ve gerçek maç uyum çalışması (Bölüm 5) ile kapsanıyor.
Sage ve XG doğrudan birbirlerine karşı da oynayabilir; XG'nin hamleleri kendi analizinden alınır. Sage sınırsız bir oyunun her iki tarafını oynar; döküm XG'de toplu olarak analiz edilir; rakibin XG'nin en iyi seçiminden farklı olan ilk kararı XG'nin hamlesiyle değiştirilir ve oyun oradan yeni zarlarla yeniden oynanır; ta ki rakibin her hamlesi XG'nin yapacağı hamle olana dek. Çalıştırıcı böyle bir dizi oyun oynar (tohumlar şuradan devam eder: logs/sage_vs_xg.txt) ve oyun başına ortalama puanı standart hatasıyla birlikte yazdırır:
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'nin Windows masaüstünde çalışıyor olması gerekir: her yineleme, Batch Analyze penceresini şunun aracılığıyla sürer: scripts/xg_batch_analyze.py, bir Anthropic Computer Use aracısı (şunu ayarlayın: ANTHROPIC_API_KEY), yineleme başına yaklaşık bir dakika boyunca fareyi ve klavyeyi devralır. Bir oyun birkaç yinelemede yakınsar; XG'nin "too good to double" kararı, çift yok olarak sayılır.
On üç aile kıyaslama kümesi şurada yer alır:
backgame_ref_positions/benchmark/ — her biri için bir
<family> starting.txt tohum pozisyonu dosyası ve bir
<family> rollout.jsonl referansı — ve şununla puanlanır:
scripts/score_backgame_pr.py; bu betik PR'ı, rollout kalitesindeki seçimlerin payıyla birlikte raporlar.
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 dosyaları.