BP算法不是跟GD并列,而是GD的一种,即只是用BP可以很快的计算偏微分而已。
Back Propagaiton
Case1:
$y=g(x),z=h(y);$
$\frac{dz}{dx}=\frac{dz}{dy}\frac{dy}{dx}$
Case2:
$x=g(s),y=h(s),z=k(x,y)$
$\frac{dz}{ds}=\frac{\part z}{\part x}\frac{dx}{ds}+\frac{\part z}{\part y}\frac{dy}{ds}$
机器学习的目标一边都是优化问题的求解。
$L(\theta)=\sum_{n=1}^NC^n(\theta)$
左右两边同时求偏微分:
$\frac{\part L(\theta)}{\part w}=\sum_{n=1}^N\frac{\part C^n(\theta)}{\part w}$
故当我明白了一个data的计算方法时,即可明白时如何求偏微分的了。
$x_1$和$x_2$是第一层的神经元:$x_1w_1+x_2w_2+b=z$p$a=\sigma(z)$;$a=\sigma(z)$
然后获得了z经过一系列的迭代,获得了一个个输出$y_1$和$y_2$
$\frac{\part C}{\part w}=\frac{\part z}{\part w}\frac{\part C}{\part z}$
其中,Forward pass是$\frac{\part z}{\part w}$;Backward pass是$\frac{\part C}{\part z}$
Forward:计算每一个neuron的Output
$\frac{\part C}{\part z}=\frac{\part a}{\part z}\frac{\part C}{\part a}$
这里这个前一个是sigmoid函数的微分;
那后一个因子该如何计算呢?
有一个neuron,求$\frac{\part C}{\part a}$的求和就有多少项,如图示例中,只有两个neuron的例子,故有2项。
$\frac{\part C}{\part a}=\frac{\part C}{\part z’}\frac{\part z’}{\part a}+\frac{\part C}{\part z’’}\frac{\part z’’}{\part a}$(这次我把链式规则调成了我比较顺眼的一个形式。)
但是,我们还是不会算后面的$\frac{\part C}{\part z’}$啊
但是,我们先假设我们知道$\frac{\part C}{\part z’}$和$\frac{\part C}{\part z’’}$,那这样,我们就知道了$\frac{\part C}{\part a}$,就知道了$\frac{\part C}{\part z}$
z是在forward pass下所求得的固定的值,所以 $\sigma’(z)$是一个已知的常数,所以!我们在这样的运算过程中,只需要乘一个常数就行了。
那,我是默认的不知道啊,我怎么算呢?
如果不知道呢,所以就从最后一层往前面倒退,因为只有是outputLayer才可以计算。