Configuration d'un réseau de neurones

avec un méta-réseau de neurones

 

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.. 3

Instabilité de l'apprentissage. 3

Conclusion sur le méta-apprentissage. 4

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

Projets. 5

Divers. 5

Convergence. 5

Variables supplémentaires. 5

Amélioration des démos. 5

Démos supplémentaires. 5

Versions. 6

Version 1.20 du 01/04/2002. 6

Version 1.10 du 01/02/2002. 6

Version 1.00 du 24/11/2001. 6

Version 0.12 du 01/04/2002. 6

Version 0.11 du 01/02/2002. 6

Version 0.10 du 24/11/2001. 6

Liens. 7

 

 

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 : www.vbfrance.com/projetcommun.asp?ID=20 (en rade jusqu'à nouvel ordre) et www.vbfrance.com/code.aspx?ID=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, mailez-moi 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. 7), vous êtes le bienvenu :

 

Projet IALib du IALab : "IA : le Laboratoire virtuel" (en rade jusqu'à nouvel ordre) :

www.vbfrance.com/projetcommun.asp?ID=20

 

 

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

rMargeNorm : normaliser par exemple entre 0.1 et 0.9 au lieu de 0 et 1 : rMargeNorm = .1 par défaut ;

- 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) ;

 

Amélioration des démos

- Mode OCR : Classement des résultats des caractères reconnus, indication du caractère dans le fichier d'apprentissage, autre démo avec 1 neurone par caractère à reconnaître afin d'éviter d'avoir à traiter une indécision de reconnaissance ; exposer les neurones d'entrée et de sortie via une interface graphique et faire une démo avec des pixels "flous" (led) ;

- Prévision du CAC40 par paliers en sortie : un neurone par palier de 50 ou 100 points (même chose pour les taches solaires : 10 neurones en sortie) ; autres idées intéressantes : prévision de la variation du CAC40 au jour le jour, apprendre une (ou plusieurs) moyenne mobile, combiner les trois entrées : normale / en variation / moyenne mobile avec la fenêtre glissante ;

 

Démos supplémentaires

- Apprentissage et prévision de la conjoncture économique avec en entrée du RN : PIB, taux d'intérêt, indice des prix, de la confiance des ménages, montant des commandes des entreprises, endettement... pour la France, l'Europe et les Etats Unis, et en sortie du RN : indices CAC40, Dow Jones, Nasdaq...

- Dictionnaire : un scrabble avec les lettres dans le désordre en entrée, ou bien une reconnaissance de mots dans lequel il manque une lettre (par exemple présence des seules consonnes, ou bien apprentissage des sigles), ou bien encore apprentissage des n-grammes fréquents (probabilité de succession de groupe de 2, 3 ou 4 lettres dans les mots du dictionnaire) de la langue française ;

- Nombre premiers : recherche d'une suite logique (ça fait un bout de temps que l'humanité la recherche...), idée pour normaliser l'amplitude des nombres entre 0 et 9 : sommes récursives des chiffres du nombre premier ;

- Autres démos : mémoire associative bidirectionnelle : nom <-> n° de tél, mémoire associative de "pattern" : des schémas qui en évoquent d'autre, détection de l'angle de rotation de patterns, tests de QI avec des séries de dessins logiques dont le dernier est à deviner, jeu d'Othello (Reversi), apprentissage de partitions musicales, ou comment apprendre à jouer les accords à partir d'une simple mélodie en entrée et d'un échantillon d'apprentissage... proposez-en d'autres !

 

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

 

Mises à jour : www.vbfrance.com/code.aspx?ID=2936

ainsi que dans le Projet IALib pour les éventuelles versions intermédiaires (en rade jusqu'à nouvel ordre) :

www.vbfrance.com/projetcommun.asp?ID=20

 

Version 1.20 du 01/04/2002

- Correction du bug rRandomiser = Rnd() * (rMax - rMin) + rMin au lieu de : rRandomiser = Rnd() * (rMax - rMin + 1) + rMin et m_aCouches(i).aNeurones(j).rPoid(k) = rRandomiser(0, 1) par défaut ;

- Module spécifique pour traiter le loto : ModLoto.bas ;

- Normalisation indépendante de plusieurs entrées ;

Méta-RN : Configuration automatique du RN XOR dans une plage fixée de plusieurs paramètres, visualisation en 3D du méta-RN ;

- Fonction d'activation linéaire au lieu d'utiliser la fonction Exp() ;

 

Version 1.10 du 01/02/2002

- Correction du bug sur le nombre max. de tentatives (+1) ;

bLireNombreReel : lecture des nombres négatif (oubli corrigé) ;

- Normalisation des entrées : rValMin et rValMax (au lieu de rValBoule1), elle améliore sensiblement l'apprentissage du loto ;

- Mode apprentissage avec une fenêtre glissante (indépendamment du mode loto) : ce mode permet de n'indiquer que les entrées, la sortie étant la ligne d'entrée qui suit la fin de la fenêtre ;

- Gestion du nombre maximum de lignes d'apprentissage et de lignes à prédire : on n'est pas obligé de traiter l'ensemble d'un fichier de données.

- Gestion de la sauvegarde sur disque des poids des neurones (fichier .pds) : si la case à cocher "Réinitialiser" est cochée, l'apprentissage est refait et, en cas de succès, les poids sont mis à jour dans le fichier ; si elle est non cochée, le fichier .pds est rechargé et le test est fait  sans apprentissage ;

- Tracé des courbes prévisionnelles par rapport aux courbes réelles ;

- Calcul des gains au loto ;

- Démos supplémentaires : prévision du CAC40, des taches solaires.

 

Version 1.00 du 24/11/2001

- Mode loto et mode OCR (Optical Character Recognition) : adaptation du fichier d'apprentissage et présentation spécifique des résultats ;

- Calcul du taux de résultat, multiples tentatives d'apprentissage.

 

 

Les versions 0.x sont fonctionnellement identiques au logiciel mlp d'origine en C++ de Sylvain BARTHELEMY : www.sylbarth.com, en local : VersionOriginaleVB\Perceptron.vbp

 

Version 0.12 du 01/04/2002

- Correction du bug RandomEqualREAL :

RandomEqualREAL = Rnd() * (High - Low) + Low  au lieu de :

RandomEqualREAL = Rnd() * (High - Low + 1) + Low

- et optimisation en conséquence par rapport à la version originale :

pLayers(i).pNeurons(j).w(k) = RandomEqualREAL(0, 1)  au lieu de :

pLayers(i).pNeurons(j).w(k) = RandomEqualREAL(-0.5, 0.5)

 

Version 0.11 du 01/02/2002

- Prise en compte de '-' dans read_number

 

Version 0.10 du 24/11/2001

 

 

Liens

 

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

            www.vbfrance.com/code.aspx?ID=2936

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

            www.vbfrance.com/code.aspx?ID=5612

Perceptron multicouche et martingale pour le loto :

            www.vbfrance.com/code.aspx?ID=2181

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

- Projet IALib du IALab : "IA : le Laboratoire virtuel" (en rade jusqu'à nouvel ordre) :

            www.vbfrance.com/projetcommun.asp?ID=20

- 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

- Le méta-RN ressemble aux 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)

 

Patrice Dargenton : patrice.dargenton@free.fr

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