Casualità nel gioco del motore


11

Se avrò due motori per giocare l'uno contro l'altro con gli stessi colori, lo stesso gioco risulterà ogni volta? In caso contrario, da dove viene la casualità nel gioco del motore? (Trascurando il libro di apertura, dove se non sbaglio il libro può dire al motore di scegliere tra due mosse a caso poiché sono ugualmente buone.)

Suppongo che ci sia casualità perché nella partita Alphazero vs. Stockfish non abbiamo avuto lo stesso gioco accadere molte volte di seguito. Tuttavia non capisco perché. Presumibilmente, l'unico modo per farlo è far sì che il motore suoni una mossa parziale in qualche momento, il che suona come seppuku.


AlphaZero impara giocando, quindi dopo ogni gioco il modello viene aggiornato.
ferit

L'aggiunta di un piccolo valore casuale alla valutazione è uno dei modi possibili. Penso che lo stoccafisso lo stia facendo.
hoacin,

Risposte:


8

Per quanto riguarda la partita AlphaZero vs Stockfish, questa domanda è già stata trattata qui da SmallChess .

AlphaZero a parte (che impiega una routine specializzata Monte Carlo 1 nella sua esplorazione delle linee di gioco), che è reso non deterministico dalla costruzione, per i soliti motori di scacchi basati sull'euristica, come Stockfish e altri (anche se ci sono altri motori che hanno routine basate su MC, AFAIK Rybka aveva tale caratteristica), la fonte della casualità è generalmente solo una conseguenza degli aspetti tecnici dell'attuazione, piuttosto che la casualità intenzionale introdotta algoritmicamente nel processo decisionale del motore. In termini astratti, uno dei motivi è il fatto che i motori non funzionano in modo puramente sequenziale (eseguendo un'attività dopo l'altra). Invece, per rendere i motori più efficienti, eseguono ricerche parallele in vari rami dell'albero delle possibili mosse. Lo fanno tramite quello che viene chiamato multi-threading (o -processing ma che è un po 'diverso). Quindi più thread delle CPU sono contemporaneamenteeseguendo operazioni per cercare l'albero (e memorizzare nella cache le valutazioni delle posizioni visitate), quindi immagina che a ogni thread venga assegnato un sottoalbero. Il problema con questo tipo di implementazione è che l'esecuzione complessiva dei thread diventa fortemente dipendente da tutti i tipi di condizioni (tempi di attesa, scambi di RAM, ...), quindi alla fine una variazione principale può essere scelta senza aver permesso a tutti gli altri discussioni per completare la ricerca.

Questo infatti accade spesso perché il motore è impostato per prendere una decisione in un determinato periodo di tempo, quindi la gestione del tempo altera il comportamento. Puoi anche ripristinare questa affermazione dicendo: conoscere l'algoritmo e implementare le routine di threading deterministico non è sufficiente per prevedere in modo affidabile lo stato del programma dopo ogni momento t. Naturalmente, se si consente sempre a tutti i thread di completare la ricerca e non sono stati rilevati problemi di concorrenza durante tale esecuzione (ad esempio un thread che tenta di accedere a una determinata cache non accessibile), il comportamento sarà effettivamente completamente riproducibile dato che tutto il resto è uguale 2 .


1 : Insieme al fatto che attraverso l'addestramento aggiuntivo (ad esempio l'auto-gioco) la sua rete neurale continua ad evolversi (parametri ricalibrati), o se vuoi che la sua funzione di valutazione non abbia una definizione fissa e costante (a differenza dei motori basati sull'euristica ).

2 : Anche allora, come hai detto, a livello di apertura, con un libro di apertura, a volte ci sono decisioni casuali intenzionali prese dal motore su quale variante scegliere. Allo stesso modo, al di fuori della fase di apertura, possono esserci momenti in cui più variazioni hanno quasi uguali valutazioni (all'interno della risoluzione scelta per l'Eval), quindi in base al progetto, può finire per sceglierne una a caso. Infine, a livello di impostazioni del motore, bisogna anche fare attenzione, ad esempio la profondità della ricerca e i tempi di ponderazione scelti per ciascun motore (e se possono calcolare ulteriormente durante i periodi di ponderazione reciproci).


6

Grazie a @Phonon descrivendo in dettaglio le mie precedenti risposte. Vorrei aggiungere un altro punto: il controllo del tempo .

L'unico controllo del tempo deterministico è per numero di nodi , ma questo è raro. Il controllo del tempo molto più comune - il numero fisso di secondi o il tempo di gioco non sono generalmente deterministici.

Facciamo un esempio. Esegui lo stoccafisso sul tuo terminale. Genere:

andare movetime 20000

Questo comando indica al motore di effettuare una mossa dopo 20 secondi. I miei risultati:

info depth 23 seldepth 32 multipv 1 score cp 6 upperbound nodes 24325860 nps 1216171 hashfull 999 tbhits 0 time 20002 pv g1f3 d7d5
bestmove g1f3 ponder d7d5

La mossa è stata 1.Nf3. Successivamente, ho ucciso il mio stoccafisso, ne ho iniziato uno nuovo. Ancora una volta, 20 secondi. Ho ottenuto:

info depth 23 seldepth 32 multipv 1 score cp 20 nodes 26185280 nps 1309067 hashfull 999 tbhits 0 time 20003 pv d2d4
bestmove d2d4 ponder g8f6

Sono 1.d4! Stessa posizione, ricerca in entrambi 20 secondi!

Vedi? Entrambi i 20 secondi per lo spostamento, ma a causa delle fluttuazioni del sistema operativo Linux la mia seconda corsa ha avuto una ricerca più approfondita (26185280> 24325860).

Nota che questo piccolo esperimento non è stato nemmeno multithread (numero di thread = 1). Il multithreading renderebbe le cose ancora più non deterministiche.

Lo stoccafisso ha ricevuto un minuto per mossa nella partita di Google AlphaZero. Il numero di thread era 64. Le decisioni dello stoccafisso nella partita non potevano essere deterministiche.


Anzi, esempio e osservazione molto istruttivi.
user929304

simpatico! bella idea di mostrare anche la custodia a 1 filo.
Ellie,

Grazie per la risposta. Stupida domanda di follow-up: cos'è un nodo (nel contesto dei motori per giocare a scacchi)?
Allure il

@ user3727079 I nodi sono i vertici (posizioni uniche) nel gioco albero . Ad esempio, se il nodo radice è la posizione iniziale, allora ha 20 nodi figlio, che sono le 20 posizioni legali univoche distanti un solo strato dalla radice.
Ellie il
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.