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 :

[Réseaux de neurones] Algorithme de rétropropagation


Sujet :

Méthodes prédictives

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [Réseaux de neurones] Algorithme de rétropropagation
    Bonjour,
    Cela fait plusieurs jours que j'essaye d'implémenter un algorithme de retro-propagation du gradient sur un réseau de neurones de type perceptron multicouches, sans succès.
    Mon domaine étant plus le code que les notations mathématiques, j'éprouve quelques difficultés à déchiffrer celles-ci.
    J'ai actuellement un réseau de neurone à taille et a nombre de couche dynamique. Celui-ci s'exécute correctement, mais cela ne sert pas a grand chose sans l'algo d'apprentissage qui va avec !
    Ce que je pense avoir compris à propos de la retro-propagation:
    On part de la dernière couche (output layer) et on analyse les différences entre l'output voulue et l'output obtenu. J'ai décidé d'utiliser pour cela la fonction tangente hyperbolique.
    Cela donne : g'(resultatAttendu) - g'(resultatActuel) avec g' = tanh' = 1 - tanh
    Cela me donne une représentation numérique de l'erreur qui est censée être propagée selon la responsabilité de chaque neurone sur l'erreur grâce a la formule :

    Je recalcule ensuite mes poids grâce la formule :

    Un premier problème semble apparaitre : les poids ne font que descendre jusqu'à atteindre 0.
    Mon code est de ce type pour l'apprentissage d'un XOR
    Creation réseau (2, 2, 1)
    while (NombreEssaisJuste d'affilé < 1000)
    {
    input[0] = rand()%2;
    input[1] = rand()%2;
    resultat = reseau.run(input);
    if (resultat != XOR(input))
    reseau.learn(input, desiredOutput);
    }

    J'ai donc beaucoup de zones d'ombre :
    Comment choisir les poids au départ ? (entre 0 et 1 ?)
    Dans mon cas j'utilise la fonction d'activation tanh. Qu'est-ce que la zone de transition et comment savoir si un neurone s'active lorsqu'il est proche de 0 ? ( actuellement mon neurone s'active si tanh(valeur) > 0. La valeur étant la somme des poids synaptiques multipliée par 0 ( si le neurone est activé ) ou 1( dans le cas contraire )))
    Mes poids doivent-ils changer dans le cas ou le résultat de mon réseau est juste ? Si oui, selon quelle formule ( car actuellement, je calcule l'erreur, donc 0 dans le cas ou l'output est juste, et j'applique le calcul ci dessus soit erreur * coef d'apprentissage * xj, ce qui fait 0 et donc réduit mon poids à 0... ) ?
    Le biais, ou threshold ou seuil, est-il une variable contenue dans le neurone définissant le seuil a dépasser ? Si oui, comment dois-je l'initialiser et le corriger ?
    Dois-je corriger tous les poids avant de les mettre à jour ?
    Actuellement mes entrées et sorties sont des bits (bool), mais est-il possible d'utiliser un double par exemple ?
    Ce type de réseau est-il adapté pour faire une IA, pour un jeu par exemple ? ( actuellement, j'essaye de lui faire apprendre un xor avec un réseau a 2 entrées, 2 neurones cachés, et 1 sortie, donc j'en suis loin ).
    Comment faire en sorte que son réseau puisse prendre un nombre d'entrées variable ?
    C’est à dire que mon nombre d'entrées augmente au fur et à mesure ? (quid des nouveau poids ?)
    Comment comparer une sortie à un résultat lorsque nous ne savons pas ce que nous voulons obtenir directement ? ( Encore une fois, dans un jeu, je ne sais pas directement si l'action que le réseau a fait va contribuer à la victoire/défaite de celui-ci)

    Malgré toute la doc que j'ai lu, j'ai l'impression que ceux qui expliquent ces réseaux ne s'adressent qu'a des mathématiciens. Les rares exemples clairs que j'ai trouvés m'ont permis d'améliorer ma compréhension énormément !
    Je pourrais fournir mon code, mais l'idéal serait une explication d'un cas concret comme celui du XOR, avec un tour d'application de l'algorithme de rétro-propagation.


    Merci d'avance, je suis preneur de tout lien (anglais ou français) pouvant m'aider (si possible sans trop de notations complexes).

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,

    Ceci pourrait répondre à beaucoup de tes questions: Introduction aux Réseaux de Neurones Artificiels Feed Forward
    L'algo d'Apprentissage par descente de gradient est donné en pseudo-code, ce sera surement plus concret pour toi qui apprécie plus le code que les équations mathématiques.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Hello,
    Merci d'avoir repondu, mais j'ai déjà lu plusieurs fois ce lien. Le pseudo code n'est pas suffisant car il me manque quelque uns des éléments essentiels a la compréhension.
    Par exemple :
    On dit que le neurone est actif lorsque in >= 0, autrement dit lorsque a = g(in) >= seuilg = g(0). Similairement, on dit que le neurone est inactif lorsque in <= 0, autrement dit lorsque a = g(in) <= seuilg = g(0).

    Cela veut dire que chaque neurone a un seuil? Si oui, quand est-il corrigé? (je ne vois pas de correction de seuil dans l'algo). si in == 0 alors le neurone est actif et inactif a la fois? Ce n'est vraiment pas clair pour moi...

  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
    Les seuils sont généralement modélisés comme un poids w_0 attaché à une entrée -1, donc ils sont concernés lors de la phase de "mise à jour des poids". Et chaque neurone en a un oui :-)

    L'idée c'est que pour les fonctions d'activations qu'on utilise, bah elles ont toutes un peu la même allure: c'est en bas au début, puis à partir d'un certain "cran", ça monte pour être en haut. La montée peut être brutale (heavyside) ou douce (sigmoïde, tanh). Ce "cran" là, sur l'axe des abcisses, c'est justement le seuil.

    Dis-moi s'il y a d'autres choses qui ne sont pas claires

  5. #5
    Membre régulier Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 328
    Points : 118
    Points
    118
    Par défaut
    oui effectivement il ne faut pas combiner la fonction d'activation sigmoïde et un seuil Heavyside, c'est l'un ou l'autre
    si tu décide d'activer ton neurone à partir d'une valeur alpha, c'est du heavyside, et il n'y a pas de fonction sigmoïde à appliquer, on applique le seuil sur le produit scalaire des poids et des noeuds n-1

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Points : 208
    Points
    208
    Par défaut
    Cela veut dire que chaque neurone a un seuil? Si oui, quand est-il corrigé?
    Jamais, le seuil est déterminé au début du programme par toi.
    C'est les poids des connexions qui changent et leur cumul qui permet de déterminer si on passe le seuil ou pas.

    si in == 0 alors le neurone est actif et inactif a la fois? Ce n'est vraiment pas clair pour moi...
    Dans le cas d'un seuil Heavyside, soit on renvoit 0 soit 1, pas les deux.
    C'est donc la condition IN < 0 et non IN <= 0 qu'il faut utiliser.

    EDIT : Dis donc Gorzyne, tu as vu de quand il date le dernier message ?! Tu auras pu t'abstenir de le remonter ...

Discussions similaires

  1. [Réseaux de neurones] Algorithme de création du réseau
    Par Riless dans le forum Méthodes prédictives
    Réponses: 9
    Dernier message: 19/08/2013, 13h34
  2. Réseau de neurones - algorithme de rétropropagation
    Par BabyC dans le forum Méthodes prédictives
    Réponses: 5
    Dernier message: 18/10/2011, 20h05
  3. Réponses: 60
    Dernier message: 12/05/2011, 14h18
  4. Réseaux de neurones : Coefficient d'apprentissage dans la rétropropagation
    Par epsilon09 dans le forum Méthodes prédictives
    Réponses: 9
    Dernier message: 16/12/2009, 19h50
  5. Réseaux de neurones et rétropropagation
    Par faroukus dans le forum OpenCV
    Réponses: 1
    Dernier message: 06/08/2008, 22h28

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