弹性反向传播神经网络 - 关于梯度的问题

Posted

技术标签:

【中文标题】弹性反向传播神经网络 - 关于梯度的问题【英文标题】:Resilient backpropagation neural network - question about gradient 【发布时间】:2011-02-21 08:16:39 【问题描述】:

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

我已经完成了反向传播神经网络的第一个 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] 变量作为梯度(偏导数)来检查唱歌吗?

【问题讨论】:

我昨天晚上一直在调试我的实现,但我担心我不理解这个算法。你知道它有什么好的描述吗? 【参考方案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# 编写的,但翻译成另一种语言应该不难。

【讨论】:

谢谢,我会尝试查看此解决方案 我有一个后续问题posted here。只是我试图清楚地了解偏导数如何为 NN 工作。任何见解都值得赞赏。【参考方案2】:

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

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

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

【讨论】:

你能不能好心看看我的代码(上图)并告诉我我的想法是否正确 是的,变化值是偏导数。根据其符号变化,另一个因素用于更新权重变化(请参阅我链接的论文中的 eq. 4-7,因为还有更多规则......∂E/∂w 值是您的变化变量) 我认为galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html 很好地解释了反向传播的概念。 learnartificialneuralnetworks.com/backpropagation.html 是对其工作方式和原因的更数学描述 谢谢。你帮了我很多

以上是关于弹性反向传播神经网络 - 关于梯度的问题的主要内容,如果未能解决你的问题,请参考以下文章

cs231n 误差反向传播

反向传播

神经网络和深度学习笔记 - 第二章 反向传播算法

深度学习梯度下降和反向传播原理

详解神经网络中反向传播和梯度下降

详解神经网络中反向传播和梯度下降