Réseau SOM de Kohonen
Transcription
Réseau SOM de Kohonen
168 Les réseaux de neurones compétitifs T RAVAUX P RATIQUES Chapitre 4 Réseau SOM de Kohonen Le réseau SOM1, Self Organizing Map, de Kohonen effectue la classification automatique de données ; cependant, à la différence des autres classificateurs, ce réseau produit une « carte » qui permet de visualiser la position relative des classes. Les données manipulées par le SOM sont de type réel, et non pas seulement binaire comme c’est le cas avec des réseaux comme Hopfield et ART1 que nous étudierons dans des chapitres ultérieurs. Plusieurs applications pratiques de ce réseau ont été proposées. Cependant, il est utilisé le plus souvent pour réduire la dimensionnalité des données, ou pour mettre en évidence la structure globale des données. SIMULATIONS MATLAB Ce TP et quelques autres dans d’autres chapitres utilisent l’approche matricielle pour la simulation des réseaux de neurones au moyen du progiciel MATLAB de la compagnie MathWorks. Une brève description de cette catégorie de simulateurs apparaît à la section 1.7.2 du chapitre 1, Le paradigme des réseaux de neurones artificiels. Les programmes et données nécessaires pour le TP se retrouvent sur le site Internet du livre, sous le sous-répertoire général : Travaux pratiques/TP4 Toutes les données et programmes nécessaires pour la réalisation du TP peuvent être téléchargés en transférant le fichier compressé tp4.zip. Dans votre environnement de travail, les variables d’environnement sont initialisées en tapant tp4. Dans l’environnement de simulation MATLAB, de l’information sur n’importe quelle fonction peut être obtenue en tapant sur la ligne de commande : help <nom de la fonction>. La liste des fonctions et données nécessaires pour la réalisation du TP s’obtient en tapant : help tp4. 1. L’acronyme SOFM, Self Organizing Feature Maps, est tout à fait équivalent et est autant utilisé. Travaux Pratiques 169 Un premier exemple : une carte linéaire UN PREMIER EXEMPLE : UNE CARTE LINÉAIRE Nous tenterons de classifier un ensemble de données simples avec un réseau ayant trois neurones de sortie disposés linéairement : y2 y1 y3 compétition entrée x1 Figure 4.a x2 Carte auto-organisatrice linéaire de Kohonen. Manipulations 1. Chargez vos données en mémoire avec load samples1. Vous aurez en mémoire 16 échantillons à 2 dimensions; chaque ligne de la matrice de données data correspond à un individu. 2. Visualisez vos données avec :scatter(data(:,1),data(:,2)) 3. Définissez la taille du réseau :mapsize = [1 3]; et la fonction d’apprentissage :alpha = geometric (1,.9,50); 4. Les données sont classifiées par le réseau SOM : [c,p] = som(data,mapsize, ’alpha’,alpha,’protomap’,1); Dans la figure qui s’ouvre, vous observez l’évolution des poids durant l’apprentissage. Chaque cercle bleu correspond à un neurone de la couche de sortie, alors que les coordonnées (x,y) des cercles indiquent les valeurs des poids associés à ces neurones. 170 Les réseaux de neurones compétitifs Chapitre 4 Comme pour beaucoup d’autres classificateurs, chaque neurone de sortie représente une classe. Le prototype de cette classe correspond simplement aux poids rattachés à ce neurone. 5. La disposition des prototypes parmi l’ensemble des points d’entrée peut être observée comme précédemment grâce à la fonction scatter : scatter([data(:,1);p(:,1)],[data(:,2);p(:,2)], 50,co) où le paramètre « 50 » spécifie la grosseur des points et où « co » est un vecteur qui indique la couleur des points affichés : rouge pour les vecteurs prototypes, bleu pour les autres. Vous remarquerez une similitude entre les nuages des individus et la position des prototypes. Ce n’est pas un hasard : puisqu’un prototype représente certains individus dans une population, idéalement ce prototype devrait donc se placer quelque part au milieu du nuage de points qu’il désigne. La variable de sortie c indique la classe d’appartenance respective des individus, selon leur ordre d’apparition dans la matrice de données data. Par exemple, c(1) indique la classe d’appartenance du premier individu, ie data(1,:). Vérifiez quels individus appartiennent à quelle classe, puis calculez le centre de gravité des trois classes. Par exemple, pour la classe 1 : index=find(c==1); centroid=mean(data(index,:)) ⇒ Comparez le centre de gravité des classes avec leur prototype qui apparaît dans la variable de sortie p. Par exemple, le prototype de la classe 1 correspond à p(1,:); , etc. Le cas échéant, comparez ce résultat aux prototypes appris par d’autres types de classificateur (e.g. ART1). LA RÉDUCTION DE DIMENSION Considérons maintenant une population de six personnes, dans laquelle chaque individu est caractérisé par trois mesures, certaines quantitatives et d’autres qualitatives : Travaux Pratiques 171 La réduction de dimension âge poids occupation 10 40 1 (étudiant) 20 58 2 (travailleur) 30 63 3 (technicien) 40 65 4 (professionnel) 50 67 5 (cadre) 60 60 6 (retraité) Tableau 4.a Population de 6 individus Manipulations 1. Chargez vos données en mémoire avec load persons. Vous aurez alors en mémoire la matrice du tableau 4.a dans la variable persons. 2. Faites classifier ces données par un réseau de 8 neurones linéaires : mapsize = [1 8]; [c, p, pMap] = som (persons, mapsize, ’alpha’, alpha); 3. Vérifiez sur quel neurone est projeté chaque individu : trouvez sa classe d’appartenance dans c, puis recherchez la position (x, y) du neurone associé à cette classe à la cième ligne de la matrice pMap. Indiquez ensuite la position de chaque individu sur la couche de sortie du réseau : Prenez le repère indiqué à gauche comme origine du système de coordonnées. N’importe quelle autre origine serait aussi valable. Une autre façon de présenter le réseau SOM serait de dire qu’il projette un domaine d’entrée dans un sous-espace de dimension inférieure ; autrement dit, le réseau réduit la dimensionnalité des données. Dans cet exemple, les données passent de 3 dimensions en entrée à une seule dimension en sortie. Ce n’est pas une 172 Les réseaux de neurones compétitifs Chapitre 4 simple classification, puisque les neurones de sortie ne sont pas assignés arbitrairement. Cette réduction de dimension peut servir à diminuer la complexité des données brutes en vue d’un traitement ultérieur, ou à visualiser des données à plus de 3 dimensions. Rien n’oblige par ailleurs à ramener les données seulement dans un espace 1D, 2D ou 3D. Par exemple, on pourrait fort bien projeter un espace de 20 dimensions dans un sous-espace à 5 dimensions; la visualisation graphique des résultats serait impossible, mais le réseau remplirait encore très bien sa fonction. LA PRÉSERVATION TOPOLOGIQUE Un aspect critique de ce genre d’algorithme est d’introduire le moins de distorsion possible lors de la projection. À défaut de pouvoir préserver exactement les distances dans l’espace de sortie, on veut au moins maintenir les relations de voisinage. Manipulations 1. Avec load qdist, chargez en mémoire les données suivantes qui représentent les distances routières entre six villes du Québec (Canada) : Chic. Mtl. Québec Sherb. Trois-Riv. Rouyn 0 464 212 451 367 831 Montréal 464 0 267 147 142 638 Québec 212 267 0 241 135 882 Sherbrooke 451 147 241 0 158 782 Trois-Rivières 367 142 135 158 0 748 Rouyn 831 638 882 782 748 0 Chicoutimi Tableau 4.b Distances routières en km de six villes du Québec. 2. Faites classifier ces données par un réseau SOM à 2 dimensions : mapsize = [3 3] ; Travaux Pratiques La préservation topologique 173 alpha = geometric (1,.99,50) ; [c,p,pMap] = som(qdist, mapsize, ’alpha’, alpha); 3. La figure 4.b indique la carte de Kohonen (les neuf neurones de la couche de compétition) ainsi qu’une partie de la carte géographique du Québec où apparaissent les six villes. Déterminez, sur la carte de Kohonen, quelle ville est associée à quel neurone : marquez d’abord la position de chaque classe sur la couche de sortie à l’aide des variables c et pMap. Indiquez finalement les villes sur la carte en vérifiant la classe d’appartenance des données d’entrée. Comme d’habitude, les données correspondent aux lignes de la matrice qdist. Figure 4.b (a) (b) Carte de Kohonen pour représenter des villes. (a) Carte 3x3 de Kohonen (9 neurones). (b) Carte géographique montrant les 6 villes. ⇒ En comparant la configuration de la carte de Kohonen et la carte géographique, voyez-vous une affinité entre l’emplacement réel des villes et leur disposition sur la carte de Kohonen? Au besoin, représentez les villes de la carte géographique par un graphe. 4. Calculez la distance euclidienne entre tous les individus : euclid (qdist, qdist) Notez que la distance euclidienne entre deux individus ne correspond pas à la distance routière entre les deux villes correspondantes ! Sur la carte de Kohonen, indiquez les distances euclidiennes entre quelques individus. ⇒ Les distances sont-elles respectées sur la carte de Kohonen? Quel que soit l’algorithme utilisé, il est impossible de préserver les distances si on élimine certaines dimensions. Cependant, le SOM tente de préserver les relations de voisinage entre les 174 Les réseaux de neurones compétitifs Chapitre 4 classes; cette caractéristique le distingue particulièrement des autres classificateurs, qui assignent arbitrairement les classes aux neurones de sortie. LE PRINCIPE DE VOISINAGE Chaque neurone de la couche d’entrée est relié à tous les neurones de la couche de sortie. Durant l’apprentissage, le réseau modifie peu à peu les poids qui les relient les uns aux autres de sorte que ces poids correspondent aux prototypes des classes. En opération, le réseau calcule alors la distance euclidienne entre le vecteur d’entrée et tous les prototypes, et déclare gagnant le neurone de sortie dont le prototype est le plus semblable à ce vecteur1 . En deux mots, Kohonen est un classificateur à distance minimale. Détail crucial par contre, l’apprentissage des vecteurs d’entrée se fait sur un voisinage : les poids du neurone gagnant seront les plus modifiés, mais les poids des neurones voisins seront aussi un peu modifiés, selon leur distance par rapport au neurone gagnant. Manipulations 1. Examinons d’une part la pondération radiale, qui détermine (entre autres) la correction apportée aux poids durant l’apprentissage, en fonction de la distance par rapport au neurone gagnant : figure ; r = -3:.1:3 ; plot (r, exp(-r .^2)) Au facteur d’échelle près, il s’agit évidemment d’une gaussienne, avec 2 σ = ------- . Ceci indique que les poids du neurone gagnant (situé à x = 0 ) 2 seront modifiés d’un facteur de 1, que les poids des neurones situés dans un –1 rayon de 1 autour du neurone gagnant (à x = ± 1 ) seront modifiés de e , etc. 1. Il existe une variante de Kohonen qui calcule plutôt le produit scalaire entre le vecteur d’entrée et les prototypes. Le résultat final est le même si le vecteur d’entrée et les prototypes sont normalisés (amplitude unitaire des vecteurs). Travaux Pratiques Le principe de voisinage 175 2. Voyons si on retrouve cette décroissance de la réponse sur la carte de Kohonen. Pour la simplicité, nous reprendrons les données du premier exemple, mais sur une carte élargie à 1 × 10 : alpha = geometric (1, .9, 500) ; mapsize = [1 10] ; [c, p, pMap, rMap] = som (data, mapsize, ’alpha’, alpha) ; La variable rMap contient la réponse des 10 neurones après apprentissage pour chacun des 16 échantillons. Autrement dit, si on fournit le premier échantillon data(1,:) au réseau, on obtiendra en sortie de chaque neurone les valeurs indiquées dans rMap{1} 3. Faites tracer la réponse du réseau pour quelques vecteurs d’entrée (d’une fois à l’autre, changez seulement la valeur entre accolades) : plot (1:10, rMap{1}) L’abscisse de la figure indique la position de chaque neurone sur la carte de Kohonen, et l’ordonnée leur réponse respective pour le vecteur d’entrée. ⇒ Où est situé le neurone gagnant pour ce vecteur ? Pour confirmation, consultez la classe d’appartenance du vecteur d’entrée dans la variable c, et l’endroit où est projeté cette classe sur la carte dans la variable pMap. ⇒ Pourquoi la courbe est-elle inversée? Vous remarquerez que la courbe de réponse n’est pas exactement une gaussienne (inversée), et qu’elle présente même certains artefacts. Plusieurs facteurs peuvent être en cause, dont la taille de la carte (encore petite pour bien discrétiser la courbe), le nombre d’itérations, la fonction d’apprentissage alpha, etc. L’important, c’est de voir que la forme générale de la gaussienne est là, c’est-à-dire que la réponse du réseau n’est jamais strictement locale. 4. Maintenant que vous avez compris ce que fait Kohonen, traduisons nos courbes de réponse sous une forme plus expressive : 176 Les réseaux de neurones compétitifs Chapitre 4 [c, p, pMap, rMap] = som (data, mapsize, ’alpha’, alpha, ’datamap’, 1) ; La nouvelle fenêtre qui s’ouvre illustre les réponses du réseau pour tous les vecteurs d’entrée, de la même façon que vous l’avez fait auparavant, mais selon une échelle de couleur cette fois. L’échelle à droite de la figure indique la distance mesurée entre les poids du neurone (le prototype) et le vecteur d’entrée. LE RAYON D’APPRENTISSAGE Puisqu’il s’agit d’une exponentielle inverse, la fonction de pondération radiale n’est jamais nulle, et possède un rayon d’action infini. Lors de l’apprentissage, les neurones de la carte seront donc tous affectés par les vecteurs d’entrée, même s’ils sont très éloignés du neurone gagnant. Différentes considérations inspirées des neurones biologiques incitent à croire par contre que la zone d’influence devrait diminuer progressivement lors de l’apprentissage. Nous tenterons de vérifier la pertinence de cet argument. Manipulations Cette section et la suivante du TP utilisent des données qui ont été proposées par (Ritter, & Kohonen, 1989)1 pour illustrer l’algorithme SOM. Les données représentent les caractéristiques de certains animaux, codées sur des vecteurs binaires à 13 bits. Le tableau 4.c présente le code utilisé. Caractéristique Position des bits Taille de l’animal 1-3 Valeurs possibles 100 petit 010 moyen 001 gros Tableau 4.c Vecteur des caractéristiques de certains animaux. 1. Ritter, H. & Kohonen, T. (1989). Self-organizing semantic maps. Biological Cybernetics, 61, 241-254. Travaux Pratiques 177 Le rayon d’apprentissage Caractéristique Position des bits Valeurs possibles 1XXXXX deux pattes X1XXXX quatre pattes Morphologie 4-9 XX1XXX poil XXX1XX sabots XXXX1X crinière XXXXX1 plumes Comportement 10-13 1XXX aime chasser X1XX aime courir XX1X aime voler XXX1 aime nager Tableau 4.c Vecteur des caractéristiques de certains animaux. La matrice animals, dans le fichier du même nom, contient dans l’ordre les 16 individus-animaux suivants : 1. Oie 1001000010011 2. Cheval 0010111100100 3. Chien 0100110000100 4. Canard 1001000010001 5. Poule 1001000010000 6. Lion 0010110101100 7. Vache 0010111000000 8. Colombe 1001000010010 9. Tigre 0010110001100 10. Renard 0100110001000 Tableau 4.d Matrice animals.mat 178 Les réseaux de neurones compétitifs 11. Zèbre 0010111100100 12. Hibou 1001000011010 13. Loup 0100110101100 14. Aigle 0101000011010 15. Chat 1000110001000 16. Épervier 1001000011010 Chapitre 4 Tableau 4.d Matrice animals.mat 1. Chargez de nouvelles données en mémoire avec load animals. 2. Effectuez une première classification de ces données sur une carte de 10x10 : alpha = geometric (1, .9, 500) ; mapsize = [10 10] ; som (animals, mapsize, ’alpha’, alpha, ’datamap’, 1, ’datatags’, names ); Avant de poursuivre notre expérience, prenons le temps d’examiner les cartes de réponses pour mieux apprécier l’utilité de la carte de Kohonen. Par exemple : - Dans quelle partie de la carte sont projetés les oiseaux ? - Y a-t-il dans cette région de la carte d’autres animaux qui ne sont pas des oiseaux ? - Voyez-vous des sous-groupes ? Au sein des oiseaux, cherchez par exemple où sont projetés les oiseaux de basse-cour et les oiseaux de proie. - Sur une feuille de papier, divisez la carte en 3 ou 4 régions principales, puis identifiez quels animaux sont projetés dans quelles régions. Voyezvous une quelconque logique dans la disposition des classes sur la carte, ou bien la répartition des classes est-elle complètement aléatoire ? Travaux Pratiques Le rayon d’apprentissage 179 On observe ici l’élément central de ce réseau, qu’on appelle en anglais Self-Organizing Feature Map (SOFM). La disposition des classes sur une carte de Kohonen n’est jamais aléatoire (si l’apprentissage est suffisant) : elle est aménagée en fonction des caractéristiques existantes dans les données. La proximité physique des classes sur la carte exprime aussi une proximité sémantique des données. Bien que le réseau SOM soit un classificateur automatique, la carte de Kohonen est souvent plus intéressante que les classes identifiées par le réseau ! De par sa propriété de préservation topologique, la carte aide à l’interprétation des données, et à dégager la structure globale des données. Continuons maintenant notre expérience sur le problème du rayon d’apprentissage. 3. Prenons le cas extrême : nous indiquerons au réseau de mettre à jour seulement les poids du neurone gagnant. Il suffit d’indiquer un rayon d’apprentissage toujours nul : radius=zeros(1,500); 4. Détail technique : pour que la prochaine simulation n’efface pas la carte actuelle, faites : set (gcf, ’HandleVisibility’, ’off’) 5. Refaites finalement une classification des données avec ces contraintes : som (animals, mapsize, ’alpha’, alpha, ’radius’, radius, ’datamap’, 1 , ’datatags’, names) ; ⇒ Comment se compare la nouvelle carte avec l’ancienne? Les classes sontelles projetées au même endroit? La carte est-elle aussi éloquente? Pour ce cas, la carte est semblable à celle qu’on obtiendrait avec un réseau compétitif quelconque ; seule différence avec ce genre de réseau, la topologie est encore préservée, bien que moins évidente. 180 Les réseaux de neurones compétitifs Chapitre 4 Pour résumer la question, le rayon d’apprentissage n’est rien d’autre qu’un seuil appliqué sur la gaussienne de pondération radiale. Compte tenu des observations biologiques, le rayon devrait être large au début de l’apprentissage, pour permettre un ordonnancement global de la carte, puis diminuer progressivement pour raffiner les connaissances locales : etc. r(t0 ) r(t 1) r(t2 ) Dans l’implémentation fournie en laboratoire, le rayon d’apprentissage r(t) est à décroissance linéaire, mais il ne s’agit là que d’une avenue par défaut, qui ne prétend pas être optimale ; certains auteurs suggèrent par exemple une décroissance en escalier, mais il n’y a pas de solution unique. Il peut aussi être utile de contrôler l’étalement horizontal de la courbe de pondération radiale. LA FONCTION D’APPRENTISSAGE Il nous reste un dernier phénomène à étudier dans cette introduction, soit la fonction d’apprentissage (le paramètre alpha que vous utilisez depuis le début du TP). Vous savez que de nombreux réseaux neuroniques utilisent une constante d’apprentissage pour déterminer l’ampleur de la correction à effectuer sur les poids. Ce principe apparaît aussi avec le réseau de Kohonen, sauf que cette « constante » varie dans le temps; d’où le nom de fonction d’apprentissage. Travaux Pratiques 181 La fonction d’apprentissage La fonction d’apprentissage α(t) contrôle l’amplitude verticale de la courbe de pondération radiale. Par exemple, pour une fonction d’apprentissage linéaire, on aurait : α(t) etc. t0 t1 t2 Manipulations 1. Vérifions l’effet de la fonction d’apprentissage sur la carte de Kohonen. Nous utiliserons la fonction par défaut de l’implémentation, soit une fonction linéaire : som (animals, mapsize, ’epochs’, 500, ’datamap’,1,’datatags’, names); En l’absence d’un paramètre d’entrée alpha ou radius, rien n’indique à la fonction le nombre d’époques souhaitées ; d’où l’introduction du paramètre epochs. Pour mieux comparer le résultat avec l’ancienne carte, nous gardons le même nombre d’époques qu’auparavant, soit 500. ⇒ Comment se compare la nouvelle carte avec l’ancienne? La topologie estelle préservée? Comment interprétez-vous ce que vous observez? Pour ce cas, le réseau est moins « nuancé » dans son jugement. Un avantage possible de ce genre d’apprentissage serait d’obtenir des classes et sous-classes plus strictes, moins « fuzzy ». Comme pour la fonction qui contrôle la décroissance du rayon d’apprentissage (la fonction de seuillage radial), il n’y a pas de règle absolue pour déterminer la meilleure fonction d’apprentissage. Plusieurs auteurs mentionnent que la fonction d’apprentissage devrait être élevée au début, décroître ensuite, puis demeurer longtemps à une valeur faible. Il s’agit seulement d’une règle empirique, et qui reprend le principe d’une classification grossière au début de l’apprentissage, puis d’une classifi- 182 Les réseaux de neurones compétitifs Chapitre 4 cation plus subtile lorsque les principaux éléments sont placés sur la carte. 2. Pour faire tracer la fonction d’apprentissage géométrique que vous avez utilisée durant ce TP : figure ; plot (1:length(alpha), alpha) UN DERNIER ESSAI Pour le plaisir intellectuel (si vous ne voyez pas de contradiction dans cette expression), vous allez tracer la carte de Kohonen de chiffres manuscrits. Nous aurons d’ailleurs l’opportunité d’expérimenter la classification de ces chiffres manuscrits avec divers modèles de réseaux de neurones afin d’illustrer les capacités de classification de ces divers réseaux. 1. Chargez la base de chiffres manuscrits : load digits 2. Les vecteurs de données étant constitués de 100 bits, il est suggéré d’observer la carte de Kohonen seulement pour les chiffres 0, 1 et 2 afin de réduire le temps de calcul : d=[d0;d1;d2]; mapsize=[10 10]; som (d, mapsize, ’alpha’, alpha, ’datamap’, 1) ; ⇒ Que pensez-vous de la dispersion de vos données ? Voyez-vous pourquoi certains individus d’une classe convergent vers le prototype d’une autre classe? Comment utiliseriez-vous la carte de Kohonen dans une application de reconnaissance de caractères manuscrits?