弹性反向传播神经网络 - 关于梯度的问题
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 是对其工作方式和原因的更数学描述 谢谢。你帮了我很多以上是关于弹性反向传播神经网络 - 关于梯度的问题的主要内容,如果未能解决你的问题,请参考以下文章