深度学习小白——反向传播

1、理解html

函数关于每一个变量的导数指明了整个表达式对于该变量的敏感程度缓存

梯度▽f是偏导数的向量,因此有\nabla f(x)=[\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}]=[y,x]网络



直观理解链式法则,f=q*z, q=x+y ,先进行前向传播,从输入计算到输出(绿色),而后反向传播从末端开始,根据链式法则递归地向前计算梯度,一直到输入端。函数

在整个反向传播过程当中,每一个门单元应将回传的梯度乘以它对其输入的局部梯度,从而获得整个网络的输出对该门单元的每一个输入值的梯度spa

例如上图,加法门收到输入[-2,5],计算输出3,则对于两个输入的局部梯度是+1,网络的其他部分计算出最终值 为-12,反向传播时,算到加法门时,知道加法门的输出梯度是-4,htm

继续递归并对梯度使用链式法则,加法门拿到梯度,而后把这个梯度分别乘到每一个输入值的局部梯度,即获得了整个网络输出对每一个输入值的梯度。blog


2、sigmoid函数递归

\displaystyle f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2)}}

  

\displaystyle\sigma(x)=\frac{1}{1+e^{-x}}\displaystyle\to\frac{d\sigma(x)}{dx}=\frac{e^{-x}}{(1+e^{-x})^2}=(\frac{1+e^{-x}-1}{1+e^{-x}})(\frac{1}{1+e^{-x}})=(1-\sigma(x))\sigma(x)

注意:在计算反向传播时,前向传播过程当中获得的一些中间变量很是有用,在实际操做中,最好代码实现对于这些中间变量的缓存,对于不一样分支的梯度,要使用+=而不是=来累积这些变量的梯度路由


【总结】get

加法门:把输出梯度相等地分发给它全部的输入

取最大值门:对梯度做路由,将梯度转给其中一个输入,这个输入是在前向传播中值最大的那个输入。

乘法门:它的局部梯度就是输入值,可是是相互交换以后的。


3、小结

分段计算在反向传播中很重要!应该将函数分红不一样的模块,这样计算局部梯度相对容易,而后基于链式法则将其“链”起来

在矩阵运算中,要注意分析维度,经过维度推导出来公式,也能够先写一个小规模的例子,在纸上推演梯度,而后对其通常化。


给一个每层只有一个神经元的4-layer简化模型来讲明反向传播:


其中,C表示代价函数,aj = σ(zj)(注意,a4 = z4),zj = wjaj-1 + bj,咱们称 zj是神经元的带权输入。如今咱们要来研究一下第一个隐藏神经元的梯度∂C/∂b1,这里咱们直接给出表达式(具体证实,请移步这里):