我正在尝试使用反向传播实现两层感知器来解决奇偶校验问题。该网络有 4 个二进制输入,第一层有 4 个隐藏单元,第二层有 1 个输出。我将其用作参考,但在收敛方面存在问题。
首先,我会注意到我使用 sigmoid 函数进行激活,因此导数是(据我了解)sigmoid(v) * (1 - sigmoid(v))。因此,在计算 delta 值时使用它。
所以,基本上我设置了网络并运行了几个 epoch(遍历每个可能的模式——在这种情况下,16 个输入模式)。在第一个 epoch 之后,权重略有变化。在第二个之后,无论我运行多少个 epoch,权重都不会改变并保持不变。我现在使用 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