Aller au contenu


Photo
- - - - -

Entraînement d'un réseau de neurones artificiels grâce à un algorithme d'évolution génétique

java neurones artificiels algorithme génétique

  • Veuillez vous connecter pour répondre
7 réponses à ce sujet

#1 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 03 juin 2017 - 11:04

Salut tout le monde,
 
il n'y a pas mal de temps, j'avais dit sur un de mes post que j’avais fait un petit réseau de neurones entraîné par un algorithme d'évolution génétique dans le but d'en apprendre un peu plus sur le sujet. 
Il se trouve que je l'ai fini il y a environ 2 mois, mais était donné que c’était ce que je pressentais aux TP d'ISN pour mon BAC je ne pouvais pas le poster... 
Mais bon les épreuves sont finies donc je vous fais un petit explicatif de comment ça marche tout ça :
(juste un détail : je suis un AMATEUR et je rédige cet article pour vous donc ne me lapider pas si je fais une faute)    )
 
 
Avant de présenter le projet que nous allons réalisé il est nécessaire de se pencher sur les questions suivantes : 
 
1) qu’est-ce qu’un réseau de neurones artificiel ?
 
Comme son nom le laisse pensée, un réseau neuronal artificiel est un ensemble d’algorithmes très fortement inspiré de la biologie. Le but était de simuler de façon mathématique le fonctionnement d'un neurone.
 
Nous allons donc en premier temps expliquer comment marche un neurone de façon extrêmement simplifiée (oui oui c'est de la SVT déso les gars) : 
 
les neurones sont des cellules biologiques que l'on trouve dans tout le système nerveux et notamment dans le cerveau, ces cellules sont connectées les unes aux autres.
Ces connexions sont assurées par une terminaison présente sur le neurone, nommé axone.
Par cet axone un neurone peut envoyer un signal électrique aux autres neurones 
 
Le fonctionnement d'un neurone est donc la suivante : 
 
le neurone reçoit(/ou pas) un signal électrique venant des axones d'autres neurones, auquel il est lui-même connecté, et en fonction des signaux reçus , il fait quelque chose de plutôt « binaire » c'est-à-dire :
-soit il envoie aucun courant dans son axone 
-soit il envoie un signal électrique dans son axone
 
 
Fichier joint  Capture d’écran (188).png   45,84 Ko   43 téléchargement(s)
 
 
On sait aussi que la connexion entre les neurones, qui se fait par les synapses et peut-être plus ou moins forte. Lors d'un apprentissage, la force de ces connexions se modifie. 
Comme nous le montre la nature, connecter des milliards de neurones avec les bonnes connexions synaptiques peut créer un outil très puissant, mais surtout flexible qui est capable de résoudre de nombreux problèmes : le cerveau (c'est sur ça dépend chez qui hein) !
 
 
 
 
 
Maintenant que nous avons vu le fonctionnement approximatif d'un neurone, on peut extrapoler à des fonctions mathématiques qui ont pour but de reproduire leurs fonctionnements : les neurones artificiels.
 
Nous allons directement commencer par un exemple :
 
Créons donc un neurone avec 3 entrées (dendrites) qui vont envoyer des chiffres, X1,2 et 3, soit 1 ou 0 et affecter un coefficient à chacune des entrées (poids) P1, 2 et 3.
 
Le coefficient va modéliser la force de connexion des neurones, le neurone va donc additionner les valeurs reçues par les 3 entrées en prenant en compte les coefficients.
 
Fichier joint  Capture d’écran (189).png   21,73 Ko   43 téléchargement(s)
 
Si la somme est inférieure à un seuil « S » le neurone renvoyé 0 et si elle est supérieure au seuil le neurone renvoyé 1 (on aurait pu choisir n’importe quels autres chiffres) 
 
Et voilà nous avons reconstruit un neurone artificiel !! (wow) !
 
Pour résumer : le neurone artificiel est une fonction mathématique qui prend un nombre N d'entrée, en fait la somme avec un nombre N de coefficients, puis rend un nombre en sortie. 
 
C'est bien joli tout çà mais à quoi ça sert ?!?
 
Et bien tout comme dans le cerveau, ici un seul neurone n'est pas très efficace, mais combiner en réseau on peut obtenir des résultats de « cerveaux artificiels » très puissant, on peut par exemple citer le fameux algorithme de « deep learning » de Google, qui si on lui donne une image en entrée, est capable de dire ce qu'il y a dans l'image, avec une certitude de plus de 95 % (ce qui est meilleur que le meilleur des humains) !
 
Mais le grand problème avec ce type de programme c'est que l'on va devoir trouver justement tous les « poids » et « seuils » qui relient tous les neurones entrés eux.
Pour trouver les bonnes valeurs, on pourrait par exemple tout chercher a la main, mais il y a différents moyens d'y arriver, ici nous allons le faire grâce à un algorithme dévolution génétique. (à savoir que dans le monde des neurones l’apprentissage par rétroaction est bien plus coté, mais bon j'ai rien compris donc voila...)
 
 
 
2) Qu’est-ce qu’un algorithme dévolution génétique ?
 
Les algorithmes d’évolution génétiques sont inspirés de la théorie de l’évolution de Darwin et utilisent le principe selon lequel, l’entité la plus apte à résoudre un problème va survirer et se reproduire, pour participer à l'évolution de l’espèce.
 
Si nous pouvons utiliser un algorithme de ce type, alors nous n'aurions aucun problème pour trouver tous les poids et seuils, il suffirait de laisser un programme tourner et tester plein de configuration, les croiser, éliminer les moins aptes et garder les plus forts, pour au final trouver les poids qui marchent le mieux ! 
 
Et bien c'est ce qu'on va faire tout de suite ! 
 
 
En fait non je vous arrête tout de suite ! je n'ai pas poser le cadre du projet ! 
 
donc voila le but est de reproduire quelque chose de semblable a cette vidéo (elle m'avait fait triper quand j'ai découvert ça, certains membres s'en souviendront )  
 
 
Le but de ce programme est de faire évoluer des intelligences artificielles (que l'on va appeler poissons arbitrairement) dans un panel (qui sera leur environnement). 
Chacune des IA est construite d'une manière différente grâce à un réseau de neurones qui leur est propre.
Le programme consiste à trouver un poisson avec le réseau de neurone le plus adapté à résoudre un problème. 
Le problème est que: le poisson doit trouver une manière de se déplacer la plus optimisée pour manger le plus de nourriture possible en 10 secondes. 
 
Pour trouver un « super poisson » on va créer beaucoup de poissons différents, les tester puis faire reproduire ceux ayants mangés le plus de nourritures tandis que ceux qui en mangent le moins seront remplacés par les enfants des meilleurs. 
Ce procédé est appelé « algorithme d’évolution génétique » il reproduit en fait le principe de sélection naturelle comme quoi un individu apte à résoudre le problème va survivre et propager sa « solution » au fil du temps 
 
une petite image du projet :
 
Fichier joint  Capture d’écran (175).png   92 Ko   40 téléchargement(s)
 
on voit des "poissons" plus gros que d'autres car ils ont plus manger, donc que leurs réseau de neurones artificiel est plus performant 
 
 
3) Les algos le code et tout le tralala
 
le projet est en JAVA et est présenté par classes. Je ne peut pas commenter toutes les lignes du programme donc je présente les algos principaux , à vous de les adapter à votre langage de prédilection ;)
 
 
1) La classe environnement 
 
C'est la classe qui contrôle toutes les autres classes elle a pour but de faire tout marcher correctement et surtout dans le bon ordre,
Cette classe est un algorithme d'évolution génétique, il recrée dans l'ordre, toutes les étapes de la sélection naturelle , sur les poissons. 
 
Fichier joint  Capture d’écran (176).png   27,79 Ko   40 téléchargement(s)
 
1- il crée les individus et les nourritures
2- il les laisse évoluer librement 10 secondes 
3- il compare les scores grâce à la classe sélection
4- il accouple et fait muter les poissons grâce à la classe sélection
 
La classe est une boucle  qui se répète infiniment (thread) après avoir appelé la classe tableaux et créé les nourritures et les poissons
 
Fichier joint  Capture d’écran (177).png   30,95 Ko   39 téléchargement(s)
 
2) La classe tableau 
 
Nous avons fait une classe nommée « tableaux »  qui a pour but de créer tous les tableaux et de garantir le stockage de toutes les informations et l’accès par toutes les autres classes, c'est elle qui va donc le plus remplir la RAM .
Elle stocke : 
 
-Un tableau 2D (2*50 cases) pour les positions des nourritures 
-Un tableau 2D (100*8 cases ) pour les 8 gènes de chaque poissons
-Un tableau 2D (100*3) pour les 3 parties de couleurs RGB de chaque poissons 
-Un tableau 1D qui stocke les scores de chaque poissons
-Elle stocke aussi une variable booléenne qui sert d’interrupteur aux poissons
 
Les tableaux sont tous remplis plus ou moins sur le même modèle : 
prenons l’exemple du remplissage aléatoire du tableau qui contient les couleurs de chaque poissons. On a un algorithme qui part de la colonne 0 , (celle ou va se servir le poisson 0 ), jusqu’à la 99 , à chaque colonne il va entrer un entier aléatoire compris entre 0 et 255 dans les 3 lignes puis passer a la suivante.
 
Fichier joint  Capture d’écran (178).png   19,09 Ko   41 téléchargement(s)
 
Fichier joint  Capture d’écran (179).png   49,78 Ko   41 téléchargement(s)
 
Le tableau des scores quant à lui n'est pas rempli car de base un tableau créé est rempli de 0 , ce qui nous arrange car tous les poissons commencent avec un score de 0.
 
La classe tableau , en plus de la méthode principale , se compose de pleins de méthodes getters/setters , qui quand elles sont appelées dans d'autres classes permettent de modifier les tableaux de cette classe. C'est grâce à ces méthodes qu'il y a échange entre les classes. 
 
 
3) La Classe sélection : 
 
En réalité elle s’occupe aussi des accouplements.
 
A) La méthode sélection:
 
Voyons comment nous sommes parvenus à classer les poissons en fonction de leurs codes : 
C'est en fait l'utilisation d'un tableau intermédiaire qui permet ça , 
1 ère ligne : nom 
deuxième : score 
on le remplis la première fois avec tous les scores des poissons :
 
Fichier joint  Capture d’écran (180).png   5,52 Ko   38 téléchargement(s)
 
Puis on prend les premières cases et on regarde si le score qui correspond est plus grand dans la case d'après , si oui , alors on « pose » notre score dans cette case , puis on continue avec la case plus grande jusqu’à arriver a la fin du tableau : 
 
Fichier joint  Capture d’écran (181).png   25,77 Ko   37 téléchargement(s)
 
Fichier joint  Capture d’écran (182).png   44,33 Ko   36 téléchargement(s)
 
on peut noter l'utilisation de variables de stockage temporaires ce qui est très commun en programmation 
 
 
(je vous conseille de taper trie a bulle sur Wikipédia ils ont un GIF très bien pour expliquer le concept :                  https://fr.wikipedia...i/Tri_à_bulles                                )
 
 
B) La méthode accouplement :
 
Ensuite on procède a la partie accouplement , qui en réalité n'est rien d'autre que le remplacement du code génétique des plus mauvais pas celui du plus fort , c'est donc une méthode dite élitiste.
 
Comment ça marche :
 
on va prendre dans le tableau que l'on viens de classer la dernière case, donc celle avec le score le plus important , on peut donc avoir son nom.
 
Une fois que l'on a récupéré le nom du poisson le plus « performant » 
on va procéder à un nombre « d’accouplement »  aléatoire qui va simplement remplacer 
 
Fichier joint  Capture d’écran (183).png   42,19 Ko   36 téléchargement(s)
 
4) La  classe objets :
 
Cette classe était là pour ajouter des nourritures qui font perdre du score et que les bettes auraient dû esquiver mais ça ne s'est pas fait , elle est donc un peu inutile car elle ne sert qu'en superclasse de la classe nourritures.
 
5) La classe nourritures :
 
Une classe nourritures descend donc de la classe objet mais ce n'est pas si important 
ce sont de simples ronds affichés dans la fenêtre, leurs positions sont stockées dans un tableau à 2 dimensions qui se trouve dans une classe qui regroupe tous les tableaux utilisés dans l’ensemble du programme . 
Cette classe objet est appelée dans la classe Environnement, qui est en quelque sorte la classe qui regroupe toutes les autres, elle est appelée autant de fois que l'on veut de nourritures  (50 fois ici ).
 
Leurs positions d'affichage est définie grâce au tableau qui stocke leurs position dans la classe tableau 
 
 
6) La classe poissons :
 
C'est la deuxième classe objet que nous verrons ici , bien plus compliquée , c'est justement la classe qui va créer tous les poissons.
Cette classe va se servir de tableaux qui sont créés dans la classe Tableaux  :
 
1 tableau dans lequel des poids ont été mis aléatoirement, à chaque poisson , est assigné 8 poids. Ce tableau va nous être très utile lors des croisements notamment.  
 
1 tableau des couleurs , pour rendre le programme plus compréhensible , chaque poisson aura de base une couleur qui lui est définie de la même façon que les poids.
Des chiffres compris entre 0 et 255 (rgb) sont mis aléatoirement dans un tableau , et chaque poisson utilise ses 3 cases qui lui sont assignées pour savoir de quelle couleur ils seront. 
 
1 tableau de scores , encore une fois une case est assignée à un poisson , et si le poisson détecte qu'il a manger une nourriture , il va ajouter +1 au chiffre qui se trouve dans le tableau de score , ceci va être utile lors de la sélection des poissons , pour savoir lequel est le plus performant.
 
Une fois que les poissons ont récupérés tour ces tableaux et les valeurs
 
les poissons sont une classe spéciale qui contient une implémentation de « runnable »
ce qui veut dire que la méthode principale de cette classe va se répéter sans arrêt ,
 voici un schéma de ce qu'il va se passer :
 
Fichier joint  Capture d’écran (184).png   26,2 Ko   37 téléchargement(s)
 
A) La méthode scanner : 
 
Elle prend en entrée le X et Y du poisson et va ressortir le X et Y de la nourriture la plus proche.
Pour faire ça on utilise une formule de maths simple : 
 
√[(Xpoisson - Xnouriture)² +(Ypoisson+Ynourriture)²] = distance Poisson/Nourriture 
 
on va donc scanner le tableau des positions de nourriture colonne par colonne, 
 
si colonne actuelle sup colonne précédente , alors  on enregistre les coordonnées x y dans des variables de stockage temporaire 
 
 c'est aussi dans la méthode scanner qu'on regarde si le poisson a « mangé »  la nourriture , en effet on va regarder si la distance retenue entre nourriture et poisson n'est pas inférieure au diamètre du poisson , dans ce cas le poisson a donc mangé la nourriture , on ajoute donc +1 dans sa case au tableau de nourritures 
 
B) La méthode Réseau Neuronal.
 
C'est la méthode la plus difficile à comprendre de tout le programme malgré qu’elle soit simple à coder, il faut bien comprendre le principe de réseau de neurones.
 
le neurone artificiel est une fonction mathématique qui prend un nombre N d'entrée , en fait la somme avec un nombre N de coefficient (1 par entrée)  , puis rend un nombre en sortie.
 
Les coefficients multiplicateurs représentent la force de connexion entre les neurones, elle est comprise entre -1,1 et 1,1 
 
elle prend en entrée 4 variables :
les position X et Y du poisson 
les positions X et Y de la nourriture la plus proche trouvée par la méthode scanner
 
Ces quatre données sont entrées dans les 2 neurones et additionnées entre elles après avoir étaé multipliées par les poids qui se trouvent dans le tableau prévu a cet effet 
 
Fichier joint  Capture d’écran (185).png   20,39 Ko   41 téléchargement(s)
 
En fonction du résultat de ces deux sommes ont va réaliser des actions différentes : 
Se déplacer de 1px  vers la gauche ou la droite 
Se déplacer de 1px  vers le haut ou le bas  
 
J'ai fait un schéma pour se rendre compte  du réseau :
 
Fichier joint  Capture d’écran (186).png   317,49 Ko   35 téléchargement(s)
 
7) La classe chrono :
 
Cette classe sert à rafraîchir la fenêtre à intervalle régulier, elle supprime toutes les entités présentes dans la fenêtre toutes les 1 ms ce qui permet de voir des mouvements fluides à l’écran 
 
 
8) La classe fenêtre :
 
Rien de très spectaculaire encore , la classe fenêtre fait une fenêtre dans laquelle elle affiche un panel qui est rempli par la classe environnement. 
 
9) La classe Main:
 
C'est la classe qui se lance quand on clique sur le programme, 
elle lance la classe tableau puis la classe fenêtre , qui va déclencher une cascade d'appel de classes : Environnement, poissons , nourritures, chrono , ect ect …  
 
 
 
Voila voila les amis c'est mon expérience perso que j'essaye d'expliquer ici, il doit y avoir des centaines d'autre façons de faire bien plus cool, c'est juste pour vous montrer comment moi j'ai fait !
 
Si il y a des endroit pas clairs dites le moi que j’arrange tout ça, sachez que je fais de mon mieux , c'est très dur de vulgariser des sujets comme ça...   
 
Le code complet arrive bientôt, mais j'ai un problème : les commentaires sont remplis de fautes ! je dois donc arranger ça !
Et aussi je suis pas super douer en français et je viens d'écrire ça aux alentours de minuit donc si vous voyez des fautes partout signalez le ;)   
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 


Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 


#2 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 07 juin 2017 - 09:51

(Je tiens à préciser que le sujet n'est pas fini, je suis un peu débordé en ce moment mais ne vous en faites pas tout est déjà fait il ne manque que la rédaction)


Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 


#3 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 04 juillet 2017 - 09:26

Super bravo à toi. Je vais relire ça avec beaucoup d'attention.


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#4 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 05 juillet 2017 - 02:22

Merci  :ignat_02:  mais ce n'est pas fini

 

Je viens d'avoir les résultats de ça, j'ai eu 20/20 


Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 


#5 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 05 juillet 2017 - 07:22

Tu le mérite. Oki. je voulais te poser une question quelque part j'ai vu qu'on pouvait utiliser des réseaux de neurones pour du nlp est-ce que tu les a déjà utilisé pour ça ??

Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#6 Didier

Didier

    Membre

  • Membres
  • 22 messages

Posté 06 juillet 2017 - 08:25

Bonjour le forum.

 

Super post ...

 

Quelques questions sur ce principe d'apprentissage :

 

Si j'ai bien compris le poisson 2 de la 18ème génération ( c'est un exemple ) a été retenu parce qu'un poisson de la 17ème génération à obtenu un des meilleurs scores en fonction de son comportement dans son milieu.

 

Comment le poisson 2 sait-il se comporter ?

Reproduit-il le comportement du poisson de la génération 17 en y apportant une variante ?

Si oui, comment connait-il le comportement du poisson de la 17ème génération ?

Sinon comment fonctionne la mémoire "atavique" des poissons ?

 

Merci de m'avoir lu.

 

Didier.



#7 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 06 juillet 2017 - 09:34

Merci, 

 

R2D2 : 

 

Les algos de npl sont extrêmement prisés, je ne suis absolument pas encore apte a faire ça, mais la recherche la dessus avance, le problème c'est qu'il vous faut une grannnnnnnde base de données. il est bien plus simple de faire comprendre une image qu'une phrase. 

 un petit lien si tu aimes lire : 

http://u.cs.biu.ac.il/~yogo/nnlp.pdf

 

c'est sympa mais je n'ai pas fini ;)

 

Didier :

 

* C'est le principe, si le poisson est encore là , c'est car il est parmi les meilleurs. Si il fait parti des meilleurs c'est juste car ses gènes font de lui ce qu'il est. 

 

Le poisson en fait ne sais pas se comporté, il faut faire abstraction du "savoir"  si tu es la ce n'est pas car tu "sais" respiré et que tu as décidé de le gardé, c'est juste que si tu ne lavais pas fait, tu ne serais pas la et toute ta descendance serait aussi éliminée.

 

Il faut vraiment voir le principe du darwinisme a travers cet algo. si le poisson 2 est la en train de manger, ce n'est pas car il en a décidé ainsi , c'est juste que sans ça, il ne serait pas la !

 

* J'ai plusieures versions de l'algo, mais dans beaucoup de versions le poisson 2 ne vas pas changé entre les deux générations, mais par contre on va prendre ses gènes et les faire mutés puis les transférés dans un autre poisson qui a fait un mauvais score, il y a donc des mutations du meilleur poisson qui sont testés, mais on le conserve quand même vivant au cas ou les mutations ne soient pas viables. 

 

*Le poisson ne connais pas du tout le comportement de la génération 17 , puisque la encore les comportements sont juste le résultat d'un assemblage génétique. Le poisson va juste reprendre les mêmes gènes que le précédent. Un comportement n'est pas mesurable, on ne peut pas le stocké sous formes de données, en revance la structure d'un individu, qui elle régi son comportement est (dans se cas ) facilement stockable car elle est générée par le code génétique.

 

Par exemple, si je t'étudie, prends des notes sur ce que tu fais toutes ta vie , il y peu de chances pour que j'arrive a créer un clone de toi avec les mêmes comportements (même si je pouvais hein on est dans la métaphore). par contre si je sais la structure de ton cerveau et de t'es gênes, fastoche ! (bon après il y à a une histoire de vécu ect mais bon c'est un exemple)  

 

voila j’espère clarifié un peu, si c'est pas le cas dites le il n'y a pas de soucis ;)  


Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 


#8 Didier

Didier

    Membre

  • Membres
  • 22 messages

Posté 06 juillet 2017 - 09:51

Bonsoir.

 

Mazette !

 

Merci pour ces explications. mais ça me semble quand même bien compliqué.

 

En gros on parle d'algorithmes de de philosophie métaphysique.

 

Je vais lire, lire et relire pour essayer de bien intégrer ça.

 

Edit1 : Cela vient de me venir à l'esprit...

Dans ce système l'individu compte peu, s'il est bon on le garde, s'il est mauvais on le jette.

Ce qui compte c'est la survie du groupe.

Je sens que je ne vais pas bien dormir cette nuit.

 

Didier.







Aussi étiqueté avec au moins un de ces mots-clés : java, neurones artificiels, algorithme génétique

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users