BP 算法
预备知识
在开始之前,首先需要补充一点预备知识。
1. 激活函数sigmoid函数:
sigmoid 函数是人工智能神经网络中最常使用的一类激活函数,其数学表达式为:
sigmoid函数有一个重要的性质:f’(x) = f(x)[1-f(x)],这个性质在我们求导的过程中起了很大的作用。
2. 梯度下降策略
其中,学习率一塔我们设定为0.5
接下来我们进入正题,BP算法总共分为两个部分,第一个部分是FP(前馈计算计算误差)过程,我们用来计算误差;第二个部分是BP(反馈计算更新权重),我们用来更新权重W;
一、 FP过程
想必大家都已经了解到神经网络的结构,这里我就不做过多的解释了,其中l1, l2是这个神经网络的输入层,h1,h2,h3是这里的隐藏层,O1,O2是我这个神经网络的输出层,其中w表示权重,b表示偏置项(b可以理解为一次函数中的y = kx + b 中的常数项,在这里我们取b1 = 0.35, b2 = 0.65,其实 b1, b2 我们可以取任意值,在此不影响结论)。为了方便更直观的解释,我们来设定一下权重值和偏置项的值:
下面我们就来进行前馈计算:
首先我们以h1为例:
在此,我要补充一个知识:
一个神经元节点,它分为两个部分,如图所示:
左边一部分是我们的输入值,我们称之为net(h1),net(h1)经过sigmoid函数激活之后,我们可以得到Out(h1)这就是我们隐藏层的一个输出结果。
下面我们来进行计算h1的误差:
net(h1) = w1 * l1 + w2 * l2 + b1=2.35
(你可以发现, h1是由w1和w2 连接而成的)
然后,经过sigmoid函数激活之后我们可以得到,
Out(h1) = sigmoid(net(h1))=0.912934
同理,可得:
Out(h2) = 0.979164
Out(h3) = 0.995275
有了这三个数值,我们可以算出输出层O1,O2的误差:
net(O1)= W7 * Outh1 + W9 * Outh1 + W11 * Outh3 + b2 = 2.1019206
经过sigmoid函数激活之后,我们可以得到:
Outh1 = sigmoid(neth1) = 0.891090
同理,可得:
Out h2 = 0.904330
然后,我们可以得到总误差,这里我们记作Etotal(这里我们将Out h1, Out h2 简称为 O1, O2):
这里的1/2是为了后面反馈计算方便而添加的。
到此为止,我们已经完成了前馈计算,并且算出了总误差值。
二、 BP过程
(1).更新(hidden layer ----- Output layer)
这里的BP过程,我们是用来更新W的值,使预测结果更加精确。在此,我们以W7为例。
这里我们需要用到高等数学里的链式法则,W7与下列因素相关:
根据链式法则,我们可得:
其中,等式右边第一项等于:
第二项等于:
第三项等于:
所以,我们可以得到总式:
最后,我们求得w7的更新结果:
同理,我们可得:
(w1-w6 求解方法见下)
(2).更新(Input layer ----hidden layer)
这里我们以w1 为例:
这里还是应用高等数学里的链式法则,w1与下列因素有关:
所以,我们得到求导公式:
这里以Eo1对Outh1的求导为例:
同理可得Eo2对h1的求导公式:
所以我们求得更新后的w1的值:
同理可得(w1 - w6):
至此,w的权重值已完成一次迭代周期。事实上,要想预估的更准确,我们需要上百次甚至上千次的迭代,直至我们权重最终的更新值图像对于实际值收敛。
代码实现:
总结:
bp算法在我们现实中有很多应用,比如,根据某一商店的去年的销量,我们可以来预测今年的销量······我这里只做了简单的算法的数学推算,有许多不足之处,希望大家指正。