我正在尝试使用反向传播实现一个两层感知器来解决奇偶问题。该网络有4个二进制输入,第一层有4个隐藏单元,第二层有1个输出。我参考这个链接,但是收敛方面出现了问题。
首先,我想指出我在使用sigmoid函数进行激活,所以导数是(据我理解)sigmoid(v) * (1 - sigmoid(v))。因此,在计算delta值时会使用该值。
所以,基本上我设置了网络并运行了几个周期(遍历每种可能的模式——在这种情况下,是16种输入模式)。第一个周期后,权重会稍微改变。第二个周期后,权重不再改变,无论我再运行多少个周期。目前,我使用学习率为0.1和偏置为+1。
以下是训练网络的伪代码过程(根据我查阅的资料,我认为它是正确的):
前馈步骤:
当然,这个过程在时期中循环,并且重量的变化是持久的。我的问题是,在第二个时期之后,是否有任何理由使权重保持不变?如果需要,我可以发布我的代码,但此时我希望能发现一些明显的问题。谢谢!编辑:以下是我的代码链接,如sarnold所建议的:
MLP.java:http://codetidy.com/1903
Neuron.java:http://codetidy.com/1904
Pattern.java:http://codetidy.com/1905
input.txt:http://codetidy.com/1906
首先,我想指出我在使用sigmoid函数进行激活,所以导数是(据我理解)sigmoid(v) * (1 - sigmoid(v))。因此,在计算delta值时会使用该值。
所以,基本上我设置了网络并运行了几个周期(遍历每种可能的模式——在这种情况下,是16种输入模式)。第一个周期后,权重会稍微改变。第二个周期后,权重不再改变,无论我再运行多少个周期。目前,我使用学习率为0.1和偏置为+1。
以下是训练网络的伪代码过程(根据我查阅的资料,我认为它是正确的):
前馈步骤:
v = SUM[weight connecting input to hidden * input value] + bias
y = Sigmoid(v)
set hidden.values to y
v = SUM[weight connecting hidden to output * hidden value] + bias
y = Sigmoid(v)
set output value to y
输出层的反向传播:
error = desired - output.value
outputDelta = error * output.value * (1 - output.value)
隐藏层的反向传播:
for each hidden neuron h:
error = outputDelta * weight connecting h to output
hiddenDelta[i] = error * h.value * (1 - h.value)
更新权重:
for each hidden neuron h connected to the output layer
h.weight connecting h to output = learningRate * outputDelta * h.value
for each input neuron x connected to the hidden layer
x.weight connecting x to h[i] = learningRate * hiddenDelta[i] * x.value
当然,这个过程在时期中循环,并且重量的变化是持久的。我的问题是,在第二个时期之后,是否有任何理由使权重保持不变?如果需要,我可以发布我的代码,但此时我希望能发现一些明显的问题。谢谢!编辑:以下是我的代码链接,如sarnold所建议的:
MLP.java:http://codetidy.com/1903
Neuron.java:http://codetidy.com/1904
Pattern.java:http://codetidy.com/1905
input.txt:http://codetidy.com/1906