Resilient backpropagation neural network - question about gradient
        Posted  
        
            by Raf
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Raf
        
        
        
        Published on 2010-05-19T11:34:54Z
        Indexed on 
            2010/05/19
            14:40 UTC
        
        
        Read the original article
        Hit count: 554
        
Hello Guys,
First I want to say that I'm really new to neural networks and I don't understand it very good ;)
I've made my first C# implementation of the backpropagation neural network. I've tested it using XOR and it looks it work.
Now I would like change my implementation to use resilient backpropagation (Rprop - http://en.wikipedia.org/wiki/Rprop).
The definition says: "Rprop takes into account only the sign of the partial derivative over all patterns (not the magnitude), and acts independently on each "weight".
Could somebody tell me what partial derivative over all patterns is? And how should I compute this partial derivative for a neuron in hidden layer.
Thanks a lot
UPDATE:
My implementation base on this Java code: www_.dia.fi.upm.es/~jamartin/downloads/bpnn.java
My backPropagate method looks like this:
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;
    }
So can I use  change = hidden_deltas[j] * activationsInputs[i] variable as a gradient (partial derivative) for checking the sing?
© Stack Overflow or respective owner