首先,我想说我是神经网络的新手,我不太了解它;)
我已经完成了第一个反向传播神经网络的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]
变量作为渐变(偏导数)来检查唱歌吗?
2 回答
以下是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#中,但不应该很难翻译成另一种语言 .
我认为"over all patterns"只是意味着"in every iteration" ...看看RPROP paper
对于paritial导数:你已经实现了正常的反向传播算法 . 这是一种有效计算梯度的方法......在那里你计算单个神经元的δ值,实际上是负的∂E/∂w值,即全局误差的数据导数作为权重的函数 .
因此,不是将权重乘以这些值,而是取两个常数之一(η或η-),具体取决于符号是否已更改