我试图建立一个简单的多层感知器神经网络 它有4个输入节点,4个(或更多)隐藏节点和1个输出节点。
如果输入中的1的数量是奇数,则其作业是接收1或0作为输入,输出1,如果是偶数则输出0。
我几乎完成了神经网络上的所有事情,除了回溯导致我出现问题。 训练后(即使只是一次),有时错误将完全错误,有时则错误。我似乎无法理解为什么会这样做。
输出错误的示例:
输入:[0.0,1.0,1.0,0.0]
预期:0.0
结果:0.5200733581808473
错误:0.4799266418191527
错误应该显然是负面的(它不应该是0.52,因为它训练了10000次,学习率为0.1) 以下是完整的源代码:Java Source
从我能收集的内容来看,这只发生在我训练之后(即使只是一次),所以在计算渐变或重量调整时一定有问题。
我试了好几个小时才找到问题,但我似乎无法:(
这是隐藏节点计算的主要部分:
public Double activation() {
return Util.sigmoid(weightedSum());
}
private Double cost() {
return getOutputConnection().getWeight() * ((OutputNode)getOutputConnection().getOutputNode()).cost();
}
private Double derivative() {
return activation() * (1 - activation());
}
private Double weightedSum() {
Double result = 0.0;
for (NeuralConnection n : getInputConnections()) {
if (!n.isBias()) {
result += n.getValue() * n.getWeight();
} else {
result += n.getValue();
}
}
return result;
}
private Double gradient(){
return derivative() * cost() * getNetwork().getLearningRate();
}
private Double deltaWeight(NeuralConnection in){
return gradient() * in.getValue();
}
public void tweakWeights() {
for (NeuralConnection i : getInputConnections()) {
i.setWeight(i.getWeight() + deltaWeight(i));
}
}
输出节点非常相同,但代价是:
private Double cost() {
return return (getNetwork().getExpectedAnswer().doubleValue() - activation());
}