Neural network 弹性反向传播神经网络-梯度问题

Neural network 弹性反向传播神经网络-梯度问题,neural-network,backpropagation,Neural Network,Backpropagation,首先我想说的是,我对神经网络非常陌生,我对它的理解不是很好;) 我第一次用C#实现了反向传播神经网络。我用XOR测试了它,它看起来很有效 现在我想将我的实现更改为使用弹性反向传播(Rprop-) 该定义说:“Rprop只考虑所有模式的偏导数符号(而不是幅度),并独立作用于每个“权重” 有人能告诉我所有模式的偏导数是什么吗?我该如何计算隐藏层神经元的偏导数 非常感谢 更新: 我的实现基于以下Java代码:www.dia.fi.upm.es/~jamartin/downloads/bpnn.Java

首先我想说的是,我对神经网络非常陌生,我对它的理解不是很好;)

我第一次用C#实现了反向传播神经网络。我用XOR测试了它,它看起来很有效

现在我想将我的实现更改为使用弹性反向传播(Rprop-)

该定义说:“Rprop只考虑所有模式的偏导数符号(而不是幅度),并独立作用于每个“权重”

有人能告诉我所有模式的偏导数是什么吗?我该如何计算隐藏层神经元的偏导数

非常感谢

更新:

我的实现基于以下Java代码:www.dia.fi.upm.es/~jamartin/downloads/bpnn.Java

我的反向传播方法如下所示:

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;
    }
公共双反向传播(双[]目标)
{
双重错误,改变;
//计算输出的错误项
double[]output_delta=新的double[outputsNumber];
对于(int k=0;k
因此,我可以使用
change=hidden_delta[j]*activationsInputs[I]
变量作为梯度(偏导数)来检查sing吗?

我认为“所有模式”只是指“在每次迭代中”…看看

对于偏导数:您已经实现了正常的反向传播算法。这是一种有效计算梯度的方法…在这里您计算单个神经元的δ值,实际上是负值∂E/∂w值,即作为权重函数的全局误差的水平导数


因此,不要将权重与这些值相乘,而是取两个常数中的一个(η+或η-),取决于符号是否已更改,以下是Encog人工智能库中RPROP培训技术实现的一部分示例。它应该让您了解如何继续。我建议下载整个库,因为在IDE中查看源代码更容易而不是通过在线svn界面


请注意,代码是C#,但翻译成另一种语言应该不难。

Thx,我将尝试回顾此解决方案。我有一个后续问题。我只是想清楚地了解偏导数是如何对NN起作用的。任何见解都值得欣赏。您能赏心悦目地看一下我的代码吗(如上)如果我的想法正确,请告诉我是的,变化值是偏导数。根据其符号变化,另一个因子用于更新权重变化(参考我链接的论文中的等式4-7,因为还有一些规则…)∂E/∂w值是您的更改变量)我认为这很好地解释了反向传播的概念。这是一个关于它如何工作以及为什么工作的更数学的描述。谢谢你。你帮了我很多忙。我昨天晚上花了很多时间调试我的实现,我担心我不懂这个算法。你知道有什么好的描述吗?