首页 > 代码库 > 后向传播算法“backpropragation”详解

后向传播算法“backpropragation”详解

为什么要使用backpropagation?

技术分享

梯度下降不用多说,如果不清楚的可以参考http://www.cnblogs.com/yangmang/p/6279054.html。

神经网络的参数集合theta,包括超级多组weight和bais。

要使用梯度下降,就需要计算每一个参数的梯度,但是神经网络常常有数以万计,甚至百万的参数,所以需要使用backpropagation来高效地计算梯度。

backpropagation的推导

backpropagation背后的原理其实很简单,就是求导的链式法则。

技术分享

技术分享

技术分享

我们从上面的公式开始推导。以其中一个神经元为例。

技术分享

如上面的红框中所示,根据链式法则,l对w的偏导数,等于z对w的偏导数乘以l对z的偏导数。

l对w的梯度可以分为两部分:

前向传播:对所有参数求梯度;

后向传播:对所有激活函数的输入z求梯度;

技术分享

前向传播的梯度求法简单,就z对w求偏导数,直接求出就是对应的输入xi

技术分享

技术分享

 

后向传播比较复杂,需要再使用链式法则,如红框中所示。l/z的梯度分解为a/z和l/a的梯度。

a对z的导数图像如上所示,现在关键就是求l对a的偏导数。

技术分享

为了求出l对a的偏导数,继续使用链式法则,关联上后面的两个神经元。

现在问题就转化成了,求红框中的两个问号的梯度/

 技术分享

现在假设两个问号梯度已知,就可以求出之前l对z的梯度了。

 技术分享

现在来看看怎么可以求出l对z的梯度。

技术分享

第一种情况:当z‘和z’‘为输出层时。根据链式法则,y/z和l/y的梯度都是可解的,这样问题就解决了。

技术分享

 

第二种情况:不是输出层。就是说还有后续的神经元几点连接。

技术分享

循环计算l对z的梯度,直到输出层,出现case1的情况,问题也就解决了。

技术分享

所以,我们就可以从输出层开始,反向计算l对每层z的梯度,在结合前向传播得到的梯度,就可以计算出梯度下降所需的梯度了。

而且,反向传播的复杂度和前向传播是一样的,这样就大大提升了梯度计算的效率。

最后结果就是这样的:

技术分享

 

后向传播算法“backpropragation”详解