美文网首页
BP算法理解+简单的Octave实现

BP算法理解+简单的Octave实现

作者: glassyw | 来源:发表于2017-09-04 23:37 被阅读180次

    BP算法是梯度下降中对链式法则的运用,但是理解算法原理却有一定难度,笔者也是通过查看各种大佬的blog,和动手纸上推算最后用代码实现才罢休,毕竟,我可是要成为强者的屠龙少女!【大雾
    所以我建议,理解BP算法可以按照以下步骤:
    1.首先要知道BP算法的本质是链式法则的运用。
    请务必仔细看完@胡逸夫 大神写的这个答案!
    如何直观地解释 back propagation 算法?
    2.理解了原理,并不一定能徒手写出算法的具体细节(emmm大佬可以不用看了),这时候需要自己写个简单的3层神经网络来手动推导下!于是我看到了 @忆臻的这个带有实例的答案。(ps:虽然我在写代码时发现了他的python代码貌似有一点点错误,以及公式的表述上也有些模糊)
    如何直观地解释 back propagation 算法?
    所以,笔者就以这位大神的例子作为实践例子。
    (具体的分析写在纸上,标注了我认为有些模糊的解释,需要详细内容可私信哦:D)
    3.写代码!这里笔者用Octave实现。
    代码如下:

    % to compute 3 layers NN
    % to make cost function minmum
    % to gradient descent 
    
    X=[0.35;0.9] %input
    Y_out=[0.5] %output of prediction
    W1=[0.1 0.8;0.4 0.6] % weight of layer 0 to layer 1
    W2=[0.3 0.9] % weight of layer 1 to layer 2
    % disp(sprintf('original: ',W1,'\n',W2)
    
    % forward propagation
    
    
    % layer 1(input X)->2
    Z2=W1*X % input of layer3
    Y2=f(Z2,0) % output of layer2
    
    % layer 2->3
    Z3=W2*Y2 % input of layer3
    Y3=f(Z3,0) %output of layer3
    
    % cost function
    C=1.0/2*(Y3-Y_out)^2
    
    % Backward propagation
    
    L3_error=Y3-Y_out
    % layer3->2
    L3_delta=L3_error*f(Y3,1).*Y2 
    L2_error=(L3_delta./Y2)*W2
    L2_delta=L2_error*f(Y2,1).*X 
    
    W2=W2-L3_delta' % update weight
    
    W1=W1-L2_delta
    
    
    
    Z2=W1*X % input of layer3
    Y2=f(Z2,0) % output of layer2
    
    % layer 2->3
    Z3=W2*Y2 % input of layer3
    Y3=f(Z3,0) %output of layer3
    
    % cost function
    C=1.0/2*(Y3-Y_out)^2
    

    最后附上运行结果:

    优化后 之前

    明显C下降了一点一点,不断迭代,直到C接近0就可以了

    相关文章

      网友评论

          本文标题:BP算法理解+简单的Octave实现

          本文链接:https://www.haomeiwen.com/subject/dsfyjxtx.html