Apprentissage, Réseaux de neurones et Mod`eles graphiques
Transcription
Apprentissage, Réseaux de neurones et Mod`eles graphiques
Apprentissage, Réseaux de neurones et Modèles graphiques (RCP209) Le Perceptron Multicouches Charger la Toolbox Netlab - Créer un répertoire Netlab - Lancer firefox - Adresse de la Toolbox Netlab http://www1.aston.ac.uk/eas/research/groups/ncrg/resources/netlab/downloads/ - Cliquer sur Downloads - Charger dans le répertoire Netlab le fichier netlab3 3.tar en cliquant sur : ”gzip file” de la Toolbox 3.3 (Date : 18/06/2004) - Charger aussi dans le répertoire Netlab le fichier foptions.m - décompresser le fichier netlab3 3.tar → tar xvf netlab3 3.tar puis rm netlab3 3.tar - Vous disposez alors de la toolbox Netlab dans le répertoire Netlab. Fonctions importantes de Netlab pour un perceptron multicouches • Net = mlp(nin, nhidden, nout,outfunc); Elle permet de définir une architecture et d’initialiser les poids. . nin : nombre de neurones en entrée. . nhidden : nombre de neurones cachés. . nout : nombre de neurones en sortie. . outfunc : fonction d’activation pour la couche de sortie (= ’linear’, ’logistic’ ou ’softmax’) → help mlp pour plus de détails. • [Net, options] = netopt(Net, options, x, t, alg); alg = ’scg’ ,’conjgrad’ ou ’quasinew’ (algorithme d’optimisation) → help netopt pour plus de détails.. • Ycal = mlpfwd(Net, X); % sortie calculée par le réseau Net pour l’entrée X. Données simulées. Ecrire les commandes suivantes dans un fichier script donnees.m n=300; X=4*(rand(n,1)-.5); X=sort(X); a=2; b=5; Y=a*X + b; Yb=Y+.2*randn(size(Y,1),1); plot(X,Y,’b-’,X,Yb,’r.’) save data1 X Y Yb Y=zeros(size(X)); Y=Y+sin(pi*X).*((X>-1) & (X<1)); Yb=Y+.2*randn(size(Y,1),1); figure plot(X,Y,’b-’,X,Yb,’r.’) save data2 X Y Yb Placez-vous dans la fenêtre de commande Matlab et tapez : donnees 2 Utilisation d’un perceptron sans couche cachée Ecrire les commandes suivantes dans un fichier script test1.m addpath Netlab load data1; pas=10; Xapp=X(1:pas:length(X)); Yapp=Yb(1:pas:length(Yb)); ne = size(Xapp,2); ns = size(Yapp,2); Net = glm(ne, ns, ’linear’); options = foptions; options(1) = 1; % affichage des erreurs options(2) = 0.001; % précision sur la variation des poids options(3) = 0.001; % précision sur la variation de l’erreur options(14)=100; % nombre de cycles d’apprentissage options(18)=0.01; % pas d’apprentissage [Net1 options errlog pointlog]= netopt(Net, options, Xapp, Yapp,’graddesc’); subplot(3,1,1) plot(errlog); subplot(3,1,2) plot(pointlog); Ycalculee=glmfwd(Net1,X); subplot(3,1,3) plot(X,Y,’b-’,X,Yb,’g.’,X,Ycalculee,’r-’) Placez-vous dans la fenêtre de commande Matlab et tapez : test1 - Comparer Net1.w1 avec le coefficient directeur a et Net1.b1 avec l’ordonné à l’origine b Faire varier le pas d’apprentissage Faire varier le nombre de cycles d’apprentissage Remplacer la fonction netopt par la fonction oldg [Net1 options errlog pointlog]= olgd(Net, options, Xapp, Yapp); - Remplacer la fonction netopt par la fonction glmtrain [Net options] = glmtrain(Net, options, Xapp, Yapp); Ycalculee=glmfwd(Net,X); plot(X,Y,’b-’,X,Yb,’g.’,X,Ycalculee,’r-’) - Utiliser data2 à la place de data1 Copier le script demglm1.m de la toolbox Netlab dans un fichier demo1.m et le script demglm2.m dans un fichier demo2.m - Tester demo1.m et demo2.m - Faire varier les paramètres d’apprentissage dans demo1.m et demo2.m Utilisation d’un perceptron multicouches Ecrire les commandes suivantes dans un fichier script test2.m (copier test1.m dans test2.m puis modifier test2.m). load data2; pas=10; Xapp=X(1:pas:length(X)); Yapp=Yb(1:pas:length(Yb)); ne = size(Xapp,2); ns = size(Yapp,2); nc=3; 3 Net = mlp(ne, nc, ns, ’linear’); options=zeros(1,18); options(1)=1; options(2)=0.0001; options(3)=0.0001; options(14)=1000; options(18)=0.01; algorithm = ’graddesc’; [Net1 options errlog pointlog] = netopt(Net, options, Xapp, Yapp, algorithm); subplot(3,1,1) plot(errlog); subplot(3,1,2) plot(pointlog); Ycalculee=mlpfwd(Net1,X); subplot(3,1,3) plot(X,Y,’b-’,Xapp,Yapp,’g.’,X,Ycalculee,’r-’) Placez-vous dans la fenêtre de commande Matlab et tapez : test2 - Faire varier le pas d’apprentissage - Faire varier le nombre de cycles d’apprentissage - Tester le weight decay : alpha = 0.2; Net = mlp(ne, nc, ns, ’linear’,alpha); - Tester le momentum : options(17)=0.5; - Tester les autres algorithmes d’apprentisage : ’conjgrad’, ’scg’ et ’quasinew’ Charger le fichier MlpLearn.m dans le répertoire Netlab. Ecrire les commandes suivantes dans un fichier script Apprend.m global options addpath Netlab load data2 % Base d’apprentissage et base de test % Un point sur trois pour l’apprentissage et le reste pour le test I=1:3:length(X);J=1:length(X);J=setdiff(J,I); Xapp=X(I); Yapp=Yb(I); Xtest=X(J); Ytest=Yb(J); NbreNeurEntree = size(Xapp,2); NbreNeurSortie = size(Yapp,2); NbreNeurCache = 5; Net = mlp(NbreNeurEntree, NbreNeurCache, NbreNeurSortie, ’linear’); SeuilArret = 0.0001; algorithm = ’scg’; NbreIterations=1000; NbreIterAvantTest=10; figure set(gca,’YScale’,’log’) [Net, ErrAppr, ErrTest, CurIter, Yac, Ytc] = MlpLearn ( ... Net, Xapp, Yapp, Xtest, Ytest, ... NbreIterations, NbreIterAvantTest, SeuilArret, algorithm); figure Ycalculee=mlpfwd(Net,X); plot(X,Y,’b-’,X,Ycalculee,’r-’) legend(’: Y désiré’,’: Y calculé’); 4 Placez-vous dans la fenêtre de commande Matlab et tapez la commande Apprend Vous pouvez faire d’autres apprentissages en modifiant les différents paramètres influant sur l’apprentissage dans les scripts Apprend.m et MlpLearn.m Problème réel de classification : les Iris de Fisher Les Iris de Fisher correspondent à 150 fleurs décrites par 4 variables quantitatives : longueur du sépale, largeur du sépale, longueur du pétal et largeur du pétal. Les 150 fleurs sont réparties en 3 différentes espèces : iris setosa, iris versicolor et iris virginica Chaque classe est composée de 50 fleurs. La classe setosa est linéairement séparable des deux autres, alors que versicolor et virginica ne le sont pas. Le fichier iris don.mat contient les vecteurs d’entrée en dimension 4 décrivant les 150 iris. Le fichier iris cls.mat contient les classes des 150 iris. Pour lire ces fichiers faire : load -ascii iris don.mat load -ascii iris cls.mat Le codage classique des sorties désirées pour la classification utilise un neurone de sortie par classe, avec une valeur désirée haute pour le neurone de la classe correcte, et une valeur désirée faible pour les autres classes. Nous allons utiliser le codage suivant : classe 1 → (1 0 0) classe 2 → (0 1 0) classe 3 → (0 0 1) Vous pouvez générer la matrice de sortie en utilisant les instructions Matlab suivantes : >> iris output=zeros(150,3); >> iris output(find(iris cls==1),1)=1; >> iris output(find(iris cls==2),2)=1 ; >> iris output(find(iris cls==3),3)=1; Apprentissage - Utiliser 100 Iris pour l’apprentissage et les autres pour le test. - Utiliser 3 neurones cachés. - Pour un problème de classification, il vaut mieux utiliser des fonctions d’activation non linéaires à la couche de sortie. Utiliser la fonction ’softmax’. - Faire 100 cycles d’apprentissage - évaluer l’erreur de classification au moyen de la matrice de confusion et identifier les instances mal classées. Vous pouvez utiliser les instructions Matlab suivantes : >> Ycalculee=mlpfwd(Net,iris input); >> classe t=iris cls; >> [max y classe y]=max(Ycalculee’); >> classe y=classe y’; >> exemples mal classes=find(classe t∼=classe y); >> NetClass=zeros(150,3); >> NetClass(find(classe y==1),1)=1; >> NetClass(find(classe y==2),2)=1; >> NetClass(find(classe y==3),3)=1; >> conffig(NetClass,iris output) - Faire varier les paramètres d’apprentissage. Le problème des taches solaires (”sunspot” ) : sélection de variables Il s’agit du nombre moyen annuel de taches noires observées sur le soleil entre 1700 et 1979 (280 points). La série des taches solaires est très courte et célèbre dont l’équation sous jacente 5 est inconue. La figure 1 montre l’évolution annuelle de cette série. 1 0.9 0.8 Average sunspot activity 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 1700 1750 1800 1850 Year 1900 1950 2000 Figure 1: série sunspot normalisée de 1700 à 1979. Pour ce problème, on essaie de prédire une valeur en utilisant les 12 valeurs précédentes. Il faut donc utiliser un réseau avec une couche d’entrée de 12 neurones et une couche de sortie de 1 neurone Données d’apprentissage et de validation On utilise les données de 1712 à 1920 pour l’apprentissage (un ensemble DApp de 209 exemples), et les données de 1921 à 1955 pour la validation (un ensemble DV al de 35 exemples). Pour le test, on utilise les données de 1956 à 1979 (un ensemble DT est de 24 exemples). Mesure de qualité Les performances du modèle sont calculées en utilisant le critère ARV (”Average Relative Variance”), qui est le rapport entre l’erreur quadratique moyenne du moèle et la variance des données. La définition de l’ARV établit un rapport entre l’erreur du modèle et la variance des données calculée sur le même ensemble D (pris de l’ensemble entier S). ∑ (y i − f (xi ))2 i∈D arv(D) = ∑ (y i − µD )2 (1) i∈D où y i est la valeur de la série à l’instant i, f (xi ) est la sortie du réseau à l’instant i, et µD la moyenne de la valeur désirée dans D. Cependant, la définition de l’ARV la plus utilisée utilise la variance totale des données (de la série). ∑ 1 (y i − f (xi ))2 |D| arv(D) = i∈D 1 |S| ∑ (y i − µS )2 (2) i∈S i i où y est la valeur de la série à l’instant i, f (x ) est la sortie du réseau à l’instant i, et µS la moyenne de la valeur désirée dans S (la série entière) . Afin de comparer votre ARV avec celles obtenues en utilisant d’autres méthodes, utiliser la formule (2). 6 • Constituer les ensembles DApp , DV al et DT est : – DApp (ensemble d’apprentissage) : il sert à calculer les poids du réseau. – DV al (ensemble de validation) : il sert à éviter le sur-apprentissage (à déterminer quand arrêter l’apprentissage). – DT est (ensemble de test) : il sert à évaluer les performances du résau obtenu. Cet ensemble ne doit pas intervenir ni pour la détermination des poids ni pour l’arrêt de l’apprentissage. • Apprentissage – Utiliser un réseau avec une couche cachée. – Utiliser la méthode HVS pour sélectionner les variables pertinentes. Utilisation dun MLP pour la classification de Chiffres Manuscrits : choix du codage L’objectif de cette partie est de comparer les performances d’un classifieur MLP en fonction des différents types de codage que l’on va faire sur les chiffres, et qui serviront d’entrée au réseau de neurones. Les Données : la base de donnée de chiffres manuscrits est composé de 480 chiffres manuscrits codés en binaire (±1), dans une matrice 256x480. Chaque bitmap binaire 16x16 a été transformée en un vecteur de dimension 256 qui, à son tour, correspond à une colonne de la matrice x, stockée dans le fichier x.mat. Base d’apprentissage, base de validation et base de test on va diviser cette base de données en 3 parties : - Un ensemble d’apprentissage (de 1 300) qui sert à calculer les poids du réseau - Un ensemble de validation (de 301 400) qui sert vérifier quil n’y a pas de sur-apprentissage. - Un ensemble de test (de 401 480) qui sert à évaluer les performances du réseau obtenu. Codage des données. Soient : - HX : histogramme des projections du chiffre sur l’axe des x (dans chaque colonne on compte le nombre de pixels noir). HX est donc un vecteur de 16 composantes. - HY : histogramme des projections du chiffre sur l’axe des y (dans chaque ligne on compte le nombre de pixels noir). HY est aussi un vecteur de 16 composantes. - PH : profil haut pour chaque colonne, on code la coordonnée de la première transition blanc/noir en partant du haut. PH est un vecteur de 16 composantes. - PB : profil bas pour chaque colonne, on code la coordonnée de la première transition blanc/noir en partant du bas. PB est un vecteur de 16 composantes. - PG: profil gauche pour chaque ligne, on code la coordonnée de la première transition blanc/noir en partant de la gauche. PG est un vecteur de 16 composantes. - PD: profil droit pour chaque ligne, on code la coordonnée de la première transition blanc/noir en partant de la droite. PD est un vecteur de 16 composantes. Les 6 cas de codage à essayer sont: 1. 2. 3. 4. 5. 6. entrée entrée entrée entrée entrée entrée (HX,HY), vecteur de 32 composantes. (PG,PD), vecteur de 32 composantes. (HX,HY,PG,PD), vecteur de 64 composantes. (PB,PH), vecteur de 32 composantes. (HX,HY,PB,PH), vecteur de 64 composantes. image sous forme d’un vecteur de 256 pixels. Fichier x.mat. Comparez ces codages en termes de performances sur la base de test.