dimanche 1 juin 2014

TD 3



Dans le TD précédent nous avons modifié notre protocole de test, pour avoir une mesure plus réaliste de l'erreur commise par notre réseau de neurones. Le protocole d'apprentissage lui est resté inchangé depuis le premier TD. Nous allons maintenant améliorer le protocole d'apprentissage. Nous seront alors en mesure de tester correctement différentes topologies de réseau, pour trouver la plus adaptée à un problème donné.

Nous verrons aussi un exemple d'apprentissage non-supervisé, par réseaux de neurones de Kohonen.

Apprentissage supervisé (suite et fin)
  1. Revenez sur votre dernier code d'apprentissage. Constatez que la condition d'arrêt de l'apprentissage est mauvaise car elle ne mesure absolument pas la capacité de généralisation du réseau. Il s'agit de la capacité de répondre correctement à une donné nouvelle (c'est à dire non vue dans la base d'apprentissage).Chargez le nouveau programme "train.c" attaché à cet article, et essayer en lisant le code (et en se référant au manuel de FANN) de comprendre ce qu'il fait de différent par rapport au programme d'apprentissage utilisé depuis le TD1.
  2. Maintenant que vous avez compris à quoi il sert, et comment s'en servir. Utilisez le avec la base d'apprentissage et de test que vous avez constitué lors du TD2, sur le système de détection de cellules cancéreuse. Vous avez pu constater que cet apprentissage génère plusieurs fichiers de réseau (un à chaque étape de l'apprentissage). Sélectionnez le fichier réseau correspondant à l'erreur la plus basse, je parle l'erreur mesurée sur la base de test, celle qui mesure la capacité de généralisation du réseau. Avec ce fichier de réseau produisez la prédiction sur les données de test, ainsi que la matrice de confusion correspondante. Pour cela utilisez les programmes qui vous ont été donnés au TD 1 .
  1. Maintenant que vous disposez d'un protocole d'apprentissage correct modifiez la topologie de votre réseau : nombre de neurones cachés, nombre de couches (ainsi que le nombre de neurones pour ces couches), et essayez d'avoir la meilleur matrice de confusion possible. Pour avoir un moyen de comparaison explicite, choisissez (à chaque fois) un seuil de décision qui amène à un taux de faux négatif (c'est à dire les gens pour qui on ne détecte pas de cancer, mais qui en on bien un) proche de 0. Ainsi, vous pourrez comparer vos différentes tentatives sur une valeur unique : le nombre de faux positifs correspondant au seuil choisit. Testez au moins deux trois types différents de topologies de réseau. De même vous pouvez tester différentes valeur de paramètre d'apprentissage, et leur impact sur le déroulement de l'apprentissage, ainsi que sur le résultat final. Il est important que vous fassiez cela consciencieusement sur cet exemple où je pourrais vous guider et vous conseiller. Vous aurez à faire ce tâtonnement en autonome pour votre TP.
  2. Vous avez peut être constaté dans vos expériences précédentes, que l'erreur affichée lors de l'apprentissage (même mesure sur la base de test) est fort différente de l'erreur de classification obtenue au final. Pourquoi ? ... Vous comprenez maintenant pourquoi il est inutile, voir dangereux, de viser une erreur d'apprentissage à 0, et qu'il vaut mieux tolérer un certain niveau d'erreur dans l'apprentissage.

Apprentissage non-supervisé

Téléchargez et installez (= desarchivez) la dernière version de la plateforme Processing (choisissez "linux 32 bits"). Dans le terminal, allez dans le répertoire de Processing puis tapez :
./processing
pour lancer la plateforme. Ensuite, suivez les menu "File->Sketchbook ->kohonen. Vous devez avoir téléchargé au préalable le code des cartes de Kohonen (attaché à cet article, voir en bas de page). Nous allons maintenant voir un exemple d'apprentissage non-supervisé, appelés réseaux de neurones de Kohonen ou "cartes auto-organisatrices" . Ce type d'apprentissage est très intéressant car il ne nécessite pas d'avoir l'information de la valeur attendue en sortie. Si on dispose des informations de sortie, un apprentissage supervisé donne, normalement, de meilleurs résultats de classification. L'apprentissage non supervisé à quand même des avantages très intéressants :
  • L'information de "sortie" est souvent la plus coûteuse à obtenir, s'en passer permet donc de faire des économie importantes, voir même de rendre un apprentissage possible là où il serait impossible en apprentissage supervisé.
  • Ne pas présupposer la classification au préalable, permet de découvrir des choses éventuellement non soupçonnées au départ. C'est pour cette raison que cette technique est très souvent utilisée en fouille de données.
    • Les techniques non-supervisée, et supervisées peuvent s'utiliser de concert dans un projet. L'apprentissage non-supervisé permettre de simplifier les données d'entrée quand elle sont de trop grande dimension. Typiquement c'est la sortie du réseau de Kohonen qui se retrouve être à l'entré d'un réseau "classique" faisant de l'apprentissage supervisé. L'avantage est que dans ce cas on a besoin de moins de données complètes (entrées+sorties) pour réaliser un apprentissage de qualité.
    Pour comprendre comment ça marche, il faut considérer que chaque neurone de réseau à N entrées (donc définie par le problème) et une seule sortie. On peut donc voir cet algorithme comme la constitution automatique d'un ensemble limité vecteurs essayant, au mieux, de représenter les données. La taille de la carte est fixé à l'avance sans forcément connaitre réellement le nombre de classes qui constituent les données. C'est donc après l'apprentissage, qu'on essayera d'identifier les classes qu'a appris le réseau. Chaque neurone va essayer de se spécialiser pour reconnaître un sous groupe des donnés qui présente une certaine homogénéité. Pour chaque neurone il suffit donc de faire un échantillonnage de données qui y sont associées et identifier la classe prépondérante pour pouvoir faire une prédiction. Nous allons reprendre les données originelles de la détection de cellules cancéreuses,et les mettre au bon format pour les utiliser avec le programme (en langage Processing) attaché à cet article. Ces données contiennent l'information de sortie (l'état cancéreux ou non des cellules analysées), mais nous allons garder à l'esprit que cette information n'est pas utilisée par l'algorithme de Kohonen. Cette information est juste restituée lors des différents affichages. Le format demandé par le programme de Kohonen est le suivant : une donnée par ligne, si la ligne commence par 'L' ça veux dire que l'on connait l'information de sortie (la classe d'appartenance des données), et cette information est donné par le nombre entier qui suit. Ensuite c'est directement les valeurs d'entrée simplement séparées par un espace. 
    L 0 5 1 1 1 2 1 3 1 1
    L 0 5 4 4 5 7 10 3 2 1
    L 0 3 1 1 1 2 2 3 1 1
    L 0 6 8 8 1 3 4 3 7 1
    L 0 4 1 1 3 2 1 3 1 1
    L 1 8 10 10 8 7 10 9 7 1
    L 0 1 1 1 1 2 10 3 1 1
    ...
    Sachant que l'on part de ces données là : (voir ici pour l'interprétation de ces données).
    1000025,5,1,1,1,2,1,3,1,1,2
    1002945,5,4,4,5,7,10,3,2,1,2
    1015425,3,1,1,1,2,2,3,1,1,2
    1016277,6,8,8,1,3,4,3,7,1,2
    1017023,4,1,1,3,2,1,3,1,1,2
    1017122,8,10,10,8,7,10,9,7,1,4
    1018099,1,1,1,1,2,10,3,1,1,2
    ...
    Vous ne devriez pas avoir trop de mal à faire cette mise au format des données. Comme pour l'apprentissage lors du TD2 vous créez en fait deux ensembles de données disjoints, un pour l'apprentissage, l'autre pour le test. Suivez maintenant ces instructions pour faire un apprentissage "non-supervisé" :
  • Téléchargez et désarchivez sur le bureau le fichier "kohonen.zip",puis démarrez le programme.
  • Appuyez sur la touche 'd' pour sélectionner le fichier de données à utiliser pour l'apprentissage (faites bien attention d'avoir le "focus" sur la fenêtre du programme "kohonen", en cliquant sur le bandeau de la fenêtre de l'interface du programme).
  • Une fois les données chargées, appuyez sur la touche 't' pour démarrer l'apprentissage. Voyez comme chaque neurone va progressivement se "spécialiser"pour reconnaître un type particulier de cellule. La taille de chaque neurone correspond au nombre de données qui lui sont associées (plus il est gros plus il regroupe de données). La couleur de chaque neurone correspond au label majoritaire des données qui lui sont associées. Plus précisément les chiffres qui sont affiché à coté de chaque neurone correspond au numéro de classe majoritaire, ainsi que le pourcentage de données appartenant à cette classe. Par exemple si on voit "(0|75%)" à coté d'un neurone, cela veut dire que 75% des données associées à ce neurone sont des données appartenant à la classe 0. Cela veux dire qu'on peut donc produire une prédiction disant que des données nouvelles correspondant à ce neurone sont probablement des cellules saines (classe 0), et que le 75% peut servir d'indice de confiance. Constatez que, même si les données de sorties ne sont pas utilisées, la carte de kohonen à bien réussi à séparer les données en deux zones distinctes, ces deux zones sont justement les deux classes du problèmes : "cancer" ou "pas cancer".
  • Une fois l'apprentissage arrivé à la fin (regardez la zone de terminal de Processing), cliquez sur un neurone pour afficher (dans le terminal) l'ensemble des labels (information de sortie) des données associé à ce neurone. Notez aussi qu'un fichier "map.txt" est créé dans le répertoire du code du programme "kohonen". Il s'agit des données relative à la carte qu'on vient de construire par l'apprentissage.
  • Stoppez le programme (bouton carré), et relancez le. Cette fois-ci, grâce à la touche 'd', chargez les données de test. Ensuite grâce à la touche 'u' ouvrez le fichier "map.txt" crée à l'étape précédente. Automatiquement, le programme utilise alors pour la première fois les données de label (informations de sortie) issue des données d'apprentissage, pour prédire les labels du fichier de test. Il n'y a aucun affichage graphique, le résultat d'analyse est enregistré dans un fichier "output.txt". Ce format est exactement le même que celui proposé par le programme d'utilisation du réseau du TD2. Après la lettre P est indiqué la classe prédite, après la lettre R est indiqué la classe réelle. En fin de ligne est indiqué les coordonnées du neurone correspondant le mieux à la donné mise en entrée, ce qui n'a pas vraiment d'importance pour nous dans ce contexte. On peut utiliser le programme "confusionMatrix.pl", (voir TD2) sur ces données de prédiction pour calculer la matrice de confusion.
  • Notez que sur la carte crée lors de l'apprentissage, il semblerait y avoir d'autres classes que "cancer" ou "non-cancer" visible par l'algorithme... C'est un des intérêts de cette méthode, en plus du fait qu'on peut faire un apprentissage même avec peu d'information de sortie (qui est la plus coûteuse à collecter). En pratique, et dans notre contexte, nous n'avons pas les ressources pour essayer d'identifier quelle information se cache derrière ces autres clusters. Dans un vrai contexte de recherche on pourrait imaginer obtenir d'autres information que celle dont on dispose pour essayer de découvrir quelles classes (quelle information) correspond à ces clusters "non identifiés".
Conclusion

Nous avons vu pendant ces 3 TD, les bases de l'apprentissage neuronal supervisé et non-supervisé. Nous avons vu les règles à suivre pour construire un protocole d'apprentissage, la construction des bases d'apprentissage et de test, ainsi que leur programmation grâce à une librairie. Nous avons vu aussi comment évaluer correctement un système de prédiction basé sur de l'apprentissage. Vous êtes donc maintenant prêt pour aborder par vous même un problème de classification avec des réseau de neurones.
Il s'agissait là du dernier TD à proprement parler, la prochaine séance sera du TP, c'est à dire que vous commencerez le projet que vous finirez en autonomie et sur lequel vous serez noté.

Annexe(s) :