Con l’uscita della nuova versione di Stockfish, il già più forte motore di scacchi al mondo ha portato l’asticella un pò più in alto. Circa 30 punti Elo più forte della versione precedente su tempi lunghi, ancora una volta al primo posto in tutte le classifiche (CCRL, CEGT, FastGm, in attesa quella di SSDF). 3500, 3550, 3600 elo e oltre…
Ho quindi iniziato a chiedermi quale fosse la reale forza del programma al variare del numero di nodi concessi per “pensare” una mossa, e quale è il limite sotto il quale un normale essere umano può tornare ad avere chance di vittoria.
Il grafico, ottenuto variando il numero di nodi per mossa da un minimo di 1 fino a 256.000.000 (performance di Stockfish in single core), è il seguente (cliccare sull’immagine per aprirla a pieno schermo):
Per poter confrontare il punteggio Elo ottenuto con la scala FIDE usata da giocatori umani, o per lo meno, per provare a fare ciò, mi sono avvalso della rating list di SSDF, attiva da oltre 20 anni e l’unica che io conosca che ha effettuato test su tempi da torneo (40 mosse su 120 minuti), su hardware differente e con una scala già tarata su centinaia di scontri con esseri umani. Inoltre, ho cercato un motore che non fosse troppo forte, ma che fosse facilmente reperibile gratuitamente in rete e stabile nei test. Ho optato quindi per il vecchio Fruit 2.2.1, che con il vecchio Athlon Thunderbird 1200 di circa 20 anni fa aveva totalizzato lo strabiliante punteggio (per l’epoca!) di circa 2830 elo, più o meno comparabile al livello stimato per Deep Blue quando battè Kasparov. Poichè il PC che ho utilizzato per i test, in single thread è circa 6 volte più veloce di un Athon 1200 (equivalente a circa 40 mosse in 19 minuti), ho fatto scontrare Fruit a tempo ridotto con Stockfish 13 a nodi via via diversi. Quando Fruit si è dimostrato troppo forte o troppo debole, ho fatto scontrare Stockfish con altre versioni di se stesso in modo asimmetrico (es: Sf limitato a 5000 nodi contro 10000, 20000 e 50000).
Per il calcolo dell’Elo dei motori mi sono avvalso di Ordo di Miguel Ballicora e per i tornei tra motori di CuteChess. La suite di apertura utilizzata è stata TopGM_6move.epd, che racchiude circa 6000 aperture giocate da grandi maestri di scacchi, trovata in giro per la rete. In totale sono state giocate oltre 110000 match, anche se le partite più numerose sono quelle giocate con un numero di nodi molto breve (minore di 500000).
Quello che si può notare è che bastano meno di 100000 nodi per mossa (una frazione di secondo per i PC odierni), per consentire a Stockfish 13 di superare Fruit o un giocatore umano in cima al rating mondiale, e meno di 1000 (!!!) per battere un medio/buon giocatore di club. Per paragone, Deep Blue battè Kasparov nel 1997 analizzando mediamente 200 milioni di nodi per mossa. Proseguendo nell’analisi, si può notare come al raddoppio del numero di nodi, l’incremento in termini di Elo diminuisca sempre più fin quasi ad appiattirsi (diminishing returns). Va detto che le partite con 256M di nodi sono limitate a poche centinaia dato l’enorme quantità di tempo richiesta per giocare una partita, quindi l’errore nel punteggio è più elevato. L’andamento sembra comunque chiaro.
Mi sono anche chiesto come si sarebbe comportato Stockfish 13 disabilitando la sua rete neurale NNUE (valutando cioè la posizione con l’algoritmo classico usato fino a Stockfish 11), e quale prestazione avrebbe ottenuto Lc0. Nel primo caso, si può vedere come per un numero di nodi per mossa molto basso (minore di 700-800), la versione “classica” di Stockfish 13 tiene testa e anzi supera in alcuni casi la versione con NNUE abilitata, per poi essere via via superata e infine surclassata a numeri di nodi superiori, al punto che la versione con NNUE arriva ad avere praticamente lo stesso punteggio Elo della versione classica utilizzando un numero di nodi 16 volte inferiore (corrispondente a circa 100 punti elo di differenza con 64M di nodi per mossa). Va detto tuttavia che l’algoritmo di valutazione classico è circa due volte più veloce di quello con rete NNUE, quindi in un match con tempo pari e su tempi lunghi il divario è più ridotto (50-60 elo).
Nel caso di Lc0 la situazione è stata ancora più sorprendente. Ricordo, per chi non lo sapesse, che Lc0 è un programma di scacchi che combina una ricerca basata su metodo Montecarlo (MTCS) con una rete neurale ad auto apprendimento, un progetto ispirato ad AlphaZero di Google/DeepMind. E’ un approccio completamente differente rispetto a Stockfish, che utilizza un “classico” algoritmo minimax con potatura alfa-beta, e la cui rete neurale è utilizzata per la sola funzione di valutazione. Lc0, già con con un solo nodo per mossa (quindi senza nessuna conoscenza del controgioco avversario) supera i 2200 punti elo, sufficienti per mettere a dura prova un maestro di scacchi umano. 100 nodi per mossa sono sufficienti a Lc0 per annientare qualunque giocatore umano sul pianeta (circa 3000 Elo).
Dal grafico si può vedere inoltre come Lc0 scali meglio di Stockfish 13 all’aumentare del numero di nodi, anche se superati i 10000 nodi per mossa, la flessione appare pronunciata fin quasi ad appiattirsi. Purtroppo, le richieste hardware per poter utilizzare Lc0 a dovere sono enormi mi è stato impossibile giocare un numero di partite elevato oltre i 100000 nodi per mossa (l’algoritmo MTCS su cui si basa è migliaia di volte più lento del minimax e anche con una GPU Nvidia di buon livello non è possibile spingersi troppo oltre). L’impressione che comunque si ha, suffragata anche dalle recenti vittorie di Stockfish al TCEC e in altri tornei, è che effettivamente la flessione ci sia e che Stockfish resti comunque una spanna sopra a Lc0 anche con notevole differenza hardware (a vantaggio di Lc0), su tempi lunghi. La rete usata è stata la 67743, che all’epoca dei test era tra le ultime uscite.