2010-05-19 12 views
4

D'abord, je veux dire que je suis vraiment nouveau pour les réseaux de neurones et je ne comprends pas très bien;)résiliente rétropropagation réseau de neurones - question sur gradient

J'ai fait ma première implémentation C# du réseau de neurones de rétropropagation. Je l'ai testé en utilisant XOR et il semble que ça marche.

Maintenant, je voudrais changer mon implémentation pour utiliser la rétropropagation résiliente (Rprop - http://en.wikipedia.org/wiki/Rprop).

La définition dit: « RPROP prend en compte que le signe de la dérivée partielle sur tous les modèles (pas l'ampleur), et agit indépendamment sur chaque « poids »

Quelqu'un pourrait-il me dire ce dérivé partiel sur. tous les modèles et comment dois-je calculer cette dérivée partielle pour un neurone dans la couche cachée

Merci un lot

MISE à JOUR:.

Ma base de mise en œuvre sur ce code Java: www_.dia.fi. upm.es/~jamartin/downloads/bpnn.java

Ma méthode de backPropagate ressemble à ceci:

public double backPropagate(double[] targets) 
    { 
     double error, change; 

     // calculate error terms for output 
     double[] output_deltas = new double[outputsNumber]; 

     for (int k = 0; k < outputsNumber; k++) 
     { 

      error = targets[k] - activationsOutputs[k]; 
      output_deltas[k] = Dsigmoid(activationsOutputs[k]) * error; 
     } 

     // calculate error terms for hidden 
     double[] hidden_deltas = new double[hiddenNumber]; 

     for (int j = 0; j < hiddenNumber; j++) 
     { 
      error = 0.0; 

      for (int k = 0; k < outputsNumber; k++) 
      { 
       error = error + output_deltas[k] * weightsOutputs[j, k]; 
      } 

      hidden_deltas[j] = Dsigmoid(activationsHidden[j]) * error; 
     } 

     //update output weights 
     for (int j = 0; j < hiddenNumber; j++) 
     { 
      for (int k = 0; k < outputsNumber; k++) 
      { 
       change = output_deltas[k] * activationsHidden[j]; 
       weightsOutputs[j, k] = weightsOutputs[j, k] + learningRate * change + momentumFactor * lastChangeWeightsForMomentumOutpus[j, k]; 
       lastChangeWeightsForMomentumOutpus[j, k] = change; 

      } 
     } 

     // update input weights 
     for (int i = 0; i < inputsNumber; i++) 
     { 
      for (int j = 0; j < hiddenNumber; j++) 
      { 
       change = hidden_deltas[j] * activationsInputs[i]; 
       weightsInputs[i, j] = weightsInputs[i, j] + learningRate * change + momentumFactor * lastChangeWeightsForMomentumInputs[i, j]; 
       lastChangeWeightsForMomentumInputs[i, j] = change; 
      } 
     } 

     // calculate error 
     error = 0.0; 

     for (int k = 0; k < outputsNumber; k++) 
     { 
      error = error + 0.5 * (targets[k] - activationsOutputs[k]) * (targets[k] - activationsOutputs[k]); 
     } 

     return error; 
    } 

Alors puis-je utiliser la variable change = hidden_deltas[j] * activationsInputs[i] comme un gradient (dérivée partielle) pour le contrôle de la chanter?

+0

J'ai passé hier soir à débugger mon implémentation et je commence à m'inquiéter de ne pas comprendre cet algorithme. Connaissez-vous une bonne description de celui-ci? –

Répondre

2

Je pense que le « sur tous les modèles » signifie simplement « à chaque itération » ... jeter un oeil à la RPROP paper

Pour le dérivé paritial: vous avez déjà implémenté l'algorithme de rétro-propagation normale. C'est une méthode pour calculer efficacement le gradient ... là vous calculez les valeurs δ pour les neurones simples, qui sont en fait les valeurs négatives ∂E/∂w, c'est-à-dire la dérivée paritaire de l'erreur globale en fonction des poids.

donc au lieu de multiplier les poids avec ces valeurs, vous prenez une des deux constantes (η + ou η-), selon que le signe a changé

+0

Souhaitez-vous être si gentil et regarder mon code (ci-dessus) et dites-moi si je pense correct –

+0

Oui, la valeur de changement est la dérivée partielle. Selon son changement de signe, un autre facteur est utilisé pour mettre à jour le changement de poids (voir l'équation 4-7 dans l'article que j'ai lié car il y a d'autres règles ... Les valeurs de ∂E/∂w sont votre changement variables) –

+0

Je pense que http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_fr/backprop.html explique assez bien l'idée de la rétropropagation.http://www.learnartificialneuralnetworks.com/backpropagation.html est une description plus mathématique de comment et pourquoi cela fonctionne –

1

Voici un exemple d'une partie d'une mise en œuvre de la technique de formation RPROP dans la bibliothèque d'intelligence artificielle Encog. Cela devrait vous donner une idée de la façon de procéder. Je recommande de télécharger la bibliothèque entière, car il sera plus facile de passer par le code source dans un IDE plutôt que via l'interface svn en ligne.

http://code.google.com/p/encog-cs/source/browse/#svn/trunk/encog-core/encog-core-cs/Neural/Networks/Training/Propagation/Resilient

http://code.google.com/p/encog-cs/source/browse/#svn/trunk

Notez le code est en C#, mais ne devrait pas être difficile à traduire dans une autre langue.

+0

Thx, je vais essayer de revoir cette solution –

+0

J'ai une question de suivi que j'ai [posté ici] (http://stackoverflow.com/questions/12146986/part-2-resilient- backpropagation-neural-network). C'est juste moi essayant d'obtenir une compréhension claire de la façon dont la dérivée partielle fonctionne pour un NN. Toutes les idées ont apprécié. – Nutritioustim