Satranç motoru, makine öğrenmesi mi, geleneksel motor mu?


17

Hem hevesli bir satranç oyuncusu hem de bilgisayar programcısıyım. Satranç oynamak ve programlama yapmak için en çok harcadığım iki şey olduğunu söyleyebilirim. Doğal olarak, kendi motorumu ve nihayetinde Lichess botunu yaratmak istiyorum.

AlphaZero'nun geçen yıl Stockish'e karşı ezici performansının ardından, bu motoru makine öğrenimi (muhtemelen Tensorflow'u kullanan bir tür sinir ağı) veya geleneksel, sabit kodlu sezgisel tarama ile mi oluşturmam gerektiğini düşünüyorum.

Sinir ağlarına diğer sabit kodlama türlerinden daha az aşinayım. Yine de, sinir ağlarıyla çalışmayı öğrenmek benim için iyi bir yol olabilir.

Düşündüğüm başka bir şey, motoru kodlamak için hangi dili kullandığımın önemli olup olmadığıdır. Birçok satranç motorunun daha önce hiç kullanmadığım C ++ kullandığını biliyorum. Çoğunlukla değişen sözdizimi ile aynı şeylerin çoğunu yapan diğer C tabanlı dilleri kullandım. Swift ve Javascript'e en çok aşinayım, ancak Python'a da aşinayım ve bunun benim için hile yapabileceğini hissediyorum.

Peki, mümkün olan en güçlü satranç motorunu yaratmak için sinir ağına mı yoksa kodlanmış mı?


4
Yeni AI motorlarının anahtarı, takviye öğrenimi kadar NN değil. RL karmaşık bir konudur, ancak David Silver'ın UCL'deki RL dersleri (web sitesinde slaytlar ve YouTube'daki dersler gibi) iyi tanıtım kaynakları vardır. Son derste Deepmind ve geleneksel olarak kaplanmış alfa ile çalıştı. NN'siz ve sabit kodlu sezgisel tarama ve RL kullanarak motor Alfa alfa böyle başladı!
asac

Bu satranç değil, son kitap olan "Deep Learning and Game Go" NN'lerin bir oyun motoru için nasıl kullanılacağını gösteriyor. Alfa-Go ve Alpha-Zero, kaputun altında benzer.
John Coleman

Python deneyiminiz göz önüne alındığında, Nim
Darren H

NN'ye gitmek istiyorsanız, bu ilginç: arxiv.org/abs/1509.01549 github'da da kod var :)
Ant

Zürafanın en iyi motorlara kıyasla asla çok güçlü olmadığını unutmayın. (~ 2800 elo)
Oscar Smith

Yanıtlar:


8

İlk adım: Hedeflerinizi / nedenlerinizi tanımlayın

Bence bu baskın faktör. Bunlardan hangisi size en uygun? ( Yalnızca birini seçin )

  1. Eğlenceli, zorlu bir kodlama görevinin tadını çıkarmak istiyorsunuz
  2. Son derece iyi bir satranç motoru yaratmak istiyorsun
  3. Satranç motorlarının nasıl çalıştığını öğrenmek istiyorsunuz
  4. Kodlama becerilerini öğrenmek / uygulamak istiyorsunuz
  5. Bilgisayar bilimi kavramlarını / teorisini öğrenmek / uygulamak istiyorsunuz (örn. Makine öğrenimi)
  6. (Diğer)

IMO 2 dışında herhangi bir şey için "bozuk para atmak" sorun değil. Tüm diğerleri için, ister ML ister sabit kodlama seçin hedefinize ulaşacak. Ancak muhtemelen karar vermenize yardımcı olacak seçenekler arasında bir karşılaştırma yapmak istersiniz.

Sabit kodlama davası

Satranç oynamak (insan olarak) mantıklı düşünmeyi içerir. Siz ve rakibin gerçekleştirebileceği olası eylemlerin alanını keşfedersiniz. Bu, genel olarak oyunları analiz etmek için teorik çerçeveler içeren oyun teorisi adı verilen bir alan yaratmıştır .

Eğer ayrıntılarla çalışmaktan ve bir şeyler hakkında spesifik olmaktan ve mantıklı olmaktan hoşlanıyorsanız, bu sizin için iyi sonuç verebilir. Buna karşılık, makine öğrenimi bulanık ve opak olan çok daha fazla "kara kutu" algoritması içerir. Ne olduğunu tam olarak bilmiyorsun.

Ayrıca, makine öğreniminden ziyade zor kodlama yoluna giderseniz "kendi başınıza çözmeyi" kolaylaştıracağınızı düşünürüm. Tam olarak anlamadığınız daha az kopya yapıştırma.

Makine öğrenimi davası

Bir yaratılış doğurmak ve kendi başına bir hayat sürmesini izlemek heyecan verici olabilir. Sabit kodlama tamamen hassasiyet ve ayrıntıyla ilgili olsa da, makine öğrenimi esnektir. Bazı nöronları alın ve sonuç muhtemelen benzer olacaktır.

Zor kodlama satranç okumakla ilgilidir. Makine öğrenimi, yarattığınız canlıyı incelemekle ilgilidir.

Makine öğrenimi elbette çok sıcak bir konudur.

Sabit kodlanmış dil seçimi

"Diğer C tabanlı diller" ile ne demek istediğinden emin değilim. C ++, C gibi bir şey olan tek ana dildir. C / C ++ 'nın avantajı hızlı olmalarıdır . Diğer diller yıllar boyunca yetişmiş olsa da, C ++ hala paraları için koşturuyor.

C ++ kolay değildir. Rust, Golang veya Swift gibi daha modern derlenmiş dillerde mükemmel performans elde edeceksiniz. Ancak bir JIT dili seçerseniz çok daha kötü olmamalı. Yani CPython tercüman kullanmayın ; IronPython veya Jython veya Düğüm veya C # veya Java kullanın.

GPU programlama farklı bir yaklaşım gerektirir ve bu noktada buna karşı tavsiyede bulunacağım.

Makine öğrenimi için dil seçimi

TensorFlow ile ilgili sorun çok düşük seviyeli olmasıdır. Sayı öğrenme algoritmaları (paralel donanıma ekilebilir) yazmak, makine öğrenmeye adanmış bir arabirimden çok daha fazlasıdır.

Tabii ki, bu harika bir öğrenme deneyimi olabilir! Ve bugün öğrenmeye kesinlikle değer. Ancak, Keras veya PyTorch ile başlamak isteyebilirsiniz.


1
Bu olağanüstü bir yanıt, gerçekten bahsettiğim tüm noktalara çarpıyor. Neden tam olarak bir motor yapmak istediğimi söylemek biraz zor. Gerçekçi olarak, büyük ihtimalle Stockish, Komodo ve Leela gibi şeylerle rekabet etmeyeceğim (sonuçta sadece bir üniversite öğrencisiyim). Yine de, işimin diğer motorlara karşı ayağa kalktığını ve her seferinde ezilmediğini görmek eğlenceli olurdu. Öncelikli akıl yürütmem güçlü bir motor yapmak olsa bile, muhtemelen yeni bir programlama dili öğreneceğim ve motoru yapmanın bir yan ürünü olarak satranç bilgilerimi geliştireceğim.
David Chopin

1
Uzun vadede yapabileceğim, besleyebileceğim ve ince ayar yapabileceğim bir şey istediğimden daha fazla düşünüyorum. Ayrıca objektif olarak kodumun ne kadar iyi olduğunu bana söyleyecek bir proje istiyorum (Galibiyet / Beraberlik / Kayıp, ELO, vb.).
David Chopin

1
Bu çok ilginç bir cevap ama Cpython üzerinde Node'u performans kaygıları için ciddiye alıyor musunuz?
Evpok

> "C ++, C gibi bir şey olan tek ana dildir." C #? Pas, paslanma? Java? En azından "C gibi bir şey" olan birçok dil var
Maaark

C gibi sözdizimi ile derlenmiş, yüksek düzeyde optimize edilmiş, makineye uygulanmış bir dil olarak "C gibi" ifadesini aldım. C #, Java ve PHP, kodları CPU'ya özgü bayt kodu yerine opcode derlenmiş sanal makineleri kullanır (ve PHP'nin derlemesi Python ve Bash gibi tamamen şeffaftır). Ve Rust ana akım değil. Sözdizimi stillerini diğer ana akım dillerle paylaşmasına rağmen, yalnızca C ++ bu bakımlardan "C gibidir".
Ghedipunk

24

Mümkün olan en güçlü motoru yapmaya çalışıyorsanız, kesinlikle NN motorlarını tercih edin.

Geleneksel motorlar harika - Muhtemelen hala uzlaşmaya eşit donanım üzerinde gezegendeki en güçlü motor - ama yazmak zor. Bu motorlar bir gecede bulundukları yere ulaşamadılar; yıllar ve yıllar sürdü. Mesela Stockish altı yıldır sürekli elo kazanıyor . Sıfırdan başlarsanız, hızlıca Stockish gücüne yakın bir yere ulaşamazsınız; aslında şu anda Stockish'in olduğu yerden birkaç yüz eloyu durdurabilirsiniz. Karşılaştırma için şu anda en güçlü tek yazarlı motorların bazıları Ethereal , Laser ve Xiphos'dur (açık kaynak olmadığı için Houdini & Fire'ı ihmal ediyorum). Bu motorların hepsi Stockish'ten oldukça zayıf.

Neden bu kadar zayıflar? İki sebep:

  1. Bu seviyede, bir motor geliştirmek çok fazla hesaplama gücü gerektirir. Yaptığınız şey kodunuzu incelemek ve elo kazanabilecek bir fikri tanımlamaktır. Örnek bir fikir, "eğer bu hareketin muhtemelen iyi olduğunu bilirsek, bu hareketi tersine çeviren dalları aramayın" (bu sizin için bir anlam ifade etmiyorsa, yüksek bir öğrenme eğrisi de olacağı anlamına gelir). Daha sonra fikri uygulayan bir yama yazarsınız ve değiştirilmiş motoru önceki sürüme göre test edersiniz. Bu seviyede, yamanın etkili olup olmadığını söylemek için yeterince büyük bir örnek boyutu elde etmek için on binlerce oyun gerekir. Bu oyunları oynamak büyük miktarda hesaplama gücü gerektirir. Stockish'in süper donanıma erişimi vardır: yazma tarihi itibariyle Stockish test alanı Fishtesting1038 çekirdek ile çalışıyor. Karşılaştırma için tipik bir masaüstü bilgisayarın 4-8 çekirdeği olabilir.

  2. Diğer neden ise Stockish'in birçok beyin tarafından desteklenmesidir. Yazma tarihi itibariyle, test edilen 5 kişi tarafından yazılan 8 yama var. Yama geçmişlerine bakarsanız, yamalar yazmış daha birçok geliştirici bulacaksınız. Kaç tane aktif Stockish geliştiricisi olduğunu bilmiyorum, ama kesinlikle> 20.

Öte yandan, NN motorları (nispeten) kolayca Ethereal / Laser / Xiphos'un çok üzerinde bir güce ulaşır. En son En İyi Satranç Motoru Şampiyonası turnuvasında kendiniz görün . Ethereal / Laser / Xiphos Lig 1'de yeterince güvenilir, ancak üst bölümdeki (Bölüm P) motorlar:

  • Stockish (topluluk destekli geleneksel motor, Fishtesting ile çalışır)
  • Komodo (ticari geleneksel motor, tam zamanlı geliştiricilere sahiptir)
  • Komodo MCTS (ticari yarı geleneksel motor, tam zamanlı geliştiricilere sahiptir)
  • Houdini (ticari geleneksel motor, tek kişilik bir çabadır, iki yıldır güncellenmemiştir)
  • Leela Chess Zero (topluluk destekli NN motoru, bir ton donanım olan Fishtesting analogu ile çalışır)
  • AllieStein (2 kişilik NN motor)
  • Stoofvlees (NN motor)
  • ScorpioNN (NN motoru)

Son üç motor - AllieStein, Stoofvlees ve ScorpioNN - bildiğim kadarıyla tam zamanlı geliştiriciler değil, sizin gibi meraklılar tarafından yapılan küçük işbirlikleri. İki yıldan az bir süre denedikten sonra Div P gücüne ulaştılar (tüm bu NN motorları yalnızca AlphaZero'dan sonra ortaya çıktı). Karşılaştırma için, yakın zamanda bilgisayar satrancı tarihinde, Stockish & Komodo ile başarılı bir şekilde yarışan geleneksel bir motor yazmış olan sadece bir kişi olmuştur (Robert Houdart, Houdini'nin yazarı).

Muhtemelen Lc0 ile rekabet edecek donanıma sahip olmayacağınız doğrudur, ancak Lc0 bu çok hesaplama gücünü alır, çünkü bu bir "sıfır" motordur - kurallar dışında herhangi bir insan bilgisi olmadan satranç oynaması gerekiyordu. Aynı metodolojiyi kullanmanıza gerek yoktur. Örneğin, denetimli öğrenmeyi kullanan Stein metodolojisini kullanabilirsiniz . Muhtemelen "sıfır" a gitmekten bile daha iyidir - sonuçta AllieStein süper finalde oynuyor, Lc0 değil.

Sonuç: Eğer amacınız dünyanın en iyi motorları ile rekabet etmekse, NN motorları ile geleneksel motorlardan daha başarılı olursunuz.


6
Belki de sonucunuzun diğer yanından bahsedin: Eğer amacınız biraz programlama yaparken satranç anlayışınızı derinleştirmek ise, geleneksel olanı tercih edin.
blues

1
Sonucunuza katılıyorum, ancak aynı zamanda güçlü bir motordan (elbette izinli) yeni bir ağı sıfırdan başlamak yerine bir başlangıç ​​noktası olarak kullanmanızı tavsiye ederim (ancak kendi kendine oyun ve güncelleme yoluyla trenden farklı bir şekilde devam edin) ağırlıklar ", katman ekleyerek veya kaldırarak, giriş özellikleri ekleyerek, ek çıkışlar talep ederek, vb.). Lc0'ın tek kafa mı yoksa çift kafa mı olduğunu hatırlayamıyorum, ancak 3 kafa ( ijcai.org/proceedings/2018/0523.pdf ) şu anda herhangi bir satranç motoru tarafından uygulanmadığına ve durumun iyileşmesine neden olabileceğine inanıyorum . -Sanat.
Steven Jackson

Bence Allie'nin, Stein ağına değil, zayıf motorlara (KMCST, Stoofvlees) karşı daha güçlü olmasını sağlayan araştırması.
bana '

@blues Bence bir satranç motorunu programlamak aslında daha iyi bir satranç oyuncusu yapmaz - Larry Kaufman (Komodo'nun geliştiricilerinden biri) hariç, en iyi motorların hiçbiri oyuncuları geliştirici olarak adlandırmamış veya geliştiricileri olmamıştı başlıklı oyuncular.
Allure

@me 'bu mümkün ama Leelenstein, Lc0 ikili dosyasını kullanan Stein ağıdır ve chess.com'un bilgisayar satranç şampiyonasında iyi yapılır, bu nedenle Stein ağları en azından Lc0 ağlarıyla karşılaştırılabilir.
Allure

9

Peki, mümkün olan en güçlü satranç motorunu yaratmak için sinir ağına mı yoksa kodlanmış mı?

Saçma erişiminiz yoksa bir NN seçmeyin (Birkaç yüz Nvidia V100s). Bir NN'yi satranç oynamak için eğitmek çok fazla donanım gerektirir. 200 milyondan fazla oyunu eğitmek için LC0'a katkıda bulunan kişileri görün . Muhtemelen donanıma erişimde sorun yaşayacağınızdan ( Google Colabatory'de bazılarını almaya çalışabilirsiniz , ancak yalnızca bununla birlikte eğitim çok yavaş olacaktır).

Düzenleme: Bir NN kullanma Denetimli öğrenme ile, sadece Google Colab ve muhtemelen bir güçlü GPU (2080, 2080Ti, Radeon VII) ile kaçabilir.

Düşündüğüm başka bir şey, motoru kodlamak için hangi dili kullandığımın önemli olup olmadığıdır. Birçok satranç motorunun daha önce hiç kullanmadığım C ++ kullandığını biliyorum. Çoğunlukla değişen sözdizimi ile aynı şeylerin çoğunu yapan diğer C tabanlı dilleri kullandım. Swift ve Javascript'e en çok aşinayım, ancak Python'a da aşinayım ve bunun benim için hile yapabileceğini hissediyorum.

Python ve Javascript güçlü bir satranç motoru için muhtemelen çok yavaştır. Swift'i kullanmadım ama muhtemelen macOS dışındaki platformları sevmeyecek, bu yüzden C veya C ++ kullanmak daha iyi. Rust'u da kullanabilirsiniz, ancak bu sinir bozucu birçok güvenlik özelliğine sahiptir ve gerçekten ihtiyacınız yoktur, sinir bozucu olabilir. Bazı düşük seviyeli optimizasyonların yapılması zor olduğu için iyi performans elde etmek de daha zor olacaktır. Tabii ki, bunu her zaman montajda yazabilirsiniz, ancak bu muhtemelen çok fazla iş olacaktır. bkz. https://www.chessprogramming.org/Languages/


1
Harika, bilgi için bir ton teşekkürler! Muhtemelen bir FEN pozisyonunda yer alan ve hesaplanan hareketi çıkaran bir API oluşturmaya çalışacağım. Bunun Lichess botlarıyla entegre olmanın en iyi yolu olduğunu düşünüyorum.
David Chopin


1
Yalnızca LC0 ağını kullanan farklı bir NN motoru uygulamak bir seçenek midir?
RemcoGerlich

1
@RemcoGerlich anladığım kadarıyla, NN motorları iki şey kullanıyor: ikili ve sinir ağı. İkili yazmak kolay değildir, ancak sinir ağını eğitmek nispeten kolaydır. Bu anlamda Lc0 türevleri zaten var - Leelenstein & Deus X (diğer adıyla Fat Fritz) bu tür türevlerdir.
Allure

@RemcoGerlich bu durumda gerçekten farklı bir motor olmaz, sadece farklı bir sarma / arayüz / her neyse Ic0 motoru olurdu.
Peteris

3

Tamamen oyuncak bir satranç motoru kullandım: Python satranç Oyunun kurallarını kendim kodlamak ve sadece mantığa odaklanmak zorunda kalmamak gerçekten güzeldi; ancak saniyede değerlendirebildiğim pozisyon sayısı çok düşük. Bu iyi bir başlangıç ​​noktası olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.