AI机动队
首发于AI机动队
反向传播算法——深度学习第六章(三)

反向传播算法——深度学习第六章(三)

为了理解什么是反向传播(backward propagation),先要知道什么是正向传播(forward propagation)。顾名思义,正向传播就是对于前馈神经网络来说,信息从输入到隐藏层再到输出的正向流动过程,最终会得到损失函数的值。而反向传播就是从损失函数反向流入网络以计算梯度(gradient)的过程。

要注意,有个普遍的误解是反向传播就是神经网络的全部学习算法,实际上,反向传播仅指计算梯度的过程,实际上的学习过程是诸如随机梯度下降(stochastic gradient descent,SGD)更新网络的算法。

反向传播的原理很简单,就是利用了导数的链式法则: 对于 y=g(x), z=f(g(x))=f(y) ,有

\frac {dz}{dx}=\frac {dz}{dy}\frac {dy}{dx}

推广到矢量形式即为 \triangledown _xz = \left( \frac{\partial y}{\partial x} \right)^T \triangledown _yz

我们利用链式法则,就可以不断的从最终的损失函数不断的反向推导出每层的梯度,而反向传播就是一种特殊的进行链式法则运算的执行过程,即结合了动态规划(dynammic programming)避免了某些操作的重复性运算,利用较小的存储代价换取速度的提升。

为了用简洁的符号来表示该算法,我们用计算图(computational graph)来表示我们的神经网络,每个节点代表输入节点、隐藏层节点或输出节点,而每条边代表节点间的运算,例如对于对于 H=max\left\{ 0,XW+b \right\} ,我们可以用下图表示:

假设我们的 n_i 个输入节点用 u^{(1)}u^{(n_i)} 表示,而最终的损失为 u^{(n)} ,则反向传播的目的是求出对于 i\in \left\{ 1,2,...,n_i \right\} 的所有 \frac{\partial u^{(n)}}{\partial u^{(i)}} 。假设每一个中间的节点和其之前层的所有父节点的关系为 u^{(i)} = f^{(i)}(A^{(i)}) ,其中 A^{(i)}=Pa(u^{(i)}) 代表 u^{(i)} 的所有父节点的集合,则正向传播算法可以表示为

对于反向传播过程,根据链式法则有 \frac{\partial u^{(n)}}{\partial u^{(j)}} = \sum _{i:j\in Pa(u^{(i)})} \frac{\partial u^{(n)}}{\partial u^{(i)}} \frac{\partial u^{(i)}}{\partial u^{(j)}}

即对于节点 u^{(j)} ,其导数等于所有其子节点相对于 u^{(j)} 的导数与 u^{(n)} 相对于子节点导数的积的求和。

所以在经历过正向传播过程后,我们已经得到每个节点的值,反向传播计算梯度的算法则为

可以看出,反向传播算法中我们对于图中的每一条边只进行一次访问,减小了计算量。例如对于如下的计算图:

如果不利用反向传播,为了得到 \frac{\partial z}{\partial w} 则我们需要总共进行六次运算,而利用反向传播则仅进行三次运算即可。


总结一下,在正向传播过程中,我们计算了网络中每个节点的值,反向传播过程中利用这些值以及导数的链式法则结合动态规划的方法避免了重复运算,极大的提高了梯度计算速度,从而更加有利于利用梯度进行随机梯度下降更新神经网络参数完成机器学习训练任务。

至此第六章前馈神经网络部分总结完毕,下一章总结深度学习中的正则化方法。

注:图片及算法均选自深度学习及相应讲义。

编辑于 2018-08-06

文章被以下专栏收录