反向传播(Back Propagation、BP算法)
- 反向传播是对于神经网络来说最重要的算法
- 反向传播是求偏导的过程
- 反向传播的核心是计算图(如下图所示)
a和b:输入量/权重,可经一系列运算得到e=(a+b)∗\ast∗(b+1)
在计算图中每一步的计算只能进行原子计算(不能被分割的运算)
假设a=1、b=2,从节点a出发,首先计算c=a+b=1+2=3,d=b+1=2+1=3,最后可得节点e=c∗c\astc∗d=3x3=9,这个过程叫做前馈。
求节点c时,一共有两条路径,即∂c∂a\frac{\partial c}{\partial a}∂a∂c=1和∂c∂b\frac{\partial c}{\partial b}∂b∂c=1。
求节点d时,只有一条路径,即∂d∂b\frac{\partial d}{\partial b}∂b∂d=1。
求节点e时,一共有两条路径,即∂e∂c\frac{\partial e}{\partial c}∂c∂e=d=3和∂e∂d\frac{\partial e}{\partial d}∂d∂e=c=3。
最终目标要求∂e∂a\frac{\partial e}{\partial a}∂a∂e和∂e∂b\frac{\partial e}{\partial b}∂b∂e,可以把a到e的所有路径上的偏导数相乘,就是∂e∂a\frac{\partial e}{\partial a}∂a∂e,即∂e∂a\frac{\partial e}{\partial a}∂a∂e=∂e∂c\frac{\partial e}{\partial c}∂c∂e⋅\cdot⋅∂c∂a\frac{\partial c}{\partial a}∂a∂c=3x1=3(链式法则),从b到e一共两条路径(b->c->e,b->d->e),将这两条路径上算出来的偏导数相加就是∂e∂b\frac{\partial e}{\partial b}∂b∂e,即∂e∂b\frac{\partial e}{\partial b}∂b∂e=∂e∂c\frac{\partial e}{\partial c}∂c∂e⋅\cdot⋅∂c∂b\frac{\partial c}{\partial b}∂b∂c+++∂e∂d\frac{\partial e}{\partial d}∂d∂e⋅\cdot⋅∂d∂b\frac{\partial d}{\partial b}∂b∂d=3x1+3x1=6。
综上,利用BP算法可以构建复杂的计算图,且算法具有弹性(如果只是计算图发生改变,但原子计算式不变,即各个节点的偏导不变,那么算法仍然可以应用在新计算图上)。BP算法只需要计算每个原子算子的偏导,就可以在图里传播导数来实现最终的计算。
本文参考:《PyTorch深度学习实践》