IA flappy bird - Intelligence Artificelle
Alors ça c’est plutôt rigolo ! Je suis assez passionné par tout ce qui touche à l’Intelligence Artificielle et maîtrise bien la bibliothèque Tensorflow mise à disposition par Google pour mettre en oeuvre des techniques de machine learning avec réseaux de neurones. J’ai pu lire récemment que Tensorflow a été porté sur Raspberry pi: donc petit essai pour voir si ça fonctionne sur mon Raspberri pi4 !
Machine learning, c’est quoi ?
Bon je ne vais pas prétendre vous faire tout un cours sur l’Intelligence Artificielle mais voilà quelques bases qui permettent de comprendre ce que j’ai voulu faire avec ce programme. Le “machine learning” est une composante de l’Intelligence Artificielle qui permet à une machine d’apprendre par elle même sans qu’un informaticien lui “code” précisément comment faire, mais grâce à des techniques d’apprentissage comme un humain le ferait: par l’exemple, ou bien à l’aide d’indicateurs qui lui permettent de comprendre si elle se trompe ou si elle est sur la bonne voix. La machine trouve alors ses propres concepts et raisonnements “toute seule”: d’où ce terme de machine learning.
L’apprentissage par renforcement
La technique d’apprentissage que j’utilise est dite “Reinforcement Learning” ou encore apprentissage par renforcement. Il s’agit de calibrer le réseau de neurones qui est initialisé au hasard (raison pour laquelle au début l’oiseau va faire n’importe quoi…) en fonction du déroulement de la partie qui recommence à chaque échec (l’oiseau s’est pris un obstacle). Lors du déroulement de la partie je vais attribuer +1 point (on parle de “reward”)à chaque fois que l’oiseau a pris une décision sans heurter quoi que ce soit. La technique d’apprentissage par renforcement vise à calibrer le réseau de neurones de telle sorte à ce que l’ensemble des rewards soit MAXIMAL: de telle sorte il s’améliore par l’expérience.
Si vous regardez des vidéos sur le net de robots qui font des pirouettes incroyables, des saltos arrières et autre marches humanoïdes: ce sont ces techniques d’apprentissage neuronal par renforcement qui sont utilisés.
quelques exemples
Cette technique est aussi fortement utilisée dans le domaine du jeux. Aux échecs par exemple au début les ingénieurs ont appris aux machines à jouer aux échecs en utilisant la parties d’échecs des meilleurs mondiaux: résultat mitigé les machines pouvaient battre les meilleurs, mais se faisaient parfois battre car ayant appris les techniques “humaines” leurs stratégies étaient reconnues par des humains qui pouvaient s’adapter. Puis un jour un type a eu l’idée de confronter deux machines l’une contre l’autre avec un algorithme d’apprentissage neuronal par renforcement: elles ont développé leurs propres stratégies que plus personne ne comprend et battent désormais n’importe quel humain en mode “humiliation!” Il en est de même avec le jeux de GO réputé comme le plus complexes des jeux de stratégie au monde: plus aucun humain ne peut battre une telle machine.
Bon revenons à notre petit oiseau sympathique: ce n’est pas avec un Raspberry pi qu’on va battre les meilleurs aux échecs hein ….
Flappy Bird
Dans mon exemple je suis parti du jeu Flappy Bird: un oiseau qui doit éviter des barrières qui lui arrivent dessus. Pour cela il n’a que 2 décisions à prendre: voler ou se laisser tomber. A lui de décider tout seul à chaque instant pour éviter un max de barrières. Pour prendre une décision il faut lui donner les moyens de percevoir son environnement: il sait à quelle distance il se trouve par rapport au sol et au plafond, il voit l’ouverture de la barrière et la distance par rapport à la barrière. Il y a peu de variables à analyser, uniquement 2 décisions à prendre donc un tout petit réseau de neurones suffit: ça devrait pouvoir fonctionner sur un Raspberry pi !
configuration logicielle
Pour faire fonctionner ce programme j’utilise les bibliothèques suivantes qu’il convient d’installer sur Raspberry pi:
- Tkinter
- Random
- PIL
- matplotlib
- numpy
- tensorflow
En principe pour installer tensorflow on s’en sort avec ces deux lignes:
sudo apt install libatlas-base-dev
pip3 install tensorflow
Mais chez moi le pip3 install tensorflow plante pour une histoire de mémoire cache insuffisante (sur un raspi 4 avec 4Go) …. donc j’ai contourné le pb en forçant l’utilisation d’un fichier sur la sd card à la place du cache mémoire et ça passe, voici la ligne de commande utilisée à la place:
TMPDIR=/home/pi/tfTEMP pip3 install --cache-dir=/home/pi/tfTEMP/ --build /home/pi/tfTEMP/ tensorflow --user
et là ça passe !
Pour télécharger mon programme python IABIRD.py, c’est ici sur ma page Github. Uploadez bien aussi toutes les images qui sont nécessaires pour l’animation sous Tkinter.
Si vous cliquez sur “Go!” l’animation se lance et au début l’oiseau devrait faire n’importe quoi” mais il va s’améliorer au cour su temps. C’est très lonnnnng. Pour accélérer l’apprentissage il faut cliquer sur “Render” afin de couper l’animation qui fait perdre du temps. Vous pouvez stopper l’apprentissage et le reprendre là où il en était en cliquant sur “Stop” et “Go!”, et cela va générer un graphique d’évolution des rewards au cours des répétitions: normalement la courbe des rewards augmente, preuve que le réseau s’améliore. On voit clairement sur la courbe d’apprentissage en forme de “S” deux inversions de tendance: une première rapide qui permet au réseau d’atteindre un score de 200: il apprend à atteindre la première barrière sans se cogner au plafond ou au sol. Ensuite l’apprentissage semble stabilisé autour du score de 200 mais reprend de plus belle au bout de 600 à 700 itérations car il a compris à ce stade comment passer une barrière: l’apprentissage s’emballe alors et comme j’ai mis une limite à 20 barrières il atteint le score max de 1500 environ après un bon millier d’itérations, et l’apprentissage est alors stabilisé en visant à réduire la variance. Sur le Raspberry pi4 il faut compter une bonne heure pour que le réseau enchaîne 700 itérations et comprenne comment passer une barrière, 2h pour 1000 itérations. Pour atteindre plus de 4000 itérations il faut patienter plusieurs heures…
Enfin sur la console python j’affiche régulièrement le score moyens de 10 parties consécutives et la variance: au fil du temps ce score moyen augmente et la variance diminue. Malgré tout pour que l’oiseau puisse apprendre à enchaîner plusieurs barrières tout seul sur un Raspberry pi4 vous aurez le temps d’aller courir un marathon ou d’aller dormir: laisser le bosser toute la nuit il lui faut enchaîner des milliers et des milliers de parties, et le résultat est “flippant” il enchaîne les barrières à la perfection!
Une amélioration adaptée au Raspberry pi consisterait à lancer la phase d’apprentissage neuronale très gourmande en ressources sur un ordinateur beaucoup plus puissant, puis de récupérer le résultat pour charger le réseau de neurones du raspi4 au démarrage: le flappy bird évoluerait ainsi avec un réseau de neurones déjà calibré pour franchir les barrières tout seul.
Si vous voulez comprendre comment fonctionne Tensorflow, les réseaux de neurones et les algorithme d’apprentissage: je vous recommande la lecture de l’excellent “Hands-On Machine Learning with Scikit-Learn & Tensorflow” aux éditions O’Reilly, écrit par un Français expert en data science et machine learning: Aurélien Géron.
vidéo démo
Petit résumé en vidéo où l’on voit l’évolution du flappy bird au cours du temps:
Conclusion: un Rapsberry pi4 doté d’un réseau de neurones peut apprendre tout seul par renforcement avec Tensorflow!