在使用gradient descent的时候,神经网络参数θ有很多参数(w,b)。那gradient就会是一个有成千上万维的vector。所以,Backpropagation在做的事情就是有效的把它(上图左侧的向量)计算出来。
复习一下高数中的链式法则:
case1:input x会对y有影响,input y对z有影响
所以如果算z对x的微分,就可以拆成等号右侧这种形式
case2:input s通过function g会影响x,input s通过function h会影响y
x和y又会通过fuction k影响z
所以如果要计算z对s的微分,由于影响的路径有两条,就会用到偏微分,得到上图中等号右侧这种形式
定义一个loss fuction,这个loss fuction就是把所有训练数据的Cn相加
看右上角的公式,绿色部分是假设给定一组神经网络的参数θ,把一个训练参数xn带入到这个神经网络中,它会output一个Yn,同时我们又希望它output一个Yn尖(期望值),Cn就是实际值Yn和期望值Yn尖之间的距离。Cn越大说明不好。
把左侧的公式左右两侧都对w做偏微分就会得到箭头指向的公式。
(这里要对参数w做微分是因为,参数的微分就是梯度,方便之后做梯度下降)
先拿出来一个神经来计算。根据之前说到的链式法则很容易得到这个公式。那管∂C/∂z就叫做backward pass,∂z/∂w叫做forward pass
要计算forward pass就是一眼就可以看出来得到的结果分别是x1和x2。从这个图正好看出其实算这个就是:如果对w1偏微分,得到的就是x1,如果是对w2,得到的就是x2。就是看w的input是什么,答案就是什么。
例子
计算一下backward pass
这里就是把∂C/∂a又拆解了一下。a=σ(z)这个式子也是假设它是一个sigmod函数,之后又暂时拆解考虑只有两条路两个权重w3,w4.再次使用链式法则求偏微分,得到结果w3和w4。但是红色问号的地方很难解决因为,z‘和z‘‘到C还有很多步骤,不确定是对C的怎么影响的。
所以如果知道两个红色问号部分的值,就可以很轻易的得到∂C/∂a。那先假设知道这两个红色问号,就会得到下图
------------所以到底怎么算红色问号呢?-------------------------------------
case1:现在得到的y1,y2就是整个神经网络的输入输出。
同理根据链式法则,z’->y1->c,所以就会得到上述公式
z‘’同样的道理,那整个计算就比较简单
case2:红色部分并不是整个神经网络的输入输出
那就根据之前说的倒着算,一层一层倒着推就会得到最开始的∂C/∂z’
就像是构建一个倒着的神经网络就可以把每一层z对C的偏微分得到
总结
最开始要解决计算的公式:
正着算:可以得到∂z/∂w
倒着算:可以得到每一个∂C/∂z’
这样就可以计算每一个w对C的偏微分了