6

首先我想说我对神经网络真的很陌生,而且我不太了解它;)

我已经完成了反向传播神经网络的第一个 C# 实现。我已经使用 XOR 对其进行了测试,它看起来可以正常工作。

现在我想改变我的实现以使用弹性反向传播(Rprop - http://en.wikipedia.org/wiki/Rprop)。

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

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

非常感谢

更新:

我的实现基于此 Java 代码:www_.dia.fi.upm.es/~jamartin/downloads/bpnn.java

我的 backPropagate 方法如下所示:

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]变量作为梯度(偏导数)来检查唱歌吗?

4

2 回答 2

3

我认为“所有模式”只是意味着“在每次迭代中”......看看RPROP 论文

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

因此,不要将权重与这些值相乘,而是取两个常数(η+ 或 η-)之一,具体取决于符号是否已更改

于 2010-05-19T12:10:01.593 回答
1

以下是 Encog 人工智能库中 RPROP 训练技术的部分实现示例。它应该让您了解如何进行。我建议下载整个库,因为在 IDE 中浏览源代码比通过在线 svn 界面更容易。

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

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

于 2010-05-19T12:24:45.687 回答