Présentation du projet

Vous pouvez trouver les sources de ce projet sur mon github : http://repository.underflow.fr/genetik-perceptron

Le but est d’implémenter un réseau de neurones entraîné par un algorithme génétique avec une abstraction du problème à résoudre suffisante pour être capable d’apprendre à faire un peu tout et n’importe quoi.

Il aura bientôt la possibilité d’être couplé à un programme externe qui lui s’occupera de la simulation du problème (exemple : un jeu vidéo où le réseau de neurones devra apprendre jouer).

Réseaux de neurones artificiels

Commençons par une définition rapide :

« Un réseau de neurones artificiels est un modèle de calcul dont la conception est très schématiquement inspirée du fonctionnement des neurones biologiques. »
Wikipedia

Comme l’indique la définition, l’objectif premier d’un réseau de neurones artificiels est d’effectuer un calcul et son principal atout réside dans capacité à apprendre tout seul à le faire, par l’expérience.

Un réseau de neurones artificiels est constitué de neurones artificiels qui sont le plus souvent reliés par couches successives :

Chaque neurone possède n entrées pondérées et 1 sortie qui est reliée à tous les neurones de la couche suivante. La valeur de sa sortie est donnée par l’application à une fonction de transfert de la somme pondérée de ses entrées.

Auteur : Chrislb

Pour plus d’explications : http://fr.wikipedia.org/wiki/Réseau_de_neurones_artificiels

Pour un problème donné par exemple reconnaître un visage d’homme et de femme, on va envoyer en en entrée dans le réseau de neurones la position des yeux, de la bouche, du nez, etc… En fonction des coefficients de chacun des neurones, couche par couche l’information va être traitée, jusqu’au neurone de sortie qui retournera 0 s’il pense qu’il s’agissait probablement d’un homme ou 1 s’il s’agissait d’une femme.

La difficulté réside donc entièrement dans la détermination de la valeur des coefficients à affecter aux différents neurones du réseau.

Apprentissage

L’apprentissage équivaut donc à l’ajustement des différents coefficients des neurones du réseau. Un algorithme est très efficace pour ça : la rétropropagation du gradient. Il va tenter d’ajuster automatiquement les poids des connections en fonction de l’erreur commise par le réseau.

J’ai cependant décidé d’expérimenter une technique un peu plus exotique et qui est adaptée à problème où l’on ne peut pas déterminer quelle est l’erreur commise par le réseau mais plutôt quelle a été sa performance pour traiter un problème, à savoir : un apprentissage par le biais d’un algorithme évolutif.

Dans mon précédent billet, j’explique le principe de ces algorithmes, et je l’ai appliqué au cas de l’ajustement des pondérations d’un réseau de neurones et les résultats sont pour l’instant plus qu’encourageants.

Premier test

Le premier test effectué pour l’instant est très simpliste. Il s’agissait d’entraîner un réseau à résoudre (A > 0) XOR (B > 0) avec A la première entrée et B la deuxième entrée.

Le réseau entraîné possède 2 entrées 3 neurones sur la première couche, 3 sur la seconde et 1 pour la couche de sortie.

Pour déterminer le fitness du réseau, j’effectue 10.000 tests avec des entrées tirées aléatoirement sur l’interval [min_int; max_int] et je calcule le pourcentage de bonne réponses au problème. De générations en générations, le réseau va se perfectionner jusqu’à atteindre un score de 100% de bonnes réponses pour les 10.000 entiers tirés aléatoirement :

Best fitness : 55,4%
Best fitness : 60,1%
Best fitness : 67,8%
Best fitness : 69,7%
Best fitness : 73,2%
Best fitness : 71,8%
Best fitness : 74,6%
Best fitness : 72,5%
Best fitness : 73,4%
Best fitness : 72,5%
Best fitness : 73,6%
Best fitness : 76,7%
Best fitness : 76,9%
Best fitness : 77,3%
Best fitness : 75,2%
Best fitness : 75,1%
Best fitness : 76,2%
Best fitness : 77,2%
Best fitness : 83,3%
Best fitness : 91,9%
Best fitness : 92,9%
Best fitness : 93,9%
Best fitness : 94,5%
Best fitness : 93,4%
Best fitness : 93,7%
Best fitness : 94,5%
Best fitness : 94,5%
Best fitness : 97,7%
Best fitness : 92,6%
Best fitness : 94,2%
Best fitness : 98,1%
Best fitness : 97,5%
Best fitness : 98,1%
Best fitness : 98,2%
Best fitness : 98,7%
Best fitness : 98,1%
Best fitness : 98,1%
Best fitness : 98,8%
Best fitness : 98,5%
Best fitness : 99%
Best fitness : 98,8%
Best fitness : 98,3%
Best fitness : 98,2%
Best fitness : 98,6%
Best fitness : 98,5%
Best fitness : 98,4%
Best fitness : 98,5%
Best fitness : 90,7%
Best fitness : 91,5%
Best fitness : 98,3%
Best fitness : 98,6%
Best fitness : 98,6%
Best fitness : 98,7%
Best fitness : 98,9%
Best fitness : 99,2%
Best fitness : 98,5%
Best fitness : 97%
Best fitness : 97,5%
Best fitness : 98,2%
Best fitness : 98,6%
Best fitness : 97,6%
Best fitness : 98,3%
Best fitness : 98,2%
Best fitness : 98,6%
Best fitness : 98,4%
Best fitness : 98,3%
Best fitness : 98,3%
Best fitness : 98,3%
Best fitness : 98,7%
Best fitness : 98%
Best fitness : 97,8%
Best fitness : 98,5%
Best fitness : 98,6%
Best fitness : 99,2%
Best fitness : 99%
Best fitness : 99,5%
Best fitness : 99%
Best fitness : 99,3%
Best fitness : 99,7%
Best fitness : 100%

Et ensuite ?

Je suis actuellement en train de coder le système de communication entre le système d’apprentissage (réseau de neurone + algo génétique) et celui de simulation et d’évaluation (un jeu vidéo par exemple).

A terme, je compte faire apprendre à jouer à pong le réseau de neurones artificiels avec cette méthode !