8.反向传播Backpropagation
1 前言
1.1 为什么要用 Backpropagation
在神经网络中的梯度下降算法和之前求线性回归方程中用的没有太大的区别,都是不断的计算微分,然后更新参数,最终找到一个最优解。
但是在神经网络中,有着大量可能多达上百万个的参数,所以传统的求微分方法行不通,计算量太大无法快速有效的求出微分。

1.2 链式求导法则(Chain Rule)
**** Backprogation 中设计的最重要的数学知识就是 chain rule,通过下面的图片回顾一下。

2 .Backpropagation
2.1 应该求什么
从上一节内容我们知道,每一个神经网络都需要定义一个 Loss Function , 用来定义实际输出与预期输出之间的误差 Cn ,则总的误差就是

我们的目的就是要使上式的值最小。用 Gradient descent 来做的话就是这个式子对权值 w 求偏导,即

由此我们知道只需要求每个 Cn 对 w 的偏导,然后全部加起来就可以了。
2.2 Forward pass

对上面这个 Neural 来说,根据 Chain Rule,

很明显,计算 ∂z/∂w 是很容易的,如在上图中,∂z/∂w1=x1,∂z/∂w2=x2 ,即,∂z/∂w 就等于其所在边的输入。

2.3 Backward pass
所以我们剩下的问题是计算 ∂C/∂z,但是我们没办法直接算这个偏导,所以又要再做变换了。

由上图可知,

其中,a=σ(z),所以 ∂a/∂z=∂σ(z)/∂z=σ'(z) .于是我们剩下的任务就是求 ∂C/∂a ,根据上图的公式我们知道剩下要求的就是 和∂C/∂z‘和∂C/∂z′′ 。接下来,我们假设∂C/∂z′和∂C/∂z′′ 是已知的(通过某些神奇的方法算出来了),于是将上述的东西凑起来,我们就可以算出

从另一观点看待下面的式子:有另外一个neuron(下图中的大三角形,表示乘法/放大器),input是∂C/∂z′与∂C/∂z′′ ,权重分别是w3,w4,求和经过neuron(乘以σ′(z)),得到 ∂C/∂z。

现在的问题是,如何计算∂C/∂z′ 与∂C/∂z′′ 。第一种情况,z′,z′′ 所接的neuron是output layer的neuron,如下图

我们发现,图中的公式是可以计算的(看不出来就多看几遍,再看不出来就假装已经看出来了),于是我们把所有要求的都求出来了,就可以计算微分值了。但是,如果下一层不是输出层呢?这就是下面的第二种情况,那就把问题继续往下一层传递,直到输出层,然后就可以从最后一层一直往前计算回来了。如下图,相当于把输出作为输入,建立一个反向的神经网络。

从输出层开始,从右往左反向传播,最终求得∂C/∂z1和∂C/∂z2。例如(∂C/∂z5权重w +∂C/∂z6权重w)σ'(z3)=∂C/∂z3,(∂C/∂z5权重w +∂C/∂z6*权重w)*σ'(z4)=∂C/∂z4递归往前传

3. 总结
所以,Backpropagation 算法的流程就是:
**** a)Forward Pass**:** 算出每一层的输出 a,也就是 ∂z/∂w .
b) Backward Pass**:** 反转神经网络,从输出层往回计算每一层的 ∂C/∂z.
c) 将前面算出来的两项相乘,得到 ∂C/∂w.

对我来说,我觉得把这个算法过程当成是一次递归就会很好理解,Forward Pass 就是函数一层层的调用,达到返回条件(在BackPropagation中是遇到输出层)就开始返回,也就是 Backward Pass.
