gpt4 book ai didi

backpropagation - 使用反向传播算法实现感知器

转载 作者:行者123 更新时间:2023-12-04 20:18:32 25 4
gpt4 key购买 nike

我正在尝试使用反向传播实现两层感知器来解决奇偶校验问题。该网络有 4 个二进制输入,第一层有 4 个隐藏单元,第二层有 1 个输出。我正在使用 this供引用,但在收敛方面有问题。

首先,我会注意到我使用 sigmoid 函数进行激活,因此导数是(据我所知)sigmoid(v) * (1 - sigmoid(v))。因此,在计算 delta 值时会使用它。

所以,基本上我设置了网络并运行了几个时期(遍历每个可能的模式——在这种情况下,有 16 种输入模式)。在第一个 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
模式.java: http://codetidy.com/1905
输入.txt: http://codetidy.com/1906

最佳答案

我想我发现了问题;有趣的是,我发现的内容在您的高级描述中可见,但我只发现代码中看起来很奇怪的内容。一、说明:

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


相信 h.weight应该相对于之前的权重进行更新。您的更新机制仅根据学习率、输出增量和节点值来设置它。同样, x.weight还根据学习率、隐藏增量和节点值进行设置:
    /*** Weight updates ***/

// update weights connecting hidden neurons to output layer
for (i = 0; i < output.size(); i++) {
for (Neuron h : output.get(i).left) {
h.weights[i] = learningRate * outputDelta[i] * h.value;
}
}

// update weights connecting input neurons to hidden layer
for (i = 0; i < hidden.size(); i++) {
for (Neuron x : hidden.get(i).left) {
x.weights[i] = learningRate * hiddenDelta[i] * x.value;
}
}

我不知道正确的解决方案是什么;但我有两个建议:
  • 替换这些行:
            h.weights[i] = learningRate * outputDelta[i] * h.value;
    x.weights[i] = learningRate * hiddenDelta[i] * x.value;

    用这些行:
            h.weights[i] += learningRate * outputDelta[i] * h.value;
    x.weights[i] += learningRate * hiddenDelta[i] * x.value;

    ( += 而不是 = 。)
  • 替换这些行:
            h.weights[i] = learningRate * outputDelta[i] * h.value;
    x.weights[i] = learningRate * hiddenDelta[i] * x.value;

    用这些行:
            h.weights[i] *= learningRate * outputDelta[i];
    x.weights[i] *= learningRate * hiddenDelta[i];

    (忽略该值并简单地缩放现有权重。对于此更改,学习率应为 1.05 而不是 .05。)
  • 关于backpropagation - 使用反向传播算法实现感知器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9169280/

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