Creazione del motore di scacchi, apprendimento automatico rispetto al motore tradizionale?


17

Sono un appassionato giocatore di scacchi e programmatore di computer. Direi che giocare a scacchi e programmare sono le due cose che passo più tempo a fare. Ovviamente, voglio creare il mio motore e, in definitiva, il robot Lichess.

Sulla scia della schiacciante performance di AlphaZero contro lo stoccafisso l'anno scorso, sto valutando se dovrei creare questo motore con l'apprendimento automatico (un qualche tipo di rete neurale, possibilmente usando Tensorflow) o l'euristica tradizionale codificata.

Conosco meno le reti neurali rispetto ad altri tipi di hard-coding. Tuttavia, potrebbe essere un buon modo per imparare a lavorare con le reti neurali.

Un'altra cosa che sto prendendo in considerazione è se è importante quale lingua uso per codificare il motore. So che molti motori di scacchi usano il C ++, che non avevo mai usato prima. Ho usato altri linguaggi basati su C che fanno molte delle stesse cose, con una sintassi prevalentemente variabile. Conosco molto bene Swift e Javascript, ma ho anche familiarità con Python e sento che potrebbe fare al caso mio.

Quindi, in termini di creazione del più potente motore di scacchi possibile, dovrei andare su una rete neurale o su un hard-coded?


4
La chiave per i nuovi motori AI non è tanto NN quanto l'apprendimento per rinforzo. RL è un argomento complesso, ma ci sono buone risorse introduttive online come le lezioni RL di David Silver presso UCL (diapositive sul suo sito Web e lezioni su YouTube. Ha lavorato con Deepmind e tradizionalmente coperto Alphago nell'ultima lezione. Probabilmente potresti sviluppare un'interessante intelligenza artificiale . motore senza NN usando euristiche hard coded e RL Questo è il modo alphago iniziato!
ASAC - Ripristinare Monica

Non sono gli scacchi, ma il recente libro "Deep Learning and the Game Go" mostra come usare gli NN per un motore di gioco. Alpha-Go e Alpha-Zero sono simili sotto il cofano.
John Coleman,

Data la tua esperienza con Python, varrebbe la pena guardare Nim
Darren H,

Se vuoi provare NN, questo è interessante: arxiv.org/abs/1509.01549 C'è anche il codice su github :)
Ant

@Non nota che Giraffe non è mai stato molto forte rispetto ai motori di punta. (~ 2800 elo)
Oscar Smith,

Risposte:


8

Primo passo: definire i tuoi obiettivi / motivi

Penso che questo sia il fattore predominante. Quale di questi si adatta meglio a te? (Scegli solo uno )

  1. Vuoi goderti un'attività di codifica divertente e stimolante
  2. Vuoi creare un motore di scacchi estremamente buono
  3. Vuoi sapere come funzionano i motori di scacchi
  4. Vuoi imparare / esercitarti nelle abilità di programmazione
  5. Volete imparare / implementare concetti / teoria dell'informatica (ad es. Apprendimento automatico)
  6. (Altro)

IMO va bene "lanciare una moneta" per qualsiasi cosa tranne 2. Per tutti gli altri, raggiungerai il tuo obiettivo sia che tu scelga ML o hard-coding. Tuttavia, probabilmente vorrai un confronto tra le scelte che ti aiuteranno a decidere.

Il caso della codifica rigida

Giocare a scacchi (come un essere umano) implica un pensiero logico. Esplora lo spazio di possibili azioni che tu e l'avversario potete compiere. Ciò ha generato un campo chiamato teoria dei giochi che contiene quadri teorici per l'analisi dei giochi in generale.

Se ti piace lavorare con i dettagli, essere specifico e ragionare sulle cose, questo potrebbe funzionare bene per te. In confronto, l'apprendimento automatico implica molti più algoritmi "black box" che sono sfocati e opachi. Non sai esattamente cosa sta succedendo.

Inoltre, credo che avrai un tempo più facile "capendolo da solo" se segui il percorso di codifica hard piuttosto che l'apprendimento automatico. Meno cose da incollare che non capisci completamente.

Il caso dell'apprendimento automatico

Può essere eccitante dare alla luce una creazione e vederla assumere una vita propria. Mentre l'hard-coding è sinonimo di precisione e dettaglio, l'apprendimento automatico è flessibile. Porta via alcuni neuroni e il risultato sarà probabilmente simile.

La codifica dura riguarda lo studio degli scacchi. L'apprendimento automatico riguarda lo studio della creatura che hai creato.

E l'apprendimento automatico è, ovviamente, un argomento molto caldo.

Scelta della lingua per hard-coded

Non sono sicuro di cosa intendi per "altri linguaggi basati su C". C ++ è l'unico linguaggio tradizionale che assomiglia a C. Il vantaggio di C / C ++ è che sono veloci . Anche se nel corso degli anni altre lingue hanno recuperato terreno, il C ++ offre comunque una possibilità per i loro soldi.

C ++ non è facile. Otterrai grandi prestazioni da linguaggi compilati più moderni come Rust, Golang o Swift. Ma non dovrebbe essere molto peggio se scegli una lingua JIT. Cioè non usare l'interprete CPython ; usa IronPython o Jython, o Node, o C # o Java.

La programmazione della GPU richiede un approccio diverso e, a questo punto, mi sconsiglio.

Scelta della lingua per l'apprendimento automatico

Il problema con TensorFlow è che è di livello molto basso. Si tratta più di scrivere algoritmi di analisi dei numeri (che possono essere trasferiti su hardware parallelo) che di un'interfaccia dedicata all'apprendimento automatico.

Certo, può essere un'ottima esperienza di apprendimento! Ed è sicuramente molto utile imparare oggi. Tuttavia, potresti voler iniziare con Keras o PyTorch.


1
Questa è una risposta fenomenale, colpisce davvero tutti i punti che ho citato. È un po 'difficile dire perché esattamente voglio fare un motore. Realisticamente, probabilmente non competerò con gente come Stockfish, Komodo e Leela (dopotutto sono solo uno studente universitario). Tuttavia, sarebbe divertente vedere il mio lavoro mettere insieme in punta di piedi contro altri motori e non essere schiacciato ogni volta. Anche se il mio ragionamento principale è quello di creare un motore forte, probabilmente imparerò un nuovo linguaggio di programmazione e migliorerò la mia conoscenza degli scacchi come prodotto secondario della creazione del motore.
David Chopin,

1
Penso più di ogni altra cosa che voglio qualcosa che posso fare, coltivare e mettere a punto a lungo termine. Voglio anche un progetto che mi spieghi obiettivamente quanto è buono il mio codice (vittorie / pareggi / perdite, ELO, ecc.).
David Chopin,

1
Questa è una risposta molto interessante, ma stai seriamente raccomandando Node su Cpython per problemi di prestazioni ?
Evpok,

> "C ++ è l'unico linguaggio tradizionale che assomiglia a C." C #? Ruggine? Giava? Ci sono molte lingue che sono almeno "qualcosa come C"
Maaark,

Ho preso "like C" per essere un linguaggio compilato, altamente ottimizzato, implementato sulla macchina con sintassi in stile C. C #, Java e PHP usano tutti macchine virtuali, con il loro codice compilato in codici operativi anziché in bytecode specifico della CPU (e la compilazione di PHP è completamente trasparente, come Python e Bash). E Rust non è mainstream. Solo C ++ è "come C" sotto questi aspetti, nonostante condivida gli stili di sintassi con molti altri linguaggi tradizionali.
Ghedipunk,

24

Se stai cercando di rendere il motore più potente possibile, scegli assolutamente i motori NN.

I motori tradizionali sono fantastici - Lo stoccafisso è probabilmente ancora il motore più potente del pianeta per consenso uguale all'hardware - ma sono difficili da scrivere. Questi motori non arrivarono dove erano durante la notte; hanno impiegato anni e anni di lavoro. Lo stoccafisso, ad esempio, ha guadagnato costantemente elo per sei anni . Se inizi da zero, non ti avvicinerai rapidamente alla forza dello stoccafisso; in effetti è probabile che tu stia a diverse centinaia di elo da dove si trova attualmente lo stoccafisso. Per confronto alcuni dei più potenti motori a autore singolo in questo momento sono Ethereal , Laser e Xiphos ( trascuro Houdini & Fire poiché non sono open source). Questi motori sono sostanzialmente più deboli dello stoccafisso.

Perché sono molto più deboli? Due motivi:

  1. A questo livello, lo sviluppo di un motore richiede molta potenza computazionale. Quello che fai è guardare attraverso il tuo codice e identificare un'idea che potrebbe guadagnare elo. Un'idea di esempio è "se sappiamo che questa mossa è probabilmente buona, non cercare rami che la invertono" (se questo non ha senso per te, significa che ci sarà anche un'alta curva di apprendimento). Quindi scrivi una patch che implementa l'idea e testa il motore modificato rispetto alla versione precedente. A questo livello, ci vogliono decine di migliaia di giochi per ottenere una dimensione del campione abbastanza grande da dire se la patch è efficace. Giocare a questi giochi richiede enormi quantità di potenza computazionale. Lo stoccafisso ha accesso al super hardware: al momento della stesura del test, lo Stockfish ha testato Fishtestingfunziona con 1038 core. Per fare un confronto, un tipico computer desktop potrebbe avere 4-8 core.

  2. L'altra ragione è che lo stoccafisso è supportato da molti cervelli. Al momento della stesura, ci sono 8 patch scritte da 5 persone in fase di test. Se guardi alla cronologia delle patch troverai molti più sviluppatori che hanno scritto patch. Non so quanti sviluppatori di Stockfish attivi ci siano, ma è certamente> 20.

D'altra parte, i motori NN (relativamente) raggiungono facilmente una forza che è ben al di sopra di Ethereal / Laser / Xiphos. Guarda tu stesso nell'ultimo torneo Top Chess Engine Championship . Ethereal / Laser / Xiphos sono in League 1, il che è abbastanza credibile, ma i motori nella massima divisione (Divisione P) sono:

  • Stoccafisso (motore tradizionale sostenuto dalla comunità, funziona con Fishtesting)
  • Komodo (motore tradizionale commerciale, ha sviluppatori a tempo pieno)
  • Komodo MCTS (motore semi-tradizionale commerciale, ha sviluppatori a tempo pieno)
  • Houdini (motore commerciale tradizionale, è uno sforzo individuale, non è stato aggiornato per due anni)
  • Leela Chess Zero (motore NN supportato dalla comunità, funziona con l'analogo di Fishtesting aka una tonnellata di hardware)
  • AllieStein (motore NN per 2 persone)
  • Stoofvlees (motore NN)
  • ScorpioNN (motore NN)

Gli ultimi tre motori - AllieStein, Stoofvlees e ScorpioNN - sono tutte piccole collaborazioni di persone che, per quanto ne so, sono appassionati come te e non sviluppatori a tempo pieno. Hanno raggiunto la forza Div P dopo meno di due anni di tentativi (tutti questi motori NN sono apparsi solo dopo AlphaZero). Per fare un confronto, nella recente storia degli scacchi al computer c'è stata una sola persona che ha mai scritto un motore tradizionale in competizione con Stockfish e Komodo da solo (Robert Houdart, l'autore di Houdini).

È vero che probabilmente non avrai l'hardware per competere con Lc0, ma Lc0 prende così tanta potenza computazionale perché è un motore "zero" - si suppone che giochi a scacchi senza alcun tipo di conoscenza umana tranne le regole. Non è necessario utilizzare la stessa metodologia. Ad esempio, è possibile utilizzare la metodologia Stein che utilizza l'apprendimento supervisionato. Probabilmente è anche meglio che andare a "zero" - dopo tutto è AllieStein che gioca nella superfinale, non in Lc0.

Il risultato è: se il tuo obiettivo è quello di competere con i migliori motori del mondo, hai molte più probabilità di avere successo con i motori NN rispetto a quelli tradizionali.


6
Forse menziona l'altro lato della tua conclusione: se il tuo obiettivo è quello di approfondire la tua comprensione degli scacchi mentre fai un po 'di programmazione, scegli il tradizionale.
blues

1
Sono d'accordo con le tue conclusioni, ma consiglierei anche di utilizzare una rete recente da un motore potente (con il permesso ovviamente) come punto di partenza piuttosto che ricominciare da zero (ma continuare in modo diverso da "allenarsi tramite auto-gioco e aggiornamento pesi ", aggiungendo o rimuovendo layer, aggiungendo funzionalità di input, richiedendo output aggiuntivi, ecc.). Non ricordo se Lc0 è single head o dual head, ma credo che 3 head ( ijcai.org/proceedings/2018/0523.pdf ) non sia attualmente implementato da alcun motore di scacchi e potrebbe finire per migliorare allo stato attuale -l'arte.
Steven Jackson,

Penso che la ricerca di Allie lo renda più forte nei confronti dei motori più deboli (KMCST, Stoofvlees), non della rete Stein.
io "

@blues Penso che la programmazione di un motore di scacchi in realtà non ne renda uno un giocatore di scacchi migliore - con l'eccezione di Larry Kaufman (uno degli sviluppatori di Komodo), nessuno dei principali motori ha intitolato i giocatori come sviluppatori o i loro sviluppatori sono diventati giocatori titolati.
Allure

@me 'è possibile, ma Leelenstein è la rete Stein che utilizza il binario Lc0, ed è ben fatto al campionato di scacchi per computer di chess.com, quindi le reti Stein sono almeno paragonabili alle reti Lc0.
Allure

9

Quindi, in termini di creazione del più potente motore di scacchi possibile, dovrei andare su una rete neurale o su un hard-coded?

Non scegliere un NN a meno che tu non abbia accesso a ridicoli (alcune centinaia di Nvidia V100s). Addestrare un NN a giocare a scacchi richiede così tanto hardware. Guarda le persone che contribuiscono a Lc0 per allenare oltre 200 milioni di giochi. Dato che probabilmente avrai problemi di accesso all'hardware (potresti provare ad ottenerne alcuni nel Google Colabatory , ma solo con questo, la formazione sarà molto lenta).

Modifica: utilizzando un NN Con l'apprendimento supervisionato, PUOI cavartela con Google Colab e possibilmente una GPU potente (2080, 2080Ti, Radeon VII).

Un'altra cosa che sto prendendo in considerazione è se è importante quale lingua uso per codificare il motore. So che molti motori di scacchi usano il C ++, che non avevo mai usato prima. Ho usato altri linguaggi basati su C che fanno molte delle stesse cose, con una sintassi prevalentemente variabile. Conosco molto bene Swift e Javascript, ma ho anche familiarità con Python e sento che potrebbe fare al caso mio.

Python e Javascript sono probabilmente troppo lenti per un potente motore di scacchi. Non ho usato Swift ma probabilmente non piacerà piattaforme diverse da macOS, quindi è probabilmente meglio usare C o C ++. Potresti anche usare Rust, ma questo ha molte caratteristiche di sicurezza che diventano fastidiose e non ti servono, il che può diventare fastidioso. Sarà anche più difficile ottenere buone prestazioni dal momento che alcune ottimizzazioni di basso livello sono difficili da realizzare. Certo, puoi sempre scriverlo in assemblea ma probabilmente sarà troppo lavoro. vedi https://www.chessprogramming.org/Languages/


1
Fantastico, grazie mille per le informazioni! Probabilmente proverò a creare un'API che accetta una posizione FEN e produce lo spostamento calcolato. Immagino che questo sia il modo migliore per integrarsi con i robot Lichess.
David Chopin,


1
È un'opzione per implementare un motore NN diverso che utilizza solo la rete di lc0?
RemcoGerlich,

1
@RemcoGerlich a quanto ho capito, i motori NN usano due cose: il binario e la rete neurale. Scrivere un binario non è facile, ma addestrare una rete neurale è relativamente semplice. In questo senso esistono già derivati ​​Lc0 - Leelenstein e Deus X (alias Fat Fritz) sono tali derivati.
Allure

@RemcoGerlich in quel caso che non sarebbe davvero un motore diverso, sarebbe il motore Ic0 con un involucro / interfaccia / qualunque cosa diversi.
Peteris,

3

Ho costruito un motore di scacchi puramente giocattolo usando: python chess era davvero bello non dover codificare le regole del gioco da solo e concentrarmi solo sulla logica; tuttavia, il numero di posizioni che sono stato in grado di valutare al secondo è molto basso. Questo potrebbe essere un buon punto di partenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.