神经网络回溯重量调整

时间:2018-06-06 18:16:20

标签: java neural-network backtracking perceptron

我试图建立一个简单的多层感知器神经网络 它有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());
}

0 个答案:

没有答案