Pogofish
J’ai appris à une machine un jeu que plus personne ne joue. La première fois, je l’ai crue sur parole. La seconde, j’ai mesuré.
Le Pogo se joue sur neuf cases. Chacun a six pions, empilés deux par deux sur sa rangée du fond ; on déplace une, deux ou trois pièces prises au sommet d’une pile, et une pile appartient à celui dont le pion est dessus. Qui n’a plus aucune pile à lui a perdu. C’est tout, et c’est un jeu que presque tout le monde a oublié.
La question que je voulais poser était simple, presque naïve. Une machine qui apprend seule, en jouant contre elle-même, apprend-elle vraiment quelque chose ? Et surtout : comment le saurais-je ?
Ce que j’ai mesuré
J’avais déjà répondu à cette question une première fois, avec beaucoup d’aplomb. J’y reviens plus bas. Pour le second tour, j’ai fait ce que j’aurais dû faire au premier : écrire avant l’entraînement ce qui compterait comme un succès, puis m’interdire d’y toucher.
Quatre critères, donc, fixés d’avance. Un : l’IA finale bat un joueur qui joue au hasard, un joueur « glouton » (il gagne quand il le peut, sinon il prend le plus de piles possible), un agent d’apprentissage plus classique, et sa propre version à 10 % de l’entraînement, chaque fois avec la borne basse de l’intervalle de confiance au-dessus de 50 %. Deux : sa progression au fil de l’entraînement monte puis se stabilise, au lieu d’osciller. Trois : on obtient la même chose en recommençant avec trois graines aléatoires différentes. Quatre : je joue moi-même au moins dix parties contre elle et je note ce qui me surprend.
Chaque match se joue sur 200 ouvertures tirées au hasard, que l’IA n’a jamais vues, chacune jouée deux fois en échangeant les couleurs : 400 parties. L’IA est un AlphaZero écrit en Rust, entraîné sur 10 000 parties contre elle-même pour chaque graine.
Il a fallu en chemin toucher à la règle. Sans limite, les IA entraînées ont appris à tergiverser : tenir, tourner en rond, ne jamais conclure. La règle de bascule, écrite elle aussi à l’avance, s’est déclenchée, et l’on joue désormais une variante où une position qui revient pour la troisième fois fait perdre celui qui l’a provoquée. Je n’ai pas été irréprochable pour autant : cette règle de bascule, je l’avais écrite, mais pas branchée, et deux entraînements ont continué au-delà du point où ils auraient dû s’arrêter. Le code s’arrête tout seul, maintenant.
Ce qui avait cassé au premier tour
Au printemps, j’avais publié un long article sur ce même projet, avec un tableau de verdicts, un solveur qui répondait à la question de savoir si le premier joueur gagne, et une IA qui battait l’autre. Tout avait l’air de marcher, ce qui aurait dû m’alerter.
En relisant le code pour préparer le second tour, j’ai trouvé neuf défauts. Quelques-uns suffisent à donner le ton. L’agent concurrent que mon IA « battait » n’avait jamais été évalué, puisque le programme chargeait ses poids dans le mauvais réseau et laissait tomber, sans rien dire, ceux qui ne rentraient pas : je le faisais jouer avec une tête aléatoire. L’évaluation rejouait la même partie encore et encore, départ fixe et aucun bruit, de sorte que mon « équilibre du jeu » mesurait une partie unique. Le filtre qui décidait de garder ou non une nouvelle version de l’IA jouait ses parties au hasard pondéré, alors qu’il les demandait presque déterministes, et il avait 21,7 % de chances d’adopter une version de même force. Et la table du solveur enregistrait comme exactes des valeurs qui n’étaient que des bornes, ce qui invalide ses réponses.
Dit autrement, aucune affirmation du premier tour sur la force de l’IA ne tient. Les règles du jeu, elles, étaient justes. C’est déjà ça.
Les résultats
Le premier critère est rempli, sur les trois graines. Score de l’IA finale sur 400 parties, avec l’intervalle de confiance à 95 % :
| Adversaire | Graines 1, 2 et 3 |
|---|---|
| le hasard | 1,000 [1,000 ; 1,000] 1,000 [1,000 ; 1,000] 1,000 [1,000 ; 1,000] |
| le glouton | 0,855 [0,823 ; 0,887] 0,887 [0,858 ; 0,917] 0,863 [0,831 ; 0,894] |
| l’agent classique | 0,785 [0,750 ; 0,820] 0,738 [0,703 ; 0,772] 0,743 [0,708 ; 0,777] |
| elle-même à 10 % | 0,792 [0,758 ; 0,827] 0,790 [0,756 ; 0,824] 0,772 [0,737 ; 0,808] |
Le troisième aussi : contre le glouton, les trois graines tombent entre 0,855 et 0,887.
Le deuxième ne l’est pas, et je le laisse tel quel. La courbe se stabilise bien, mais le test de montée exigeait que l’intervalle de la dernière version soit entièrement au-dessus de celui de la première. La dernière est notée 153 à 175 points Elo plus haut, et les deux intervalles se chevauchent pourtant de 15 à 27 points. J’ai une explication, qui me paraît bonne : chaque intervalle est mesuré par rapport au joueur au hasard, très loin, et il en porte toute l’incertitude. Mais je l’ai trouvée après avoir vu le résultat, et une explication trouvée après coup ne change pas un verdict posé avant. Critère non rempli tel que pré-enregistré.
Le quatrième est en attente. Pour être tout à fait honnête, j’avais commencé : j’ai perdu toutes mes parties au niveau normal. On a donc mesuré ce que vaut la même IA quand elle réfléchit plus longtemps. À 400 simulations par coup contre elle-même à 100, elle marque 0,640 [0,596 ; 0,684]. Plus intéressant pour vous : elle est déterministe. Une ligne qui la bat une fois la bat toujours, et une victoire rejouée par cœur ne dit rien du joueur.
Tous ces chiffres viennent d’une machine dans le nuage, pas de mon ordinateur. Le dépôt contient les critères tels qu’ils ont été écrits avant les entraînements, et les résultats bruts.
À vous de jouer
L’adversaire ci-dessous est le réseau de la graine 1 en fin d’entraînement. Au niveau normal, c’est lui qui marque 0,855 [0,823 ; 0,887] contre le glouton ; les niveaux facile et difficile n’ont pas été mesurés contre lui. On bouge une pièce d’une case, deux pièces de deux cases, trois pièces d’une ou de trois cases ; une position répétée trois fois fait perdre celui qui l’a provoquée. Les Blancs commencent. Jouez les deux couleurs : une partie seule ne dit pas grand-chose.
Le même réseau joue aussi dans un terminal : le programme à télécharger, pour macOS seulement (puce Apple ou Intel). Il n’est pas signé, et macOS le bloquera au premier lancement ; il faut l’autoriser dans les réglages. C’est avec lui que je dois encore jouer mes dix parties.
Si vous la battez sans l’aide de personne, écrivez-moi. Je voudrais savoir comment on fait.
Elenchus a lu ce récit
Raisonnement solide
Le texte décrit une expérimentation méthodique sur l’apprentissage d’une IA pour Le Pogo, en définissant des critères préalables et en rapportant fidèlement les résultats, sans commettre d’erreur de raisonnement apparente.
Ce qui tient Les critères de succès sont définis avant l’entraînement et restent inchangés malgré les résultats.