BP算法不是跟GD并列,而是GD的一种,即只是用BP可以很快的计算偏微分而已。
Back Propagaiton
Case1:
y=g(x),z=h(y);
dzdx=dzdydydx
Case2:
x=g(s),y=h(s),z=k(x,y)
dzds=\partz\partxdxds+\partz\partydyds
机器学习的目标一边都是优化问题的求解。
L(θ)=∑Nn=1Cn(θ)
左右两边同时求偏微分:
\partL(θ)\partw=∑Nn=1\partCn(θ)\partw
故当我明白了一个data的计算方法时,即可明白时如何求偏微分的了。
x1和x2是第一层的神经元:x1w1+x2w2+b=zpa=σ(z);a=σ(z)
然后获得了z经过一系列的迭代,获得了一个个输出y1和y2
\partC\partw=\partz\partw\partC\partz
其中,Forward pass是\partz\partw;Backward pass是\partC\partz
Forward:计算每一个neuron的Output
\partC\partz=\parta\partz\partC\parta
这里这个前一个是sigmoid函数的微分;
那后一个因子该如何计算呢?
有一个neuron,求\partC\parta的求和就有多少项,如图示例中,只有两个neuron的例子,故有2项。
\partC\parta=\partC\partz′\partz′\parta+\partC\partz″\partz″\parta(这次我把链式规则调成了我比较顺眼的一个形式。)
但是,我们还是不会算后面的\partC\partz′啊
但是,我们先假设我们知道\partC\partz′和\partC\partz″,那这样,我们就知道了\partC\parta,就知道了\partC\partz
z是在forward pass下所求得的固定的值,所以 σ′(z)是一个已知的常数,所以!我们在这样的运算过程中,只需要乘一个常数就行了。
那,我是默认的不知道啊,我怎么算呢?
如果不知道呢,所以就从最后一层往前面倒退,因为只有是outputLayer才可以计算。