Module de Reconnaissance de Formes, EFREI, 2006-2007, Benoît Decoux Reconnaissance des Formes Travaux Pratiques, 2e séance /4 • Carte auto-organisatrice de Kohonen • Rétro-propagation du gradient Modalités de déroulement séance en salle Linux compte-rendu à remettre à l'issue de la séance site web, documents et programmes utiles : - Site RDF : http://www-rdf.efrei.fr - Support de cours, - Corrigés des TP 2001-2002 n° 3 et 2003-2004 n°2 (rubrique Module EFREI → Documents utiles du site RDF), - Projet C++ "retro.zip" (adaptation du programme-source "libneural", disponible dans la rubrique Programmes du site) Objectif de la séance • • Programmation de la rétropropagation du gradient à partir des sources de "libneural" ; il s’agit d’un implémentation simple de la version de base de la rétro-propagation du gradient, permettant une ré-utilisation rapide) ; Etude de différents paramètres du réseau et de l’algorithme, pour 3 fichiers de données correspondant à des caractères ou des chiffres manuscrits : caract_holland.don : caractéristiques extraites d’images de caractères manuscrits (hollandais) ; chiffres.don : images de taille 28x28 pixels, représentant des caractères manuscrits, normalisés en taille et en position optdigits.don. : caractéristiques extraites d’images de caractères manuscrits. Exercices I) "Carte auto-organisatrice de Kohonen appliquée à la classification" Il a été vu en cours que les cartes auto-organisatrices étaient en général appliquées à l’analyse de données, dans le but de détecter des regroupements (ou "clusters"). On peut cependant l’adapter facilement à la classification. I.1) Appliquer l’algorithme de base de Kohonen aux données du fichier "chiffres.don". Commenter les résultats (on pourra s’aider pour cela du petit document "SOM.pdf", placé dans la rubrique "Documents" du site). Tester quelques valeurs différentes des paramètres de l’algorithme (voisinage, taux d’apprentissage, etc). I.2) Appliquer la version supervisée de l’algorithme aux même données, avec les valeurs des paramètres par défaut puis quelques autres valeurs de paramètres. Indiquer les taux de reconnaissance obtenus à chaque fois. 1 Module de Reconnaissance de Formes, EFREI, 2006-2007, Benoît Decoux II) "Rétro-propagation du gradient" 1) Analyse de "libneural" Analyser rapidement les sources de "libneural" et donner la structure du réseau de neurones qui y est implémenté (nombre de couches, nombre de neurones par couche, fonction de transfert des neurones, etc). Etablir quelques liens avec l'algorithme d'apprentissage en mode instantané, et les équations de la rétropropagation (cf résumé de cours). Décrire les applications traitées dans le programme original et le programme ajouté ("retro.cpp"). 2) Algorithme de base appliqué à données correspondant à des lettres ou chiffres manuscrits : fichiers "caract_holland.don", "optdigits.don" et "chiffres.don" On cherche à déterminer les paramètres adéquats du réseau et de l’algorithme pour obtenir les meilleurs résultats de classification possible. Ces paramètres sont : nombre de neurones dans la couche cachée (« c » dans la ligne de commande) taux d’apprentissage (« a ») nombre d’itérations d’apprentissage (« i ») 2.1) Exécuter la méthode en prenant les paramètres suivant : a=0,05, c=5 et i=100000, avec les trois fichiers de données. Utiliser le fichier de résultats généré par le programme pour effectuer un affichage graphique de l’évolution des taux de reconnaissance sur la base d’apprentissage et sur la base de test, sous Scilab (on pourra s’inspirer pour cela de l’affichage réalisé dans le corrigé du TP n°2 2003-2004). On lance le programme avec les paramètres demandés dans la ligne de commande : ./rpg ../DATA/caract_holland.don c=5 i=100000 a=0,05 ./rpg ../DATA/chiffres.don c=5 i=100000 a=0,05 ./rpg ../DATA/optdigits.don c=5 i=100000 a=0,05 Pour obtenir l’affichage graphique des résultats, on peut utiliser le petit programme suivant : // Affichage graphique du taux de reconnaissance global en fonction des iterations d'apprentissage x=1:nb_cycles_app xbasc(); xgrid(1); plot(taux_global(x)); xtitle("Fonctions radiales de base","Episodes","Taux de reconnaissance global"); Voici les résultats obtenus : 2.2) Pour rechercher des valeurs adéquates des paramètres, il faut effectuer un ensemble de tests, en automatisant la procédure. Les paramètres de l’algorithme pouvant être entrés par la ligne de commande, on peut utiliser un fichier texte (qui sera rendu exécutable) dans lequel seront copiées les différentes commandes à lancer. Tester de cette manière quelques valeurs différentes du taux d’apprentissage et du nombre de neurones cachés, toujours pour les mêmes fichiers de données. 2 Module de Reconnaissance de Formes, EFREI, 2006-2007, Benoît Decoux On place les commandes dans un fichier que l’on appellera par exemple « retro », sans extension, que l’on rend exécutable par exemple avec la commande : chmod 777 retro On choisit les valeurs suivantes pour les paramètres : c=5, 10, 15, 20, 25 i=100000 a=0,01 ; 0,05 ; 0,2 On génère un fichier de commandes, par exemple pour Optdigits : ./rpg ../DATA/optdigits.don c=5 i=100000 a=0,01 ./rpg ../DATA/optdigits.don c=10 i=100000 a=0,01 ./rpg ../DATA/optdigits.don c=15 i=100000 a=0,01 ./rpg ../DATA/optdigits.don c=20 i=100000 a=0,01 ./rpg ../DATA/optdigits.don c=25 i=100000 a=0,01 ./rpg ../DATA/optdigits.don c=5 i=100000 a=0,05 ./rpg ../DATA/optdigits.don c=10 i=100000 a=0,05 ./rpg ../DATA/optdigits.don c=15 i=100000 a=0,05 ./rpg ../DATA/optdigits.don c=20 i=100000 a=0,05 ./rpg ../DATA/optdigits.don c=25 i=100000 a=0,05 ./rpg ../DATA/optdigits.don c=5 i=100000 a=0,2 ./rpg ../DATA/optdigits.don c=10 i=100000 a=0,2 ./rpg ../DATA/optdigits.don c=15 i=100000 a=0,2 ./rpg ../DATA/optdigits.don c=20 i=100000 a=0,2 ./rpg ../DATA/optdigits.don c=25 i=100000 a=0,2 puis le fichier équivalent pour caract_holland.don et chiffres.don. Les meilleurs résultats obtenus sont les suivants : Résultats : chiffres : 97,33% (30 NCC ; alpha=0,3 ; 100000 IA) caract : 84% (80 NCC ; alpha=0,3 ; 1000000 IA) iris : 96,7% (5 NCC ; alpha=0,3 ; 100000 IA) wine : 98,6% (25 NCC ; alpha=0,3 ; 100000 IA) 2.3) Interpréter ces courbes et tenter de mettre en évidence l'apprentissage par cœur (qui se manifeste par une amélioration initiale du taux de reconnaissance sur les données de test, suivie par une dégradation). L’apprentissage par cœur se manifeste par un taux de reconnaissance sur les données d’apprentissage tendant vers 100%, et un taux sur les données de test se dégradant au fur et à mesure des itérations d’apprentissage, après une progression initiale. 2.4) Modifier le programme pour tester l'apprentissage en mode différé (off-line) : cumul de l'erreur et modification des poids après présentation de toute la base. On pourra s’inspirer pour cela de la méthode utilisée dans le programme compet.c pour sélectionner tous les vecteurs de la liste d’apprentissage ou de la liste de test une seule fois. //Recherche d'un vecteur représentatif pour chaque classe 3 Module de Reconnaissance de Formes, EFREI, 2006-2007, Benoît Decoux // (obtention par la moyenne de 'nb_ex_rep' vecteurs de chaque classe) nb_vec_tmp=nb_vec; for(j=0 ; j<nb_cl ; j++) { for(k=0 ; k<nb_vec_rep ; k++) { do num=(int)(nb_vec*alea_0a1()); while((vec2+num)->n_cl != j+1); //jusqu'à ce qu'on tombe sur un vecteur de cette classe calcul_moyenne(vec2+num, k+1, &((cl+j)->repr)); retirer_vec_liste(vec2, &nb_vec_tmp, num); } } 3) Modification de la règle d’apprentissage Il existe une méthode permettant d’accélérer la convergence de l’apprentissage, consistant à ajouter un terme de lissage appelé « moment » dans la règle d’apprentissage. Ce terme permet d’augmenter le taux d’apprentissage sans provoquer d’oscillations. Il est défini par : η . ∆wij (n − 1) où n est l’indice de l’itération d’apprentissage actuelle (et donc n-1 l’itération précédente). La variation des poids ne dépend donc plus que du gradient mais également de la variation précédente. Implémenter cette méthode et mettre l’accélération de l’apprentissage en évidence, en utilisant un ensemble de paramètres judicieusement choisi. 4