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就可以了