我想实现一个MLP(MultiLayer Perceptron)来解决XOR问题。很长一段时间以来,我一直在抨击它,因为我不是一个伟大的科学家,我想确保理解这个项目的每一行。
我将从问题开始:
非常欢迎每一个回复。这不是“家庭作业”,但如果你非常害怕它,我会非常满意只有好的提示。我仍然没有使用正确的numpy,因为我更像是一个开发人员而不是科学家,并且有时会遇到矩阵方程式问题(我正在研究它)。因此,我很难理解我发现的不同实现。
编辑:该算法现在运行正常,我将重点介绍伪代码/ python实现中存在的不同问题:
理论:
python实现:
最后,this resource对于理解“神经元魔法”是一个很大的帮助。它没有帮助我调试反向传播,但它现在证明,如果没有更多的理论知识,我永远无法使它工作。如果像我一样,你不是一个开发者而不是一个科学家,我强烈建议你去看看它。
根据Virginie MATHIVET的书“开发人员的人工智能”,这里是伪传播算法的伪代码(这是一本法语书,对于糟糕的交易感到抱歉):
While stop criteria is not achieved:
Initialize d(i)
For each example:
Compute output value s(i) #1
For each output neuron weight: #2
d(i) = s(i) * (1 - s(i)) * (y(i) - s(i))
EndFor
For each hidden neuron weight:
sum = 0
For each link towards output neuron k:
sum += d(k) * w(i->k)
EndFor
d(i) = o(i) * (1 - o(i)) * sum
EndFor
For each weight of the network:
If link towards output neuron:
w(i) += rate * d(i) * o(i)
Else
w(i) += rate * d(i) * s(i) # WRONG: s(i) should be input(i)
EndIf
EndFor
EndFor
EndWhile
在上面,d(x)
是增量,o(x)
是隐藏层输出,s(x)
是输出层输出,y(x)
是预期输出和{{ 1}}是网络权重。
我理解#1 行是前向传播,#2 (包括)之后的行是反向传播即可。因此,正确的算法可以写成:
w(x)
我的问题是,使用反向传播算法并且权重发生变化,算法似乎是圆圈,例如这里是隐藏层的输出:
While stop criteria is not achieved:
Initialize d(i)
For each example:
output = Forward propagation with example inputs #1
Backpropagation of the error between output and expected output #2
EndFor
EndWhile
以随机顺序放置示例不会改变任何内容。此外,我尝试了相同结果的每个学习率(0.05到0.95),所以我认为这不是关于糟糕的收敛。这是我的Python实现:
[Epoch 0, inputs (1.0, 1.0)]: hidden outputs: None
[Epoch 0, inputs (0.0, 0.0)]: hidden outputs: [ 0.7755638 0.64556638 0.68163599]
[Epoch 0, inputs (1.0, 0.0)]: hidden outputs: [ 0.5 0.5 0.5]
[Epoch 0, inputs (0.0, 1.0)]: hidden outputs: [ 0.60747218 0.58975313 0.55246625]
[Epoch 1, inputs (1.0, 1.0)]: hidden outputs: [ 0.68911554 0.55079694 0.62718831]
[Epoch 1, inputs (1.0, 0.0)]: hidden outputs: [ 0.77449528 0.64107552 0.67770194]
[Epoch 1, inputs (0.0, 0.0)]: hidden outputs: [ 0.60728756 0.58957687 0.55230354]
[Epoch 1, inputs (0.0, 1.0)]: hidden outputs: [ 0.5 0.5 0.5]
[Epoch 2, inputs (0.0, 0.0)]: hidden outputs: [ 0.68877278 0.54872848 0.6254074 ]
[Epoch 2, inputs (1.0, 0.0)]: hidden outputs: [ 0.5 0.5 0.5]
[Epoch 2, inputs (1.0, 1.0)]: hidden outputs: [ 0.60700878 0.58812487 0.5509695 ]
[Epoch 2, inputs (0.0, 1.0)]: hidden outputs: [ 0.77344667 0.63591436 0.67311723]
[Epoch 3, inputs (0.0, 0.0)]: hidden outputs: [ 0.68856723 0.54708942 0.62400827]
[Epoch 3, inputs (1.0, 0.0)]: hidden outputs: [ 0.5 0.5 0.5]
答案 0 :(得分:0)
我很长时间以来因为我不是一个伟大的人而对此感到沮丧 科学家,我想确保理解每一行 程序
你得到了我的答案。像这样继续,你会摇滚!
免责声明:部分答案。我可以随着时间改进它。
是否有调试神经网络的特定方法? (如 导致预期解决方案的预定义已知权重)
一般没有。由于重量的数量,在大多数真实情况下几乎是不可能的。您仍然可以尝试监控神经元活动(代码中的aggregated
变量),例如连续两次发送网络相似的输入并查看它是否学习,即它越来越接近正确的值。
以下反向传播算法(伪代码)是否正确?
会尝试检查。是你的吗?
此算法中是否存在偏差?如果没有,是否需要偏见 解决XOR问题?如果是的话,偏差应该是1 神经元,每层1个或每个网络1个?
通常每个神经元有1个biais。如果你忽略它就没问题。
我的python实现是否正确?如果没有,是关于 反向传播,前向传播,偏差缺失或 othe?
会检查。偏见缺席是可以的。
作为一个脚注,我会推荐这个在线“书”:http://neuralnetworksanddeeplearning.com/chap1.html这里有很多数学,不要把时间花在数学上,试着去理解这个概念。我发现它超级教诲。
希望它有所帮助(有点)
pltrdy