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 :

Questions sur la rétro-propagation du gradient dans un perceptron multicouches


Sujet :

Méthodes prédictives

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Par défaut Questions sur la rétro-propagation du gradient dans un perceptron multicouches
    Bonsoir.

    Désolé de encore venir vous demander votre aide... mais là je sèche !

    J'ai intégré l'algorithme de rétro propagation dans un programme C++ de la plus simple facture cependant je rencontre un résultat qui me laisse perplexe.
    J'ai commencé par vouloir faire apprendre à mon réseau la fonction booléenne XOR et après plusieurs cycles d'apprentissages j'ai récupéré les différentes erreurs calculées pendant la correction.
    L'erreur "pure", c'est-à-dire la moyenne de (sortie_voulue - sortie_obtenue) pour chaque couple entrée/sortie reste environ constante entre 50% et 49%. Je pourrais penser que le problème vient directement de l'algorithme.
    Or, lorsque je regarde la variation de l'erreur quadratique (définie par E = (1/2)(sum(sortie_voulue - sortie_obtenue)²) force est de constater que le programme fonctionne puisqu'en partant d'une erreur quadratique d'environ 45%, je tombe rapidement en dessous de 1% après quelques cycles de corrections.

    L'objectif de l'apprentissage étant de diminuer l'erreur quadratique, on pourrait se réjouir de sa très faible valeur.
    Oui mais l'erreur "pure" reste à environ 50% ! Si bien que lorsque je souhaite obtenir "0", le réseau calcule "0.56" et lorsque je souhaite avoir 1, j'obtiens des valeurs comme "0.42".

    Il y aurait-il alors des problèmes théoriques qui m'auraient échappés ou pensez-vous que cela vienne de mon programme ?

    Merci pour votre lecture.

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 196
    Par défaut
    Citation Envoyé par Courieux Voir le message
    L'erreur "pure", c'est-à-dire la moyenne de (sortie_voulue - sortie_obtenue) pour chaque couple entrée/sortie reste environ constante entre 50% et 49%.
    Première question, c'est l'erreur moyenne sur la base de teste ou bien d'apprentissage?
    Il en reste que... Un algorithme stochastique ferait aussi bien.
    Citation Envoyé par Courieux Voir le message
    Or, lorsque je regarde la variation de l'erreur quadratique (définie par E = (1/2)(sum(sortie_voulue - sortie_obtenue)²) force est de constater que le programme fonctionne puisqu'en partant d'une erreur quadratique d'environ 45%, je tombe rapidement en dessous de 1% après quelques cycles de corrections.
    Dexieme question, tu as combien de sortie? A priori, pour la fonction XOR tu as besoin d'une seul sortie -/+. Donc, d'ou vient le sum?
    Citation Envoyé par Courieux Voir le message
    L'objectif de l'apprentissage étant de diminuer l'erreur quadratique, on pourrait se réjouir de sa très faible valeur.
    Un meilleurs objectif est la stabilisation de l'erreur sur une erreur quadratique basse, ce qui évite de s'arrêter sur une bonne classification "chanceuse".
    Citation Envoyé par Courieux Voir le message
    Il y aurait-il alors des problèmes théoriques qui m'auraient échappés ou pensez-vous que cela vienne de mon programme ?
    Pour répondre a cette question il faudrait que tu "traduise" ce que tu as fait en C++ en pseudo-code, que l'on puisse voir si tu as compris le principe déjà.
    Ensuite, s'il n'est pas trop long tu peut poster ton code, ça peut provenir d'une erreur dedans. Mais la c'est plus du ressort du forum C++ (sans me prendre pour un admin^^").

    Tcho.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Par défaut
    Salut, merci pour ta réponse.

    Citation Envoyé par Clercq Voir le message
    Première question, c'est l'erreur moyenne sur la base de teste ou bien d'apprentissage?
    Il en reste que... Un algorithme stochastique ferait aussi bien.
    Je ne comprends pas bien ta question. En fait la base de test est la base d'apprentissage (Pour x1 = 1 et x2 = 1, je souhaite s = 0...). Mais à la base il s'agit de la base d'apprentissage.

    Dexieme question, tu as combien de sortie? A priori, pour la fonction XOR tu as besoin d'une seul sortie -/+. Donc, d'ou vient le sum?
    Oui je n'en ai qu'une, je citais la formule générale.

    Un meilleurs objectif est la stabilisation de l'erreur sur une erreur quadratique basse, ce qui évite de s'arrêter sur une bonne classification "chanceuse".
    J'y penserai, pour l'instant mon objectif premier est d'obtenir simplement 0 si les deux entrées valent 1.

    Pour répondre a cette question il faudrait que tu "traduise" ce que tu as fait en C++ en pseudo-code, que l'on puisse voir si tu as compris le principe déjà.
    Ensuite, s'il n'est pas trop long tu peut poster ton code, ça peut provenir d'une erreur dedans. Mais la c'est plus du ressort du forum C++ (sans me prendre pour un admin^^").
    L'une de mes interrogations est là, penses-tu que cela puisse venir du code alors que l'erreur quadratique diminue normalement ?

    Bon, on ne pourra pas appeler cela une écriture algorithmique mais bon...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Avec une fonction d'activation dérivable...
    Pour UN jeu d'entrée / sortie choisi aléatoirement :
     Calculer la sortie du réseau.
     Calculer l'importance de l'erreur de chaque neurones de la couche de sortie par :
     importance_sortie = sortie_obtenue_sortie * (1 - sortie_obtenue_sortie) * (sortie_désirée - sortie_obtenue_sortie)
     
     Rétro propager l'erreur en calculant l'importance de l'erreur commise par chaque neurones des couches cachées (de la couche de sortie vers la couche 'd'entrée'):
     importance_cachée = sortie_obtenue_cachée * (1 - sortie_obtenue_cachée) * (SOMME DE (importance_erreur_neurone£(couche+1) * poids_connexion_entre_neurone-travaillé_et_neurone£(couche+1) avec £ désigne chaque neurone de la couche suivante)
     
    Mettre à jour tous les poids du réseau par :
     
    nouveau_poids = ancien_poids + (taux_apprentissage * importance_erreur_neurone_au_bout_de_la_connexion * valeur_de_la_connexion)
    J'ai bon ?


    Merci encore pour ta réponse.

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 196
    Par défaut
    Citation Envoyé par Courieux Voir le message
    Je ne comprends pas bien ta question. En fait la base de test est la base d'apprentissage (Pour x1 = 1 et x2 = 1, je souhaite s = 0...). Mais à la base il s'agit de la base d'apprentissage.
    En effet... C'était un réflexe ^^"
    Citation Envoyé par Courieux Voir le message
    Oui je n'en ai qu'une, je citais la formule générale.
    Va pour la formule générale, mais pour ma défense, on est la pour comprendre ton cas spécifique

    Citation Envoyé par Courieux Voir le message
    L'une de mes interrogations est là, penses-tu que cela puisse venir du code alors que l'erreur quadratique diminue normalement ?
    Bonne question... Si tu la trace, tu obtiens bien une courbe décroissante? Ou plutôt convergente, non oscillante ou divergente (pour le dernier cas je suppose fortement que non)

    Citation Envoyé par Courieux Voir le message
    J'ai bon ?
    ça me parait bon, sauf pour la lisibilité

    Autre question:
    L'erreur de classification et l'erreur quadratique sont très différentes,
    - Dans l'erreur quadratique, tu regarde a quelle point tu es loin de la réponse attendu, ce qui te permet de corriger tes poids par descente de gradient. Tu fais donc une simple soustraction entre Y (sortie attendue) et Y_hat (prédiction).

    - Dans le cas de l'erreur de classification tu regarde si oui ou non la donnée est bien classée (cas simple a deux classes).
    -> Dans ton cas tu cherche a savoir si la sortie est oui:+, ou non:-. En gros tu dois regarder si la fonction sign() te "renvoie" la bonne classe ou non (le bon signe).
    En gros tu ne compare pas 1-0.42 mais 1-sign(0.42).
    Dans le cas ou tu as plus de deux classes (et si tu ne fais pas du un contre tous), il faut comparer la sortie attendu avec le maximum de vraisemblance, mais nous nous éloignons de ma question:
    Comment calcul tu ta moyenne d'erreur en prédiction?
    -moy_i(Y_j-Y_hat_ij)
    ou
    -moy_i(Y_j-sign(Y_hat_ij))

    Tcho.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 14
    Par défaut
    Citation Envoyé par Clercq Voir le message
    Va pour la formule générale, mais pour ma défense, on est la pour comprendre ton cas spécifique
    Oui oui c'est ma faute.
    En fait j'ai dis une bêtise. Dans mon programme je faisais effectivement la somme de (sortie_attendue - sortie_obtenue) pour chaque coupe entrée/sortie après quelques cycles de correction.

    Bonne question... Si tu la trace, tu obtiens bien une courbe décroissante? Ou plutôt convergente, non oscillante ou divergente (pour le dernier cas je suppose fortement que non)
    Concernant l'erreur quadratique (calculée comme dit précemment), il s'agit d'une courbe strictement décroissante.
    Et en ce concerne l'erreur de classification, elle oscille entre 50% et 49%

    - Dans l'erreur quadratique, tu regarde a quelle point tu es loin de la réponse attendu, ce qui te permet de corriger tes poids par descente de gradient.
    Donc par définition si l'erreur quadratique est faible, je devrais être proche des réponses attendues, or ce n'est pas le cas... Il y a-t-il vraiment quelque chose que je ne comprends pas ?


    - Dans le cas de l'erreur de classification tu regarde si oui ou non la donnée est bien classée (cas simple a deux classes).
    -> Dans ton cas tu cherche a savoir si la sortie est oui:+, ou non:-. En gros tu dois regarder si la fonction sign() te "renvoie" la bonne classe ou non (le bon signe).
    En gros tu ne compare pas 1-0.42 mais 1-sign(0.42).
    Je comprends ce que tu veux dire par erreur de classification, mais cela n'est alors pas la réelle erreur du réseau, sauf si la fonction d'activation de la couche de sortie est Heaviside, non ? Actuellement, j'ai une couche cachée à 2 ou 3 neurones et une couche de sortie à un neurone où tous ont la fonction d'activation de sigmoide.

    Comment calcul tu ta moyenne d'erreur en prédiction?
    -moy_i(Y_j-Y_hat_ij)
    ou
    -moy_i(Y_j-sign(Y_hat_ij))
    Si je comprends bien ce que tu écris, j'utilise "moy_i(Y_j-Y_hat_ij)" soit moyenne des sorties_désirée - sorties_obtenues pour chaque couple entrée/exemple.

  6. #6
    Membre éprouvé
    Inscrit en
    Mai 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 196
    Par défaut
    Citation Envoyé par Courieux Voir le message
    Donc par définition si l'erreur quadratique est faible, je devrais être proche des réponses attendues, or ce n'est pas le cas... Il y a-t-il vraiment quelque chose que je ne comprends pas ?
    Il y a en effet quelque-chose d'étrange ... L'erreur quadratique, si je ne me trompe, est la distance euclidienne au carré, et donc une évaluation de ce qui sépare la prédiction de la sortie désiré.
    Quand tu fais la somme sur un cycle, et si tes cycle sont constant, alors les erreurs quadratiques cumulées sont comparable entre elle (normalement on utilise la moy -> MSE). Si elle décroit, alors tu te rapproche de la sortie désirée (en moy), et donc... tu classifie mieux...

    IDEE LUMINEUSE, s'il en ai: tu peux très bien te rapprocher de ton but tout en étant dans la mauvaise classe... En fait tu peux te trouver n'importe où sur le cercle de centre sortie désirée.

    Donc en fait tu ne classifie pas forcement mieux, tu te rapproche, mais ça ne veux pas dire que tu y arrive...

    Citation Envoyé par Courieux Voir le message
    Je comprends ce que tu veux dire par erreur de classification, mais cela n'est alors pas la réelle erreur du réseau, sauf si la fonction d'activation de la couche de sortie est Heaviside, non ? Actuellement, j'ai une couche cachée à 2 ou 3 neurones et une couche de sortie à un neurone où tous ont la fonction d'activation de sigmoide.
    Je n'ai jamais utilisé la fonction d'activation Heavyside , j'ai appris les réseaux de neurone avec les fonctions sigmoïde ou tangente hyperbolique.
    Les réseaux de neurones peuvent être utilisé dans deux domaines différents:
    - La classification, où l'on cherche à "ranger" des séparées les données.
    - L'apprentissage de fonction, où l'on cherche à prédire le résultat d'une fonction (apprentissage de modèle cinématique par exemple).
    Dans ton cas, tu fais de la classification. Tu ne cherche donc pas réellement à comparer la sortie prédite avec la sortie désiré, mais la classe prédite avec la classe désirée. Et donc tu compare le signe de ta prédiction avec le signe de la classe désirée.

    Citation Envoyé par Courieux Voir le message
    Si je comprends bien ce que tu écris, j'utilise "moy_i(Y_j-Y_hat_ij)" soit moyenne des sorties_désirée - sorties_obtenues pour chaque couple entrée/exemple.
    J'avoue que c'est super mal écris... Mais en effet, le critère d'arrêt porte non pas sur l'erreur quadratique, mais sur l'erreur de classification. Comme erreur de classification on prends l'erreur moyenne pour un cycle entier.
    Par contre il faut comparer les signes, et n'ont pas la valeur.

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/04/2009, 13h57
  2. rétro-propagation du gradient
    Par vincent.mbg dans le forum Méthodes prédictives
    Réponses: 8
    Dernier message: 08/09/2008, 15h14
  3. Réponses: 1
    Dernier message: 22/02/2008, 13h22
  4. Réponses: 1
    Dernier message: 02/05/2007, 11h40
  5. Questions sur le chargement de l'OS dans le disque dur
    Par beegees dans le forum Composants
    Réponses: 8
    Dernier message: 01/03/2007, 14h26

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