TP de réseau de neurone

Perceptron

Le Perceptron est un réseau de neurone sans couche cachée.

On se propose d'implémenter un perceptron multiclasses avec pour fonction d'activation $g$ la fonction seuil (la sortie vaut 1 si la valeur d'activation est du même signe que la sortie attendue, 0 sinon). Le perceptron est représenté par une matrice $w$ de taille $k \times (d+1)$ avec $k$ le nombre de classes du problème et $d$ la dimension des données en entrée. Les valeurs de $w$ sont initialisées aléatoirement. Le pas d'apprentissage $\alpha$ est choisi arbitrairement entre 0 et 1.

La règle d'apprentissage est: $$ w_i^{t+1} = w_i^t+\alpha(y_t-y)x_i $$ avec $y_t$ la sortie attendue et $y$ la sortie calculée

Coder le perceptron à l'aide des fonctionnalités suivantes

  1. Calcul de la sortie $\sigma$ du perceptron $w$ pour une entrée $x$
  2. Calcul de l'activation d'un neurone $y = g(\sigma)$
  3. Calcul de $\delta = y_t-y$
  4. Calcul de la mise à jour du perceptron

Vous disposez également d'un code à trous à compléter en bas de page.

MLP : Multi Layer Perceptron

Un travail équivalent est demandé pour apprendre un réseau multicouches. Le réseau devra avoir une unique couche cachée contenant $nc$ neurones. La fonction d'activation $g$ sera la fonction sigmoïde. Il est représenté par 2 matrices, $w$ et $w2$ de dimensions respectives $k \times nc$ et $nc \times (d+1)$ On notera que l'ajout d'une seule couche peut se faire en doublant simplement chaque étape (ex : le calcul de la sortie, c'est le calcul de la sortie de la couche cachée en utilisant les entrées x, puis le calcul de la sortie de la couche de sortie en utilisant le résultat intermédiaire comme entrée).

Compte-rendu 1

Le code obtenu est à envoyer en l'état par mail à G. Loosli à la fin des 2h de TP. Il devra être commenté et sera évalué pour moitié de la note finale. Le travail par binôme est possible.

Compte-rendu 2

Le code terminé est à envoyer par mail à G. Loosli au plus tard le 6 janvier 2013, accompagné d'un compte rendu illustrant l'effet des différents paramètres du MLP. La pertinence de vos observations ainsi que la variété de vos expérimentations seront prises en compte dans l'évaluation. Pour cette partie, il est possible d'utiliser des données différentes. Par ailleurs, cette partie doit être rendue individuellement.

Code de départ

% usage : tp_nr_atrou(n,nt)

function tp_nr_atrou(n,nt)
    close all;
    
    % générer les données
    x = rand(n,2)*2-1;
    y = ones(n,1);
    y(x(:,1)<0) = 2;
    y(x(:,2)>0.2) = 3;
    y(x(:,2)<-0.5) = 4;
    xt = rand(nt,2)*2-1;
    yt = ones(nt,1);
    yt(xt(:,1)<0) = 2;
    yt(xt(:,2)>0.2) = 3;
    yt(xt(:,2)<-0.5) = 4;

    figure;
    % train perceptron
    w = perceptron(x,y,max(y),0.1,20*n);
    % test perceptron
    pred = testPerceptron(xt,w);
    perf = 100*length(find(pred==yt))/nt
    plotPerceptron(xt,yt,4,w)
    figure;
    % train MLP
    [w,w2] = trainMLP(x,y,max(y),0.02,50*n,12);
    % test MLP
    pred = testMLP(xt,w,w2);
    % perf = 100*length(find(pred==yt))/nt
    % plotMLP(xt,yt,4,w,w2);

end


function w = perceptron(x,y,k,alpha,tmax)
    if size(y,2)==1 % representer les etiquettes sous forme de matrice
       yt =  zeros(k,size(y,1)); % une ligne par classe
       for i=1:k
            yt(i,y==i) = 1;
       end
    end
    w = 0; % initialiser aléatoirement tout le réseau (à faire)
    t = 0;
    while t<tmax
       i = ceil(size(x,1)*rand(1)); % selectionner un point au hasard
       p = [x(i,:),1]; % passer le point dans la couche d'entrée
       u = zeros(1,k); % appliquer la fonction d'activation pour tous les neurones de sortie (à faire)
       delta = zeros(length(p),k); % calculer delta (a faire)
       w = zeros(k,length(p)); % mettre à jour le réseau (à faire)
       t = t+1;
       if mod(t,2000)==0 % afficher une fois tous les 2000 points
        plotPerceptron(x,y,k,w);
        drawnow;
       end
    end

end

function pred = testPerceptron(xt,w)
    sortie = zeros(length(xt),1); % calculer la sortie pour tous les points (à faire)
    [val, pred] = max(sortie,[],2);
end

function plotPerceptron(x,y,k,w)
    hold off;
    [X,Y] = meshgrid(linspace(min(x(:,1)),max(x(:,1)),100),linspace(min(x(:,2)),max(x(:,2)),100));
    pred = testPerceptron([reshape(X,10000,1),reshape(Y,10000,1)],w);
    contourf(X,Y,reshape(pred,100,100));
    hold on; 
    colormap('gray');
    contour(X,Y,reshape(pred,100,100),[0,0],'r');
    color = 'brgymck';
    for i=1:k
        plot(x(y==i,1),x(y==i,2),[color(i),'+']);
    end
    
end


function [w,w2] = trainMLP(x,y,k,alpha,tmax,nbNC)
 % tout faire!
 w=0;
 w2=0;
end


function pred = testMLP(xt,w,w2)
% tout faire!
pred=0;
end


function plotMLP(x,y,k,w,w2)
    hold off;
    [X,Y] = meshgrid(linspace(min(x(:,1)),max(x(:,1)),100),linspace(min(x(:,2)),max(x(:,2)),100));
    pred = testMLP([reshape(X,10000,1),reshape(Y,10000,1)],w,w2);
    contourf(X,Y,reshape(pred,100,100));
    hold on; 
    colormap('gray');
    contour(X,Y,reshape(pred,100,100),[0,0],'r');
    color = 'brgymck';
    for i=1:k
        plot(x(y==i,1),x(y==i,2),[color(i),'+']);
    end
    
end