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?
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? –