IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Perceptron Multi-couche et descente de gradient


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Perceptron Multi-couche et descente de gradient
    Bonjour tout le monde !
    J'essaie (désespérément) de mettre en oeuvre un algorithme de classification utilisant un perceptron multi-couche avec rétro-propagation par descente de gradient.

    La plupart des documents trouvés sont flous ou mal faits (à mon goût)...

    J'ai quatre entrées, une sortie (1 ou -1), c'est un problème de classification tout ce qu'il y a de plus classique.
    L'inconvénient, c'est que je ne vois pas comment calculer l'erreur...
    Voici la partie servant à l'entraînement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    x0	x1	x2	x3	out
    1	4	99	15	1
    2	1	396	1,875	-1
    1	2	70	7,5	1
    2	2	396	3,75	-1
    1	3	70	15	1
    2	3	300	15	-1
    1	4	70	30	1

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Au début il suffit par exemple d'initialiser les poids du réseau aléatoirement.

    Ensuite on présente en entrée un set de valeurs, on calcule la sortie (forward), l'erreur est alors la différence entre la sortie calculée et la sortie voulue. Ensuite rétro-propagation par descente de gradient (backward), et on recommence avec un autre set de valeurs d'entrée.

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Mon problème est dans l'implémentation, donc ça vient de l'algorithme.
    Comment sont calculés les nouveaux poids ?
    Que vaut le gradient ?

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Le gradient c'est l'erreur, c-a-d la différence entre la sortie calculée et la sortie voulue.

    Pour l'algorithme, voir Wikipedia par exemple.

  5. #5
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    C'est ce que j'ai essayé d'utiliser, mais ça ne fonctionne pas.

    Dans mon exemple, en utilisant les notations, ça donnerait quoi ?
    Est-ce que je peux utiliser n'importe quelle fonction de transfert (actuellement, j'utilise "sign") ?

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    La fonction de transfert (ou d'activation) c'est la fonction notée "g" dans l'algorithme de Wikipedia. Il faut qu'elle soit dérivable pour l'apprentisage, donc la fonction sign ne convient pas je pense. Le plus simple est d'utiliser la fonction sigmoide car sa dérivée sig'(t)=sig(t)*(1 - sig(t)) simplifie l'algorithme. Elle retourne une valeur comprise entre 0 et 1, qui peut s'interpréter comme une probabilité, quite a ensuite la seuiller à 0.5 si besoin d'un résultat binaire.

    Pour qu'un réseau fonctionne correctement il faut aussi bien choisir le nombre de couches, les différents paramètres (gain, inertie, ...). S'il y a peu de données d'apprentissage, comme dans ton cas, il faut peut-être les répéter plusieurs fois, ... Il n'y a pas vraiment de règle pour régler tout ça, il faut faire des essais.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Salut,

    Alors pour le calcul de l'erreur, il faut avoir une fonction dérivable donc la fonction sigmoide correspond bien. sortie=1.0/(1.0+exp(-somme))
    avec somme = somme(poid*entree)
    a savoir que entree est binaire
    Ensuite, pour le resultat à obtenir, il doit etre 0 ou 1 (dans le cas de cette fonction)
    Pour la propagation :
    calculer sur la couche de sortie l'erreur du neurone
    Erreur = (result_espere(N-cc) - Sortie_neurone(reso,N))
    Erreur = Erreur /(2*(1+Hcos(Sortie_neurone(reso,N))))
    A ce stade, tu as l'erreur sur tes neurones de sortie. il faut maintenant la propager :
    Donc on regarde la couche caché.
    Et pour chaque entrée de chaque neurone de cette couche :
    Erreur = Erreur + erreur_neurone(reso,neuro)*lit_poid(reso,neuro,ent)
    avec lit_poid(reso,neuro,ent) = poid de l'entree du neurone de sortie connecté à la sortie du neurone caché
    une fois toute les entrées balayées, on applique la dérivée :
    Erreur = Erreur /(2*(1+Hcos(Sortie_neurone(reso,N))))

    Nous avons maintenant l'erreur propagée sur la couche caché.
    On fait de meme pour la couche de sortie

    Ensuite, il nous reste à modifier les poids en fonction de l'erreur de chaque neurone :
    poid=poid+reseau(reso).pas_apprentissage*Erreur_neurone(reso,N)*Sortie_neurone(reso,ll)
    avec Sortie_neurone(reso,ll) = sortie du neurone connecté à cette entrée.
    Si c'est la couche de sortie alors Sortie_neurone(reso,ll)=la valeur de ton image (ou stimulis)

    Voila.
    Pour commencer, je te conseille 8 neurones d'entrée, 10 cachés et 2 de sorties pour classer juste 2 choses.
    Prend un pas d'apprentissage de 0.1, ca donne en générale de bons résultats, mais c'est un peu long.

    Et un dernier conseil, si tu veux que ça ne rame pas trop, prevoit dans ta structure de tes neurones de ne pas y mettre que tes poids et ta sortie.
    Pour eviter bcp de calcul ou des boucles inutile, stocke un pointeur du poid auquel est relié la sortie de chaque neurone
    ex: poid1, entree1, poid2, entree2 ... sortie, erreur, poid_relier à la sortie1, poid relié à la sortie2, ...
    Bref, tu t'en rendra vite compte que c'est indispensable pour une vitesse résonnable.

    Bon courage.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Oup's

    Après la réponse sur ce forum, il parraitrait que la couche d'entrée accepte une valeur continue entre 0 et 1...
    Dsl pour l'erreur

Discussions similaires

  1. [AI Code]Réseau de neurones: perceptron multi-couche en C++
    Par Aszarsha dans le forum Contribuez
    Réponses: 1
    Dernier message: 20/09/2014, 10h28
  2. Perceptron multi couche
    Par pretyy dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/12/2011, 19h53
  3. Réponses: 2
    Dernier message: 22/04/2009, 23h04
  4. Réseaux de neurones avec perceptron multi couches
    Par naoufal_bago dans le forum Méthodes prédictives
    Réponses: 9
    Dernier message: 14/03/2008, 22h15
  5. Perceptron Multi Couche
    Par MBAYE BABACAR GUEYE dans le forum MATLAB
    Réponses: 1
    Dernier message: 06/06/2007, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo