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

Méthodes prédictives Discussion :

[debutante]probleme d'algorithmique sur la retropropagation du gradient methode batch


Sujet :

Méthodes prédictives

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Points : 10
    Points
    10
    Par défaut [debutante]probleme d'algorithmique sur la retropropagation du gradient methode batch
    Bonjour,

    j'aurai besoin de votre aide si c'est possible.


    J'ai programme en C++ un reseau de neurone qui utilise la retropropagation du gradient avec la methode batch en C++ (de A a Z).
    Mon sert reseau sert a l'approximation de fonctions.


    J'utilise la sigmoide comme fonction logistique.

    Mon reseau est constitue de 3 couches, avec un neurone en entree, 20 neurones sur la couche cachee, et un neurone en sortie.

    J'initialise le biais de la deuxieme couche et celui de la troisieme couche a 0.5, j'initialise les poids a 0.5, je fixe le taux d'apprentissage a 0.9 et je fixe le moment (threshold) a 0.5.

    J'initiale la premiere variation des poids (((((Δw(1)) a 0, de meme avec la premiere variation du biais.

    Ma population d'apprentissage est la suivante :
    entrees : 0.1 ; 0.2 ; 0.5 ; 0.7 ; 0.9
    sorties desirees : 0.3 ; 0.6 ; 0.5 ; 0.4 ; 0.8
    (les couples d'entrees sorties sont donc (0.1 ; 0.3) ..... (0.9 ; 0.8))

    Mon reseau tourne mais j'ai un probleme je ne trouve pas les bons resultats.
    J'ai refait les calcul sous excells a la main en essayant de voir ou j'avais pu commettre une erreur dans mon algorithme et malheur de malheur je trouve la meme chose que dans mon programme. Ma conclusion est donc qu'il y a quelque chose que je n'ai pas bien compris a cet algorithme ou alors que mes donnees sont erronnees (ce qui pour le coup m'etonnerai)

    Je n'ai aucun moyen de verifier mes resultats, je suis sous linux debian etch, je n'ai pas mathlab je n'arrive pas a faire marcher octivate et quand je lance scilab j'ai un segmentation fault.

    Ca fait des semaines que je planche dessus, que je lis tous les tutos, les cours et les bouquins possible que j'ai en stock pour essayer de comprendre ou est l'erreur et je ne trouve pas.


    Pour la premiere iteration (les poids n'ont pas encore changes) je trouve le bon resultat : je calcul E qui est egal a un 1/2 de la norme au carre de l'erreur en sortie et ce pour chacunes de mes entrees. Et ensuite je calcul la somme des E de chaque entrees.
    Cette somme me donne le resultat suivant : 0.648114 (qui est bon)

    Ensuite j'applique les algortihmes de retropropagation. Et je recalcul mes sorties, les E et la somme des E.
    Cette deuxieme iterationme donne le resultat suivant pour la somme des E : 0.648082 qui lui n'est pas bon du tout et apres c'est la cata.

    Normallement au bout de 3000 iterations je devrait arriver a une erreur de l'ordre de 0.03 et je ne descends pas au dessous de 0.04.
    Et ce n'est pas une question de precision en virgule flottante ou du genre, j'ai verifi2, ca m'a pris des heures et ce n'est pas la source du probleme.

    Alors voila ma demande : si l'un de vous a un peu de temps a perdre, est-ce qu'il pourrait faire tourner le meme reseau que celui que je teste et me dire si effectivement les resultats sont differents de ceux que je trouve ?
    Si c'est le cas, serait-il possible alors que je vous dise comment j'ai compris et programme cet algorithme de retropropragation pour m'aider a debusquer l'erreur ?


    Quelle que soit votre reponse merci d'avoir pris le temps de lire mon message

    PS : excusez-moi pour les c cedilles qui manquent ainsi que les accents, je suis sur un clavier qwerty

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Ah, je connais ça les claviers qwerty

    Sinon, pour ton problème... C'est peut-être simplement dû à la structure de ton réseau qui n'arrive pas à te donner une erreur inférieure à 0.04 ?

    Peux-tu pour commencer expliquer ce que doit apprendre ton réseau de neurones ? (je veux dire en français, en donnant une signification à chacune des informations d'entrée, etc)

    Et sinon, tu as vérifié avec mon article (http://alp.developpez.com/tutoriels/...x-de-neurones/) que l'algorithme est bon ? La moindre petite erreur de signe ou je ne sais quoi peut faire rater l'apprentissage.

    Mais pour le moment je penche pour une mauvaise structure.

    (je demeure admiratif devant toutes les informations que tu donnes... si seulement tout le monde faisait comme toi lorsqu'il a un problème )

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Alors meme si j'ai donne beaucoup d'informations je n'en ai quand meme pas donnee assez XD

    Tout d'abord la programmation de ce reseau de neurone est un exercice qu'on m'a donne pour apprendre a programmer en C++ et pour apprendre le fonctionnement d'un perceptron multicouche qui apprend avec la methode batch de la retropropagation du gradient.

    Dans l'enonce on me dit qu'en initialisant tous les poids a la meme valeur avec comme valeurs pour les parametres celles precisees dans mon premier message, je dois trouver pour l'erreur totale en sortie du reseau pour ces iterations :

    iteration 1 : 0.648114
    iteration 2 : 0.648057
    iteration 3000 : 0.030734

    Alors tout betement mes couples d'entrees-sorties sont des coordonnees. et Je veux qu'a la fin de mon apprentissage si je fais tracer la fonction par mon reseau de neurone (en lui donnant donnant en entree des x compris entre 0 et 1 et ayant un pas de 0.01 par exemple et en regardant ce que j'ai en sortie du neurone) et bien il passe par ces points. En bref c'est de l'approximation comme on pourrait avoir les polynomes de Legendre, Tchebychev ou Lagrange (si mes souvenirs sont bons).


    Et l'idee c'est de montrer qu'en fixant les poids on n'y arrive pas. C'est le cas mais je n'ai pas les bonne valeurs apres la correction de mes poids. Disons que je suis proche du resultat (d'ailleurs en initialisant mes poids aleatoirement quand je suis a plus de 10000 iterations j'ai bien la forme de courbe voulue !) mais qu'ils ne sont pas bon quand meme.


    Pour les erreurs de signes j'ai checker et rechecker, je me suis meme amusee a les changer expres pour voir les resultats que ca donnerai et pour le coup ils sont pas bon du tout XD

    Ensuite pour ton tutos je l'ai survole, ayant deja lu plusieurs cours sur le sujet fait par des profs d'ecoles d'inge et ayant lu le livre "Handbook of neural network signal processing" (de Yu Hen Hu et Jenq-Neng Hwang traduit en anglais et edite par CRC PRESS, que je trouve tres bien fait d'ailleurs).

    Je vais donc quand meme me plonger dans ta facon d'expliquer l'algorithme, j'ai peut etre rate un detail quelque part dans tout ce que j'ai pu lire.
    C'est juste que quand je l'ai survole ca m'a fait bizarre de pas voir le calcul de la correction avec la notation δ.
    J'avoue c'est tres bete d'etre perturbe pour si peu --"

    edit : au fait je precise ma premiere couche correspond a ce que tu appels les informations. Les sorties de cette couche sont egales aux entrees.

    edit2 : je me rappel pourquoi j'avais pas trop cherche plus loin dans le tuto ^^ C'est parceque l'algo que tu donne pour le perceptron multicouche est celui de la methode inline (ou plus precisement Widrow-Hoff si j'ai bien compris ^^).

    edit 3 : de plus il n'est pas fait mention dans ton algo de la constante du "moment" qui aide a accelerer la convergence. Et c'est le terme qui lui est associe (((Δw(1) = w(1) - w(0)) que j'initie a zero lors de ma premiere iteration.

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par ghani56 Voir le message
    C'est juste que quand je l'ai survole ca m'a fait bizarre de pas voir le calcul de la correction avec la notation δ.
    J'avoue c'est tres bete d'etre perturbe pour si peu --"
    Non non. Ca m'énerve aussi, mais on ne peut pas insérer de tel caractère dans une zone de code :'( (le vrai delta, majuscule, pas celui que tu as mis)

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par ghani56 Voir le message
    edit2 : je me rappel pourquoi j'avais pas trop cherche plus loin dans le tuto ^^ C'est parceque l'algo que tu donne pour le perceptron multicouche est celui de la methode inline (ou plus precisement Widrow-Hoff si j'ai bien compris ^^).
    Non, ça c'est pour le perceptron monocouche, le perceptron simple quoi.
    Pour le PMC, c'est la rétropropagation du gradient : http://alp.developpez.com/tutoriels/...eurones/#LVIII .

    Citation Envoyé par ghani56 Voir le message
    edit 3 : de plus il n'est pas fait mention dans ton algo de la constante du "moment" qui aide a accelerer la convergence. Et c'est le terme qui lui est associe (((Δw(1) = w(1) - w(0)) que j'initie a zero lors de ma premiere iteration.
    Peut-être parce que depuis que j'ai vu ton message je me demande à quoi renvoie "batch" et je me demande ainsi si ce n'est pas un algorithme légèrement différent que tu utilises.
    Celui que je présente est vraiment celui de la rétropropagation standard.

    Et sinon, tu ne m'as pas dit, ne pourrait-on pas accuser la structure du réseau de neurones de ne pas assez se rapprocher de la fonction voulue ?

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    ne pourrait-on pas accuser la structure du réseau de neurones de ne pas assez se rapprocher de la fonction voulue ?
    Il se peut, mais le fait est que la structure que j'utilise m'est imposee et que les resultats que je devrais retrouver correspondent a cette structure. Autrement normallement avec seulement 5 neurones sur la couche cachee je devrais normallement pouvoir obtenir de bon resultat en initialisant mes poids aleatoirement.



    Alors pour les differences methodes batch, methode in-line :

    methode in-line : c'est celle que tu presentes, il y a ajustation des poids apres presentation de chaque exemple et a la fin d'un epoque on calcul l'erreur et selon qu'elle est inferieure a un certain seuil ou pas on reitere ou pas.

    methode batch : on presente tous les exemples dans l'ordre (vu que de toute facon ca ne changera rien au resultat de les presenter aleatoirement jusqu'a ce qu'elles aient toutes ete choisies) on calcul leurs sorties. Une fois cette procedure finies on calcul l'erreur sur l'ensemble des sorties et c'est cette erreur qu'on utilise pour adapter les poids avec la methode de la descente du gradient.



    Ensuite pour ce qui est de mon algorithme au niveau de l'adaptation des poids on peut rajouter ce que l'on appelle un "moment" a la correction des poids, c'est effectivement un equation modifiee, voila a quoi sert le moment :

    It provides a mechanism to adaptively adjust the step size. When the gradient vectors in successive epochs point to the same direction, the effective step size will increase (gaining momentum). When successive gradient vectors form a zigzag search pattern, the effective gradient direction will be regulated by this momentum term so that it helps minimize the mean-square error.

    extrait de "Handbook of Neural Network Signal" article : "Signal Processing Using the Multilayer Perceptron" Michael T. Manry, Hema Chandrasekaran, and Cheng-Hsiung Hsieh
    Il m'est demande de prendre en compte ce moment dans mon algo de retropropagation.

    Enfin bref pour le moment j'ai decide de reecrire au propre toutes mes derivees et toutes mes equations ! Je trouverai ptet l'erreur dedans !

    edit : J'enrage !!! ca fait des semaines que je planche sur ce [...] d'exo et en fait c'etait bien la methode in-line que je devais utiliser !!!! C'est pour ca que je ne trouvais pas la meme chose !!! Et pourtant j'avais bien demande "batch desu ne ?" et il m'a repondu "hai, hai sou desu" il a pas du comprendre ce que j'essayai de lui dire
    Bon ben j'ai plus qu'a programmer des methodes pour la methode in-line !
    Au moins j'ai avance XD
    Si j'ai de nouveau des problemes mais cette fois sur la methode standar je ferai signe ^^""""
    Desolee pour le derangement !

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Ah... Tout s'explique

    Je commençais à perdre espoir là

    Content qu'une solution ait été trouvée Bonne continuation et à bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. debutante probleme sur bouton
    Par naomy dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 01/05/2009, 11h58
  2. Problème graveur ide sur mdk10
    Par Hanslip dans le forum Matériel
    Réponses: 40
    Dernier message: 26/10/2004, 13h17
  3. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  4. [C#] problème si clic sur "précédent"
    Par moimoimoi dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/03/2004, 15h30
  5. probleme d'installation sur d'autres postes
    Par VBkiller dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/09/2002, 18h14

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