gpt4 book ai didi

artificial-intelligence - 弹性反向传播中的错误?

转载 作者:行者123 更新时间:2023-12-04 08:43:31 26 4
gpt4 key购买 nike

我正在努力正确实现弹性传播。我已经实现了反向传播算法来训练神经网络,它按预期用于 XOR-Net,即需要大约 600 个纪元才能将误差降至 1% 以下。现在我尝试针对相同的问题实现弹性传播 (http://en.wikipedia.org/wiki/Rprop),并且对于前几个 Epochs,错误率迅速下降到 23%,但随后上升到 50% 并保持在那里。
我完全按照 http://www.heatonresearch.com/book/introduction-neural-network-math.html 中的描述实现了它,但这是一个令人费解的描述:据我所知,它不同于维基百科 Rprop-Page 和 encog 中的实现,后者与本书由同一作者编写。我也已经尝试了来自不同来源的不同实现,但没有任何效果。

各种来源之间的一些差异:

  • 使用 signum(currentPartialDerivative) 而不是 signum(currentPartialDerivative * previousPartialDerivative) 来计算权重变化
  • 使用上次的权重变化,而不是新的权重变化的新更新值
  • 首先计算权重变化,然后计算新的更新值

实现这个的正确方法是什么?随后按照书上的实现:

public ResilientPropagation() {
initialUpdateValue = 0.01;
deltaMaximum = 50;
deltaMinimum = 0.000001;
negativeEta = 0.5;
positiveEta = 1.2;
double zeroTolerance = 0.0000000000000001;
signum = new Signum(zeroTolerance);

init();
}

@Override
public double calculateWeightChange(Synapse synapse, double partialDerivative) {
if (!synapseValues.containsKey(synapse)){
double initialPartialDerivative = 0;
synapseValues.put(synapse, new SynapseValues(initialUpdateValue, initialPartialDerivative));
}

SynapseValues values = synapseValues.get(synapse);
double signChange = signum.value(values.lastPartialDerivative * partialDerivative);
values.lastPartialDerivative = partialDerivative;
double weightChange = 0;
if (signChange > 0){
newUpdateValue = Math.min(positiveEta * values.updateValue, deltaMaximum);
weightChange = -1*newUpdateValue;
} else if (signChange < 0){
newUpdateValue = Math.max(negativeEta * values.updateValue, deltaMinimum);
weightChange = newUpdateValue;
} else {
newUpdateValue = values.updateValue;
double weightChange = 0;
}
values.updateValue = newUpdateValue;
return weightChange;
}

正常反向传播的相同方法工作正常:

@Override
public double calculateWeightChange(Synapse synapse, double partialDerivative) {
double previousChange = previousWeightChange.get(synapse) != null ? previousWeightChange.get(synapse) : 0;
double weightChange = learningRate * partialDerivative + momentum * previousChange;
previousWeightChange.put(synapse, weightChange);
return weightChange;
}

最佳答案

RPROP 算法有几种不同的变体。自该书出版以来,Encog 已被修改以支持更多。本书重点介绍 Reidmiller 的一篇论文所定义的经典 RPROP。随后的论文提出了额外的算法。这解释了 Encog 的优化 RPROP 算法与书中描述的算法之间的一些差异。

查看上面的代码,我有一些建议可能会有所帮助。大多数情况下,我不确定您的最终 else 子句。你有“double weightChange = 0”,它什么都不做。我认为你需要删除双。您还需要对“零”是什么建立一定的容忍度。梯度的变化很少会精确地达到零,所以我会建立一些大约为零的范围,可能是 -0.00001 到 +0.00001,以便触发 else 子句。然后确保将 weightChange 实际设置为零。

我从自己的 rprop 实现中记忆起的另一个问题是,用于反向传播的梯度的符号是用于反向传播的梯度的反符号。您可以尝试翻转 RPROP 的梯度符号,这在我的 Encog 实现中是必需的。

RPROP 的这个实现可能对您有用,它是经典的 Reidmiller 实现。它确实正常运行并且错误收敛。

https://github.com/encog/encog-java-core/blob/master/src/main/java/org/encog/neural/freeform/training/FreeformResilientPropagation.java

不确定这是否有帮助。在不运行代码的情况下,这就是我所看到的。

关于artificial-intelligence - 弹性反向传播中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27334121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com