Dans Neural Bird, regardez des réseaux de neurones artificiels évoluer grâce à un algorithme génétique pour apprendre à jouer à flappy bird.
Le réseau de neurones est composé de trois entrées (la distance horizontale jusqu'au prochain tuyau, la distance verticale entre l'oiseau et le trou, et la vitesse verticale de l'oiseau), deux neurones dans la couche cachée, et un neurone dans la couche de sortie. La fonction d'activaton utilisée pour chaque neurone est la fonction sigmoide.
A chaque génération, les scores des 10 membres de la population sont évalués, puis les deux moins bons sont éliminés et remplacés par un "mélange" du meilleur et d'un autre au hasard(par "mélange", je veux dire que je prend certains poids d'un réseau de neurones et d'autres d'un autre réseau pour en former un nouveau). Et enfin, je fais "muter" certains réseaux en modifiant aléatoirement les valeurs de certains poids.
Le graphique en bas à droite montre les moyennes des scores de chaque génération.
Le programme utilise toutes les variables de A à Z, la liste 1(que vous pouvez modifier/supprimer), et les listes 10 à 13(celles-ci sauvegardent les données du programme : 10: Le meilleur réseau de neurones,11: les scores de la génération actuelle et le meilleur score,12: tous les poids des 10 réseaux de neurones de la population, 13: le nombre de générations et les moyennes des scores à chaque générations).
Le programme à lancer est NRLBIRD, et si vous voulez voir jouer le meilleur réseau de neurones que votre calculatrice a fait évoluer, ajoutez "List 10->List 1" au début du programme NRLBIRD1(et n'oubliez pas de retirer ce bout de code si vous voulez continuer l'évolution).
J'ai mis le meilleur que j'ai fait évoluer dans le programme NRLBEST, il suffit de le lancer, puis de lancer le programme NRLBIRD1 pour le voir jouer.
Ça peux prendre assez longtemps pour arriver à un bon résultat, ainsi, je conseille d'overclocker la calculatrice pour aller plus rapidement.
Ce programme a l'air impressionnant ! Je l'essaierai surement lorsque j'aurais remis la main sur ma calculatrice. En tous cas, c'est la première fois que je vois un programme de ce genre sur PC !
Chouette de voir ça ici, surtout en Basic, je suis curieux de voir les performances que ça peut donner, et testerai dès que j'en aurai l'occasion, voir comment ça se présente !
Si j'ai bien compris la topologie de ton réseau de neurone reste fixe au cours du temps (je veux dire qu'il a toujours la même forme, seuls les coefficients évoluent), c'est bien ça ?
Je sais que sur des vidéos que l'on voit parfois d'IA apprenant à jouer à des jeux vidéo (je pense par exemple à cette vidéo sur Mario, assez connue), les algos utilisés pour faire évoluer le réseau sont parfois de type NEAT, c'est à dire qu'en plus des divers coefficients, la structure même du réseau évolue ; c'est peut être assez délicat à imaginer en Basic, mais ça peut être intéressant je trouve de pouvoir comparer les performances obtenues (et le temps pour les obtenir, le basic offrant une belle contrainte à ce niveau là !), si tu avais prévu à continuer à travailler sur ce programme.
j'ai testé et c'est fou de pouvoir faire un réseau neuronal en seulement une centaine de ligne
sinon au niveau perf...ben c'est du basic mais en overclockant ça va
j'en suis a 50 génération et je fais 2 de score en moyenne donc ça a l'air de fonctionner
Merci pour les retours si rapides
Nemhardy, oui seuls les poids des connections évoluent. En effet ça pourrait être intéressant d'implémenter NEAT, par contre ça risque d'être difficile. Je vais y réfléchir.
D'ailleurs j'ai oublié de dire dans la description que je fais des mutations au hasard après avoir enlevé les moins bons. Je rajoute ça tout de suite.
Aussi le score utilisé pour déterminer les meilleurs et les moins bons n'est pas le nombre de tuyaux passés mais est en fonction de la distance verticale au trou et du nombre de tuyaux passés, ainsi, entre deux oiseaux étant morts au premier tuyau, le plus proche du trou sera la meilleur.
Très impressionnant ! Je l'ai fait jouer pendant environ 60 générations et le score a augmenté de façon consistante malgré des hauts et des bas... irréguliers comme sur l'exemple.
Le plus génial, c'est la quantité de code dont tu as eu besoin pour faire ça : quasiment rien. Respect !
Ça me fait penser que j'en avait fait un pour jouer au Worms, mais il était un peu lent x)
J'avais 5 entrées (position (x, y) de la cible, position (x, y, length) d'un obstacle vertical) et deux sorties (theta, power), et deux couches cachées de 4 neurones.
Après quelques heures de calcul, je commençais à avoir des résultats, mais rien de bien intéressant pour être posté
Wow c'est cool. Tu l'avais entrainé comment? Après, ce qui pourrait être intéressant serait d'utiliser un réseau de neurones préentrainé sur ordinateur.
Au début, par un algo génétique (ce que tu fais ici). Mais c'était très lent et pas hyper efficace vu que j'ai 5×5 + 5×4 + 3×4 = 57 poids à ajuster.
Du coup j'ai fini par l'entrainer semi-automatiquement, couche par couche en remontant. Une sorte de backpropagation manuellement conduite et ajustée. Pas non plus très efficace, mais super intéressant.
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd