反向传播算法停留在MultiLayer感知器

时间:2017-02-22 14:49:18

标签: python algorithm machine-learning neural-network

我想实现一个MLP(MultiLayer Perceptron)来解决XOR问题。很长一段时间以来,我一直在抨击它,因为我不是一个伟大的科学家,我想确保理解这个项目的每一行。

我将从问题开始:

  1. 是否有特定的方法来调试神经网络? (例如导致预期解决方案的预定义已知权重)
  2. 以下反向传播算法(伪代码)正确
  3. 偏见应该在此算法中吗?如果不是,解决XOR问题需要的偏见是什么?如果是,那么每个神经元的偏差是1,每层1个还是每个网络1个?
  4. 我的python实现是否正确?如果不是,它是关于反向传播,前向传播,偏差缺失还是其他?
  5. 非常欢迎每一个回复。这不是“家庭作业”,但如果你非常害怕它,我会非常满意只有好的提示。我仍然没有使用正确的numpy,因为我更像是一个开发人员而不是科学家,并且有时会遇到矩阵方程式问题(我正在研究它)。因此,我很难理解我发现的不同实现。

    编辑:该算法现在运行正常,我将重点介绍伪代码/ python实现中存在的不同问题:

    理论

    • 权重调整中的伪代码错误(我编辑了代码以用修正标记WRONG行)。我使用了输出层输出,我应该使用输入值
    • 有效可以解决无偏差的XOR问题并且只有1个隐藏层。这里有趣的是它只适用于隐藏层中的4个神经元或更多,但不适用于3.但是,在基准测试之后,添加偏差可以大大加快达到最佳收敛的时间(5倍速或更多)

    python实现

    • 权重在0和1之间随机初始化,而不是在-1和1之间,它不能像这样工作。

    最后,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]
    

1 个答案:

答案 0 :(得分:0)

  

我很长时间以来因为我不是一个伟大的人而对此感到沮丧   科学家,我想确保理解每一行   程序

你得到了我的答案。像这样继续,你会摇滚!

免责声明:部分答案。我可以随着时间改进它。

  

是否有调试神经网络的特定方法? (如   导致预期解决方案的预定义已知权重)

一般没有。由于重量的数量,在大多数真实情况下几乎是不可能的。您仍然可以尝试监控神经元活动(代码中的aggregated变量),例如连续两次发送网络相似的输入并查看它是否学习,即它越来越接近正确的值。

  

以下反向传播算法(伪代码)是否正确?

会尝试检查。是你的吗?

  

此算法中是否存在偏差?如果没有,是否需要偏见   解决XOR问题?如果是的话,偏差应该是1   神经元,每层1个或每个网络1个?

通常每个神经元有1个biais。如果你忽略它就没问题。

  

我的python实现是否正确?如果没有,是关于   反向传播,前向传播,偏差缺失或   othe?

会检查。偏见缺席是可以的。

作为一个脚注,我会推荐这个在线“书”:http://neuralnetworksanddeeplearning.com/chap1.html这里有很多数学,不要把时间花在数学上,试着去理解这个概念。我发现它超级教诲。

希望它有所帮助(有点)
pltrdy