En 2018, Google a battu le champion de GO avec son réseau de neurones AlphaGo, et il y a eu tellement d'agitation. De nouvelles excellentes bibliothèques d'apprentissage automatique open source sont devenues disponibles, utilisant des GPU domestiques pour accélérer le processus d'entraînement.
J'ai pris la décision d'essayer de le faire avec Abak, mais quand j'ai commencé, je savais à peine ce qu'était un réseau de neurones. J'avais eu une petite tentation à l'université (1996), mais faute de données, d'un GPU et d'un objectif, c'était complexe à aborder. De plus : mathématiquement, les réseaux de neurones sont un sujet lourd, et vous avez besoin de beaucoup d'inspiration.
Après beaucoup de recherches intenses et obsessionnelles, j'ai réussi à construire un modèle et à le faire apprendre.
Sur les épaules des géants, ma première intention a été d'apprendre du Dr Gerald Tesauro, qui a développé TD-Gammon dans les années 90. Si je me souviens bien, c'était la première implémentation pratique d'un algorithme d'apprentissage par renforcement.
Mais comme Abak est un jeu bidimensionnel, je ne pouvais pas utiliser le modèle proposé et j'ai dû développer le mien. J'ai décidé d'utiliser la sortie de certains algorithmes comme partie du modèle, en tant qu'information experte, pour que le réseau de neurones ait un processus d'apprentissage plus facile. J'avais l'impression de tricher en faisant cela.
Voici une comparaison entre les deux modèles, celui du Backgammon et celui d'Abak.
Le modèle TD largement utilisé pour le Backgammon décrit les colonnes. Pour chaque colonne du plateau, 4 entrées sont utilisées pour la décrire.
- Aucun pion : [0,0,0,0]
- Un pion : [1,0,0,0]
- Deux pions : [1,1,0,0],
- Trois pions : [1,1,1,0]
- Plus de trois pions : [1,1,1,1].
Il possède 28 de ces ensembles (un par colonne du plateau) pour chaque équipe, soit 28*2*4 entrées au total, plus quelques-unes pour compter les pions à la barre. Malheureusement, j'écris ceci de mémoire, ce qui pourrait ne pas être précis.
Le modèle d'Abak est très différent. Il décrit les pions, et chacun d'eux possède un ensemble de caractéristiques. Dans les versions plus récentes, j'ai ajouté une description simplifiée du plateau en complément, avec des résultats qui n'étaient pas incroyables, mais les caractéristiques sont toujours présentes.
Le modèle de description du jeu comporte quatre parties [477 entrées] :
- Description des pions (14x30) : La description inclut des statistiques pour le pion, la distance, la hauteur, etc. Elle n'inclut pas la classe, qui est héritée de sa position dans le modèle.
- Statut de l'équipe (4x2) : Comptage de certaines caractéristiques de pions ou de statut.
- Carte de force (24x2).
- Statut du jeu : qui lance ensuite ! (1).
Vous pouvez consulter une description complète du modèle ci-dessous.
Versions :
1.- Python Cumpy (TD-V1).
La première version de cette IA a été entraînée en Python pur en utilisant Cumpy, une bibliothèque similaire à Numpy qui fonctionne sur le GPU. Je voulais apprendre de zéro, donc même si j'ai joué un moment avec Tensorflow, j'ai décidé d'aller nu (enfin, équipé du fantastique combo Python et Cumpy).
Caractéristiques :
- Un réseau qui estime les chances de victoire de l'équipe 0.
- Inconscient des points.
- N'avait pas le drapeau « qui lance ensuite ».
- N'avait pas la carte de force.
- Une couche cachée, avec des activateurs sigmoïdes.
- A mis 45 000 parties pour battre mon IA précédente écrite avec des informations expertes (GOFAI).
- A appris pendant 4 500 000 parties. Et gagnait 75 % des cas contre GOFAI.
- Elle a été en production pendant 2 ans.
2.- Tensorflow (TD-V2).
Ma frustration avec la Version 1 était qu'elle n'était pas bonne pour calculer les chances de victoire car elle avait été entraînée sans le drapeau « qui lance ensuite ». D'une certaine façon, les résultats du réseau de neurones étaient assez bons pour sélectionner un bon coup, mais mathématiquement, ils n'étaient pas cohérents. La Version 2 a corrigé ce problème et ajouté un nouveau réseau pour calculer les chances que la partie se termine en 1, 2 ou 3 points.
J'ai choisi Tensorflow cette fois pour entraîner le nouveau modèle parce que je voulais apprendre un framework, et j'ai trouvé un excellent exemple de départ pour celui-ci.
Caractéristiques :
- Un réseau pour calculer les chances de victoire de l'équipe 0.
- Un réseau pour calculer la probabilité que la partie se termine en 1, 2 ou 3 points.
- Inclut la nouvelle carte de force.
- Deux couches cachées, avec des activateurs différents : Leaky RELU pour les couches cachées et sigmoïde pour la couche de sortie.
- A mis 12 000 parties pour gagner 50 % du temps contre TD-V1.
- A appris pendant 350 000 parties et a atteint un taux de victoire de 80 % contre TD-V1.
3.- Version 3 : En attente.
Comme dernière étape dans la prise de décision pour sélectionner le meilleur coup, il y a un algorithme simple qui cherche la meilleure Équité [%W*%p1+%W*%p2+%W*%p3].
En fonction de l'objectif du match, du nombre de points nécessaires pour chaque joueur pour gagner, et de la valeur du videau, il pondère différemment la sortie des réseaux.
J'aimerais faire un réseau de neurones qui gère cela. Ce sera la V3. Pas en développement pour le moment.
Modèle du réseau de neurones d'Abak :
Description du pion (14 entrées x 30 pions) :
- Distance jusqu'à la maison x/25
- Nombre de pions au-dessus x/4
- Nombre de pions en dessous x/4
- Est à la barre [0,1]
- Est à la maison [0,1]
- Est en sécurité (à distance = 0). [0,1]
- Fait un blocage avec un autre pion [0,1]
- Est piégeable par le druide [0,1]
- Est piégé par le druide [0,1]
- Est en train de piéger (cette entrée est uniquement pour chaque druide) [0,1]
- Risque d'être frappé dans la zone proche (6 positions devant) [0..1]
- Risque d'être frappé dans la zone lointaine (12 positions devant) [0..1]
- Risque d'être piégé par le druide [0..1]
- Chances de mouvement [0..1]
Entrées liées au jeu pour chaque équipe (4x2) :
- Nombre de pions à la barre. x/15
- Nombre de pions en sécurité. x/15
- Tous les pions sont à la maison. [0,1]
- Nombre de pions en sécurité 0. [0,1]
Carte de force : (24*2) :
Enfin, une carte de force, similaire à ce que le Docteur Tesauro a proposé pour le Backgammon, mais simplifiée. Pour chaque position et pour chaque équipe, il y a un nombre entre 0 et 1, représentant la force de ce blocage :
- 0.0si vide.
- 0.1s'il y a un pion.
- 0.5si ce pion est un garde.
- 1.0si deux pions ou plus sont présents.