首先,我想说我真的是神经网络的新手,我不太了解它;)

我已经做出了第一个C#对反向传播神经网络的实现。我已经使用XOR对其进行了测试,看起来它起作用了。

现在,我希望更改实施方式以使用弹性反向传播(RPROP- http://en.wikipedia.org/wiki/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;
    }

所以我可以使用 change = hidden_deltas[j] * activationsInputs[i] 可变为检查唱片的梯度(部分导数)?

有帮助吗?

解决方案

我认为“所有模式”仅表示“在每次迭代中” ...看看 Rprop纸

对于Paritial derivative:您已经实现了正常的背传算法。这是一种有效计算梯度的方法...您在那里计算单个神经元的δ值,实际上,这实际上是负∂E/∂W值,即全局误差作为权重的函数的独立衍生物。

因此,取决于符号是否已更改

其他提示

以下是包含人工智能库中RPROP培训技术实施的一部分的示例。它应该让您了解如何进行。我建议下载整个库,因为在IDE中而不是通过在线SVN界面中浏览源代码会更容易。

http://code.google.com/p/encog-cs/source/browse/#svn/trunk/encog-core/encog-core/encog-core-core-core-core-core-core-core-core-core-core-core/networks/training/propagation/resilient

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

注意代码在C#中,但不难转换为另一种语言。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top