简单明了的理解神经网络BP传播算法
最近在用numpy实现Lenet5的时候发现网络结构的正向传播理解没问题,但是在对误差逆传播的理解却很是困惑,在查了一些资料却发现对对神经网络的BP传播理解也不是很透彻,看来学习这件事来不得半点虚的。现实总是会在我不经意间将我打回原型,并且按在泥里面来回摩擦。那我只能停止幻想,继续奋斗了。。。
今天就详细的记录一下BP传播算法的推导过程(借鉴了zhihu大神的图片和公式)。
为了简单起见这里定义三层网络,输入层(第0层),隐藏层(第1层),输出层(第二层)。并且每个结点没有偏置(有偏置原理完全一样)**函数选为sigmod函数(不同的**函数,求导不同),符号说明如下:
对应网络结构如下图:
其中对应的矩阵表示如下:
正向传播的时候公式与相对应的数据对应如下:
则通过**函数后如下:
同理可以得到:
则最终的损失为:
我们的理想是希望这个损失值越小越好,这也是我们为什么要进行训练,调节参数,使得最终的损失最小。这就用到了我们的反向传播算法,实际上反向传播就是梯度下降法中链式法则的使用。
下面我们看看如何实现反向传播
根据公式我们可以得到:
这时候我们需要求出C对w的偏导数,根据连式法则会有如下表达式:
其中需要强调一下
需要特别注意如果要再进一步推导为什么f(x)的导数表示为如下形式:
(这里面有用到复合函数求导以及分数求导)
同样的有:
到这里我们已经算出这个网络的最后一层的偏导数了,我们继续往前面链式推导:
我们现在还需要求
下面给出其中的一个推到,其它完全类似
同理可得到其它几个式子:
则最终的结果为:
再按照当前这个权重参数进行一遍正向传播得出来的Error为0.165,而这个值比原来的0.18要小,则继续迭代,误差继续逆向传播,不断修正权值,使得代价函数越来越小,预测值不断逼近0.5,迭代了100次的结果预测值逼近0.5,Error为5.92944818e-07,这个error已经很小了,最后权值为:
整个BP网络传播原理就是如上面的介绍,相信已经算是很清楚了,如果有问题欢迎留言或骚扰QQ:1539431060