Configuration d'un réseau de neurones

avec un méta-réseau de neurones

 

https://codes-sources.commentcamarche.net/source/2936

Patrice Dargenton : patrice.dargenton@free.fr

http://patrice.dargenton.free.fr/index.html

 

Version 1.2 du 01/04/2002

 

 

Table des matières

Table des matières. 1

Introduction : Le Perceptron multicouche. 1

Configuration du RN avec un méta-RN.. 2

Principe du méta-RN.. 2

Utilité du méta-RN.. 2

Instabilité de l'apprentissage. 2

Conclusion sur le méta-apprentissage. 2

Méta-Apprentissage et Conscience Artificielle : le projet IALib. 2

Projets. 2

Divers. 2

Convergence. 2

Variables supplémentaires. 2

Amélioration des démos. 2

Démos supplémentaires. 2

Versions. 2

Version 1.20 du 01/04/2002. 2

Version 1.10 du 01/02/2002. 2

Version 1.00 du 24/11/2001. 2

Version 0.12 du 01/04/2002. 2

Version 0.11 du 01/02/2002. 2

Version 0.10 du 24/11/2001. 2

Liens. 2

 

 

Introduction : Le Perceptron multicouche

 

Un réseau de neurones (RN) du type Perceptron multicouche (MultiLayerPerceptron) est capable d'apprendre à peu près n'importe quoi : une porte logique XOR, une fonction sinus, les lettres de l'alphabet (OCR), les taches solaires, les résultats du loto, le CAC40...

 

Ce logiciel est, à l'origine (version 0.1), la traduction en Visual Basic du logiciel mlp en C++ de Sylvain BARTHELEMY : www.sylbarth.com.

 

C'est un "apprentisseur" universel : il est capable d'apprendre une fonction de transfert entre un signal d'entrée et un signal de sortie de façon entièrement automatique grâce à la technique de la rétropropagation, cf. Cours théorique sur les RN.

 

Cependant, la qualité des résultats dépend beaucoup de la représentativité de l'ensemble d'apprentissage, des paramètres d'entrée et de sortie. En outre, le réseau de neurones ne converge pas toujours en fonction du tirage aléatoire des poids initiaux (d'où l'idée de faire plusieurs tentatives d'apprentissage), si le nombre d'itérations est trop faible ou bien s'il n'existe pas de "séparativité" du jeu de résultats (signal cible), c'est-à-dire s'il n'existe pas une base de vecteurs indépendants pour représenter les résultats à partir du signal source (heu... là je ne suis plus très sûr :-).

 

Cela étant dit, le réseau de neurones peut apprendre et reconnaître des signaux très variés et prédire tout ce qui est plus ou moins cyclique !

 

Si vous avez déjà testé ce genre de logiciel, vous vous êtes sans doute déjà demandé combien de couches votre RN devait avoir (en théorie, quatre couches suffisent dans le cas général), combien de neurones pour chaque couche, combien d'itérations, et d'autres questions encore : c'est inutile de se prendre la tête avec tout ces détails lorsque un méta-RN peut précisément faire à votre place les différents tests que vous feriez pour y répondre.

 

 

Configuration du RN avec un méta-RN

 

Principe du méta-RN

La problématique du réseau de neurones (RN) est sa configuration : comment bien choisir les coefficients Alpha, Eta et le gain, la fonction d'activation, son architecture, ... même l'ordre des échantillons en entrée peut influencer l'apprentissage ! Cela demande de faire beaucoup d'essais et ça prend du temps, pourquoi alors ne pas réaliser ces essais automatiquement en tirant des configurations au hasard ?

Afin d’optimiser effectivement le RN, il faut faire converger ces configurations vers une performance maximale. Pour cela, on définit un score, par exemple en tenant compte en sortie du RN du nombre minimum d'itérations qu'il a fallut pour obtenir 100% de résultat (pour la tolérance donnée), du nombre minimum de couches et de neurones, de l'erreur moyenne en sortie, de la stabilité de l'apprentissage (reproductibilité de l'apprentissage avec cette configuration).

Pour maximiser le score, c'est là que le méta-RN intervient : il s'agit d'un RN qui apprend à reconnaître une bonne configuration (sans la tester) afin d'optimiser les tirages aléatoires. En entrée du méta-RN on indique les configurations testées, et en sortie les scores obtenus correspondants. Ensuite, seules les configurations (toujours tirées au hasard) dont le méta-RN est optimiste seront réellement testées. Comme ça, la configuration du RN sera de moins en moins réalisée au hasard, et de plus en plus en fonction du critère de maximisation du score.

Dans l'idéal, on pourrait utiliser d'autres algorithmes d'optimisation ou d'analyse de donnée multidimensionnelles sur le méta-RN afin de déterminer quels paramètres sont susceptibles de produire les gains les plus élevés (comme si on cherchait à trouver des solutions d'une équation à plusieurs inconnues).

Les configurations aboutissant à un score nul sont également apprises afin que le méta-RN puisse aussi les reconnaître, mais si ces configurations sont trop nombreuses, cet apprentissage se fait un peu au détriment des bonnes configurations ; il faut donc faire attention à la représentativité de l'ensemble d'apprentissage et au taux d'apprentissage des bonnes configurations. On peut ainsi améliorer l'apprentissage en approfondissant les mesures que l'on peut faire en comparant les valeurs produites par le méta-RN par rapport aux configurations apprises, notamment en mesurant la qualité de l'apprentissage indépendamment pour chaque sortie. Cependant, même lorsque le jeu d'apprentissage est bien représentatif, le méta-RN a parfois du mal à apprendre que certaines valeurs pour certaines entrées aboutissent toujours à un score nul, il y a donc une amélioration à prévoir à ce sujet.

 

Le principe du méta-RN est testé avec le XOR : de meilleures configurations avec les paramètres Alpha, Eta et le gain permettent un apprentissage fiable avec moins d'itérations. Une généralisation aux autres démos est prévue dans une prochaine version.

 

Exemples de temps de calcul avec une fonction d'activation linéaire (avec un seuil) au lieu de la Sigmoïde standard (avec un Athlon AMD 850 MHz sous Windows 2000 Server) :

Fct std.:           y(x) = 1 / (1 + Exp(-rGain * x)) :

Fct lin.:

        If x * rGain< -0.25 Then

            rFctActivation = 0

        ElseIf x * rGain> 0.25 Then

            rFctActivation = 1

        Else

            rFctActivation = 0.5 + 2 * x * rGain

        End If

 

- Logiciel compilé en Code Natif avec optimisation complète en rapidité (VB Professionnel) :

Fct lin.: 0.43 sec : 12% : 8x plus rapide que le temps max. et 1.5x + rapide que fct std.

Fct std.: 0.72 sec : 20%

 

- Logiciel compilé en Code Natif avec optimisation en rapidité (VB Professionnel) :

Fct lin.: 0.68 sec : 19% : 5x plus rapide que le temps max. et 2x + rapide que fct std.

Fct std.: 1.60 sec : 45%

 

- Logiciel compilé en Code Natif sans optimisation :

Fct lin.: 0.78 sec : 22%

Fct std.: 1.75 sec : 49%

 

- Logiciel compilé en P-Code (équivalent à VB Standard) :

Fct lin.: 2.63 sec : 74%

Fct std.: 3.40 sec : 96%

 

- Logiciel en mode debug (dans l'IDE) :

Fct lin.: 3.05 sec : 86%

Fct std.: 3.54 sec : 100%

 

Copie d'écran sur la visualisation en 3D du méta-RN : https://codes-sources.commentcamarche.net/source/2936

 

Utilité du méta-RN

Le méta-RN est-il vraiment utile ? pourquoi ne pas tout simplement parcourir l'ensemble du domaine variable avec un pas de précision donnée ? en fait, plus le nombre de variables augmente, plus le domaine de recherche est large, et plus la recherche de configurations performantes est laborieuse. L'utilité du méta-RN réside dans le fait que la probabilité qu'une configuration filtrée réussisse est supérieure à celle d'une configuration non filtrée. Les premières mesures réalisées montre qu'effectivement, plus le domaine de recherche est large, plus le méta-RN est utile (mais ce n'est pas encore clairement démontré). En fait, l'utilité du méta-RN diminue si le taux d'apprentissage des bonnes configurations diminue, il faut donc le surveiller, sinon un simple tirage aléatoire des configurations produirait le même résultat !

En faisant un peu de stratégie, on peut rechercher des optimisations par groupe de 2 paramètres variables en espérant que l'on ne passe pas ainsi à coté de combinaisons optimales (il faut faire attention au risque de dépendance entre certains paramètres pour la localisation des plages optimales). Par essais successifs, on arrive assez bien à fixer des plages de paramètres intéressantes.

Toujours dans la stratégie de recherche, une autre idée consiste à affiner progressivement la précision des zones de recherche : en commençant l'analyse des plages variables avec un maillage grossier, on pourrait affiner le maillage seulement sur les zones les plus prometteuses, cette stratégie sera mise en oeuvre dans une prochaine version.

 

Pour le moment, une des difficultés rencontrées est l'instabilité de l'apprentissage.

 

Instabilité de l'apprentissage

Lors du tirage aléatoire, on teste plusieurs fois chaque configuration afin de vérifier si la convergence de l'apprentissage est fiable pour cette configuration. En effet, une configuration peut donner un apprentissage très rapide mais instable c'est-à-dire plus difficile à reproduire. Si l'apprentissage a réussi, par exemple quatre fois consécutivement, le score est maximal. Cependant, lorsque l'objectif est atteint et que l'on re-teste cette même configuration, il arrive qu'elle ne soit plus aussi stable : cette différence est inexplicable hormis par le caractère pseudo-aléatoire de la fonction RND utilisée lors du tirage aléatoire des poids initiaux des neurones : d'une manière inconcevable, la série pseudo-aléatoire, pourtant initialisée à partir d'un Timer lié au temps écoulé depuis l'allumage de l'ordinateur grâce à l'instruction Randomize, entraîne plusieurs tentatives successives réussies, lesquelles ne sont parfois plus reproduites par la suite. Je n'ai pas trouvé d'autre explication (à moins d'avoir oublié un détail de calcul ?).

Pour éviter d'augmenter systématiquement le nombre minimum de tentatives à réaliser, ce qui allongerait considérablement le temps de calcul global de l'optimisation du RN sur une plage de paramètres variables, on suit une stratégie analogue à celle proposée pour affiner progressivement la précision : on commence avec 2 tentatives seulement et on n'augmente le nombre de tentatives que pour les configurations les plus intéressantes, en l'occurrence à chaque fois qu'un score maximum est atteint.

 

Conclusion sur le méta-apprentissage

La principale difficulté du méta-RN est de gérer les contradictions rencontrées dans l'apprentissage des configurations aléatoires : il faut indexer les configurations et améliorer leur apprentissage, mais si la précision des paramètres est trop fine, les contradictions risquent d'être moins bien détectées et la représentativité de l'apprentissage sera moins bonne. Pourquoi alors ne pas gérer l'optimisation du méta-RN avec... un méta-méta-RN ! Il faut d'abord terminer la généralisation du méta-RN avant d'envisager le méta2-RN.

 

Si vous avez des idées ou des infos complémentaires sur la stratégie d'apprentissage ou sur comment définir la structure des RN, envoyez-moi un courriel SVP.

 

 

Méta-Apprentissage et Conscience Artificielle : le projet IALib

 

Le projet (vb-)IALib est une librairie d'algorithmes d'Intelligence Artificielle (I.A.) génériques mais utiles et réutilisables pour traiter des problèmes concrets. Cette librairie se présente sous forme de code source de composants correspondants à des classes en Visual Basic, que l'on pourrait assembler comme un jeu de Lego créatif. Le Visual Basic permet de programmer en se concentrant à 90% sur le problème du "métier" et 10% seulement sur le langage, contrairement aux autres langages pour lesquels la proportion est souvent inverse.

 

Exemple d'algorithmes génériques qui ont prouvés leur utilité : algo. génétiques, réseaux de neurones, réseaux de Kohonen, de Hopfield, chaînes de Markov, machines de Boltzmann (avec la technique du recuit simulé : résolution du problème du voyageur de commerce), programmation par contraintes, mémoires associatives, mécanismes d'auto-régulation, vie artificielle, intelligence de groupe, systèmes multi-agents, ...

A voir aussi : des systèmes moins génériques mais tout aussi intéressants et utiles : systèmes experts, logique floue, blackboards, ... et autres algo. de jeux de réflexion (Echecs, Dames, Othello-Reversi, Bridge, ...).

 

Le Méta-Apprentissage (cf. section précédente) consiste à apprendre à apprendre : on utilise par exemple un méta-réseau de neurones pour apprendre à configurer un réseau de neurones classique, qui lui s'occupe d'un problème concret.

 

Le point commun de toutes ces techniques, et donc l'intérêt de les regrouper dans une librairie unique, est le principe de la "boîte noire" : on ne sait pas très bien comment elle fonctionne, mais en tout cas, ça marche ! de sorte que cela alimente un peu le vieux fantasme de créer une machine qui un jour, on l'espère ou on le redoute, échappera au contrôle de son créateur, au moins en ce qui concerne ses capacités prévues ou imprévues... de là à voir émerger une sorte de "Conscience Artificielle", je ne serais pas le premier à l'évoquer :-)

 

Si vous voulez participez, par exemple en adaptant un des algorithmes cités avec une ou deux démos simples illustrant son intérêt (voir les Liens), vous êtes le bienvenu :

 

 

Projets

 

Divers

- Tracé de la courbe de résultat et la courbe d'erreur pour vérifier la progression sur un grand nombre d'itérations et de tentatives et pour comparer par rapport aux meilleurs taux obtenus à un moment donné, (estimation du nombre d'itérations nécessaire) ;

- Généralisation méta-RN pour les démos autres que celle du XOR ;

- Sélection des paramètres variables à représenter en 3D (s'il y en a plus de 3 simultanément) ;

 

Convergence

- Amélioration du taux d'apprentissage des bonnes configurations afin de préserver l'utilité du méta-RN ;

- Amélioration de la représentativité du jeu d'apprentissage lors de l'indexation (dupliquer les bonnes config. afin de renforcer leur taux d'apprentissage ?) ;

- Créer un maillage à n dimensions pour n variables, résolution progressive en fonction du score local ;

- Trouver les max. locaux du RN par une méthode de recuit simulé ou avec un logiciel d'analyse de données multidimensionnelles ;

- Test de recherche du maximum avec des simples boucles imbriquées sur les variables suivant leur précision spécifique ;

 

Variables supplémentaires

- Fonctions d'activation plus rapides ou plus efficaces à compléter (réglage du seuil et de la pente centrale de la fonction linéaire, prévoir une pente aussi aux extrémités) ;

 

Note : il y d'autres infos dans le code source, notamment dans la fonction ListDemo_Click(), les fichiers Donnees\*.dat, ainsi que dans le reste du code.

 

 

Versions

 

 

Version 1.20 du 01/04/2002 Première version du méta-RN

 

 

Liens

 

- RN autoconfigurant (Configuration d'un réseau de neurones avec un méta-réseau de neurones) :

            https://codes-sources.commentcamarche.net/source/2936

- IA : RN : VBPerceptron : le code le + simple possible en VB6 & VB .NET :

            https://codes-sources.commentcamarche.net/source/5612

- Perceptron multicouche et martingale pour le loto :

            https://codes-sources.commentcamarche.net/source/2181

- Origine du logiciel Perceptron : mlp en C++ de Sylvain BARTHELEMY : www.sylbarth.com

 

- Exemples de codes sources d'algorithmes de réseaux de neurones variés à adapter en Visual Basic :

            -> www.generation5.org

            -> Karsten Kutza : Neural Networks at your Fingertips :

                        www.geocities.com/CapeCanaveral/1624

- Forum IA en français : www.foorum.fr/news/list_header.asp?group=fr.comp.ia

- FAQ sur les RN en anglais : ftp://ftp.sas.com/pub/neural/FAQ.html

- Algorithmes génétiques (Genetic Algorithms) :

            ftp://ftp.sas.com/pub/neural/FAQ7.html#A_genetic

- Cours théorique sur les RN :

            www.cmla.ens-cachan.fr/Utilisateurs/lacaille/papiers.html#RN

            www.cmla.ens-cachan.fr/Utilisateurs/lacaille/papiers/rn.ps.gz

            (visualisation sous Windows avec GhoSt view : gsview32.exe)