Il rilascio dell’ultima versione di Stockfish, la 17, non ha portato grandi incrementi in termini di Elo. Sebbene in autotuning e con suite di apertura molto sbilanciate, il programma sembra essere circa 50 punti elo più forte della versione 16, nella realtà, più o menu tutte le rating list più note (CCRL/CEGT/SP-CC…) concordano che il vero incremento sia molto inferiore. Addirittura, se si utilizzando aperture non sbilanciate, quasi nullo.
Mi sono quindi chiesto se si stia raggiungendo un limite, oltre il quale indipendentemente dalla potenza di calcolo o dal tempo di riflessione dato al motore, i miglioramenti in termini di performance siano ormai marginali.
Questo solleva una questione fondamentale: abbiamo raggiunto un punto in cui, anche fornendo ai motori risorse computazionali enormi o estendendo il tempo di riflessione per ogni mossa, non si osserva più un miglioramento significativo?
Se così fosse, questa stagnazione potrebbe derivare dal fatto che i motori, come Stockfish, si avvicinano sempre di più a una sorta di “gioco perfetto”. Dopo aver risolto la maggior parte delle posizioni più critiche, rimangono solo dettagli marginali che richiedono enormi quantità di risorse per essere migliorati, senza tuttavia produrre differenze tangibili nel risultato finale. A un certo punto, la profondità di calcolo aggiuntiva non conduce più a mosse migliori, ma solo a una conferma di quelle già scelte in precedenza.
Per determinare se questo fenomeno sia reale, ho deciso quindi di effettuare dei test utilizzando un set di aperture non sbilanciate, confrontando Stockfish 17 inizialmente con se stesso ad intervalli di tempo via via crescenti. Oltre a Stockfish 17, ho aggiunto in seguito al pool di test anche Crystal 8 e Stockfish 15.1. Il motivo di questa scelta è duplice: da un lato la curiosità di vedere come si comporta Crystal, un motore derivato da Stockfish molto apprezzato nell’analisi delle partite, in virtù di alcune modifiche al codice che lo indeboliscono leggermente in termini di forza pura, ma consentono al motore di risolvere posizioni che Stockfish non risolve, o risolve dopo un tempo di riflessione molto maggiore. Dall’altro anche per avere programmi con stili di gioco differenti, il motivo per cui ho aggiunto Stockfish 15.1, dotato di forza simile al fratello maggiore, ma con uno stile di gioco non identico, frutto di una rete neurale di dimensione differente e allenata in modo diverso.
Le aperture scelte
Per evitare posizioni di partenza eccessivamente squilibrate, ho selezionato 12 aperture classiche considerate bilanciate, limitate a max 3 mosse:
- Gioco aperto
- Gambetto di donna
- Difesa slava
- Ruy Lopez
- Difesa siciliana
- Apertura inglese
- Caro-Kann
- Pirc
- Apertura Reti
- Difesa est indiana
- Difesa nimzo-indiana
- Difesa ovest indiana
I programmi si sono affrontati giocando ogni apertura una volta di bianco e una di nero.
La suite di aperture in formato EPD è scaricabile cliccando qui: openings10.epd
Tempi di riflessione e potenza di calcolo
Il test è stato effettuato sul limite di 40 mosse ogni X secondi ripetuti, con valore iniziale di X pari a 5 secondi, e che è stato raddoppiato di volta in volta fino ad avere un tempo di riflessione 1024 volte superiore. In altri termini, gli intervalli sono i seguenti:
- x1 = 40 mosse in 5 secondi, hash di 256MB
- x2 = 40 mosse in 10 secondi, hash di 256MB
- x4 = 40 mosse in 20 secondi, hash di 256MB
- x8 = 40 mosse in 40 secondi, hash di 256MB
- x16 = 40 mosse in 80 secondi, hash di 256MB
- x32 = 40 mosse in 160 secondi, hash di 512MB
- x64= 40 mosse in 320 secondi, hash di 512MB
- x128 = 40 mosse in 640 secondi, hash di 512MB
- x256 = 40 mosse in 1280 secondi, hash di 1024MB
- x512 = 40 mosse in 2560 secondi, hash di 1024MB
- x1024 = 40 mosse in 5120 secondi, hash di 1024MB
Non sono potuto andare oltre per limitazioni hardware.
Per quanto concerne la potenza di calcolo a disposizione, i test sono stati effettuati sempre con l’opzione Threads=1 e utilizzando un PC con CPU Core i7 12700.
Il test è stato effettuato utilizzando CuteChess. Il calcolo dei risultati è stato fatto con il programma Ordo 1.0 di Miguel Ballicora.
Risultati del test
Di seguito la rating list ottenuta tramite il software Ordo 1.0. Per ogni motore è indicato il tempo di riflessione utilizzato (per esempio: Stockfish 17 x8 ha usufruito di un tempo di riflessione di 40 mosse in 40 secondi ripetute). Oltre ai tre motori elencati in precedenza, ne ho aggiunti altri per stimare la forza effettiva di gioco.
Il punteggio Elo di partenza è fissato a 3550 per Stockfish 11, con tempo fisso di 40 mosse ogni 80 secondi ripetuti, comparabile, per il PC utilizzato per i test, a 40 mosse su 120 minuti ripetute, su un ipotetico Pentium 90 Mhz. Utilizzo questa strana “unità di misura” per poter ancorare il punteggio su un valore che fornisca risultati comparabili a quelli che si facevano in passato, quando i programmi venivano testati anche contro esseri umani. Per controprova, ho effettuato qualche test con il vecchio Rebel 6, anch’esso fatto girare su un PC che emula le stesse prestazioni di un Pentium 90. Il valore ottenuto, circa 2430 elo, è comparabile con il valore ottenibile dal programma con un vero P90 (al netto di margini di errore e aperture differenti).
# PLAYER : RATING ERROR POINTS PLAYED (%) 1 Stockfish 17 x512 : 3971 22 179.5 336 53.4% 2 Stockfish 17 x1024 : 3970 23 150.0 288 52.1% 3 Stockfish 17 x256 : 3968 22 156.0 288 54.2% 4 Crystal 8 x1024 : 3963 30 60.5 120 50.4% 5 Stockfish 15.1 x1024 : 3961 32 60.0 120 50.0% 6 Stockfish 17 x128 : 3960 22 173.0 323 53.6% 7 Crystal 8 x512 : 3959 26 84.5 168 50.3% 8 Stockfish 15.1 x512 : 3953 27 82.0 168 48.8% 9 Stockfish 17 x64 : 3950 20 231.5 406 57.0% 10 Stockfish 15.1 x256 : 3950 24 96.5 192 50.3% 11 Crystal 8 x256 : 3940 23 121.0 240 50.4% 12 Crystal 8 x128 : 3936 22 110.0 216 50.9% 13 Crystal 8 x64 : 3932 20 199.0 360 55.3% 14 Stockfish 15.1 x128 : 3924 29 84.0 144 58.3% 15 Stockfish 17 x32 : 3914 17 326.5 549 59.5% 16 Stockfish 15.1 x32 : 3898 21 183.5 312 58.8% 17 Crystal 8 x32 : 3893 20 203.0 360 56.4% 18 Stockfish 15.1 x64 : 3888 23 141.0 240 58.8% 19 Stockfish 17 x16 : 3887 18 363.5 572 63.5% 20 Stockfish 17 x64 MultiPV=4 : 3871 22 116.0 216 53.7% 21 Stockfish 15.1 x16 : 3852 19 295.5 480 61.6% 22 Stockfish 17 x8 : 3829 19 245.5 452 54.3% 23 Stockfish 15.1 x8 : 3824 21 226.0 384 58.9% 24 Crystal 8 x16 : 3821 19 221.0 432 51.2% 25 Stockfish 17 x32 MultiPV=4 : 3810 23 98.0 216 45.4% 26 Stockfish 15.1 x4 : 3760 21 230.0 408 56.4% 27 Crystal 8 x8 : 3759 19 258.0 480 53.8% 28 Stockfish 17 x16 MultiPV=4 : 3749 22 127.5 288 44.3% 29 Stockfish 17 x4 : 3749 19 266.0 504 52.8% 30 Crystal 8 x4 : 3688 23 153.5 312 49.2% 31 Stockfish 15.1 x2 : 3677 17 364.0 696 52.3% 32 Stockfish 17 x8 MultiPV=4 : 3662 22 123.5 360 34.3% 33 Stockfish 17 x2 : 3643 21 273.5 528 51.8% 34 Crystal 8 x2 : 3588 21 213.5 456 46.8% 35 Stockfish 15.1 : 3553 21 210.0 432 48.6% 36 Stockfish 11 (40/80s) : 3550 26 191.0 480 39.8% 37 Stockfish 17 : 3536 24 216.5 528 41.0% 38 Crystal 8 : 3453 28 123.0 384 32.0% 39 Gull 3 : 3192 44 90.5 312 29.0% 40 Laser 1.7 : 3187 72 29.0 120 24.2% 41 Rybka 2.3.2 : 2919 72 62.5 120 52.1% 42 Ice 4 : 2851 70 60.5 288 21.0% 43 Naraku : 2586 99 24.5 72 34.0% 44 Rebel 6 : 2432 103 11.0 120 9.2% White advantage = 45.51 +/- 2.18 Draw rate (equal opponents) = 87.55 % +/- 0.77
Intepretazione dei risultati
Il grafico che segue mostra l’incremento di Elo all’aumentare del tempo di calcolo.
Come emerge dalla tabella, i punteggi Elo mostrano un trend inizialmente crescente all’aumentare del tempo di riflessione per ciascun motore, evidenziando una correlazione tra il tempo disponibile per mossa e la performance del motore stesso. Tuttavia, nonostante il margine di errore, dopo una certa soglia, questo aumento di punteggio Elo tende a stabilizzarsi su un valore che è intorno ai 3960-3970 elo. Ciò si riscontra chiaramente nei risultati ottenuti per i set x512 e x1024, dove i valori di Elo di Stockfish 17, Stockfish 15.1 e Crystal 8 tendono a coincidere.
E’ interessante notare infatti che, nonostante sia Crystal 8 che Stockfish 15.1 ottengano un punteggio inferiore rispetto a Stockfish 17 per tempi brevi (come atteso), il divario tra i tre programmi tende a ridursi fino quasi a coincidere. Non solo, aumentando il tempo di riflessione, diminuiscono anche le vittorie di un motore rispetto ad un altro, al punto che già assegnando ai motori 512 volte il tempo di riflessione di partenza, tutte le partite si sono risolte in patte indipendentemente dall’apertura, e la differenza di forza tra i motori è stata determinata contro versioni più deboli di loro stessi.
Ho effettuato anche un test con la modalità MultiPV=4 attiva, per verificare se all’aumentare del tempo di riflessione, l’uso di più varianti principali considerate dal programma potesse incrementare la forza del programma. Ciò che in realtà si vede è che questo incremento di forza in realtà non avviene, e i risultati dei programmi con la modalità MultiPV=4 attiva sono in linea con gli stessi programmi senza opzione MultiPV e tempo di riflessione pari ad un quarto, o anche inferiori, se si esclude tempi di riflessione veramente irrisori (40 mosse in meno di 10 secondi o anche meno). Infatti, anche se l’opzione MultiPV permette di considerare simultaneamente più varianti, il motore deve ripartire le sue risorse di calcolo tra queste linee, riducendo il tempo dedicato a ciascuna variante. La modalità MultiPV può essere quindi utile dove è essenziale valutare rapidamente alternative, ma l’analisi di una singola linea risulta più efficace per massimizzare la prestazioni di un motore su tempi più lunghi.
Questo test sembra quindi confermare che con aperture bilanciate, aumentando il tempo di riflessione non si ottiene più un incremento della forza del motore, ma si raggiunge un plateau. I motori, oltre un certo tempo di riflessione, non riescono più a tradurre il tempo aggiuntivo in miglioramenti significativi della propria posizione, raggiungendo, per quanto riguarda la propria forza di gioco, un asintoto.
Inoltre, il test sembra suggerire che anche motori più deboli, assegnato sufficiente tempo di calcolo, raggiungono lo stesso limite.
Almeno per Stockfish e le principali varianti, questo limite sembra attestarsi attorno ai 3950-4000 Elo.
Questi test sono stati effettuati in modalità single core, resta quindi da valutare l’effetto che potrebbe avere un’analisi multi-core sulle performance dei motori. L’uso di più core rende il processo di calcolo non deterministico, poiché ogni core esegue valutazioni indipendenti su diverse porzioni dell’albero di gioco, oltre ad estendere la finestra di ricerca. Questo porta a una maggiore variabilità nei risultati, cosa che potrebbe migliorare le performance del motore. Nonostante ciò, non penso che il risultato si discosterebbe più di tanto dal limite di circa 4000 elo.