BackPropagation Neuron NetWok
BP神经网络学习算法可以说是目前最成功的神经网络学习算法。显示任务中使用神经网络时,大多数是使用BP算法进行训练.
在我看来BP神经网络就是一个”万能的模型+误差修正函数“,每次根据训练得到的结果与预想结果进行误差分析,进而修改权值和阈值,一步一步得到能输出和预想结果一致的模型。举一个例子:比如某厂商生产一种产品,投放到市场之后得到了消费者的反馈,根据消费者的反馈,厂商对产品进一步升级,优化,从而生产出让消费者更满意的产品。这就是BP神经网络的核心。
下面就让我们来看看BP算法到底是什么东西。BP网络由输入层、隐藏层、输出层组成。给定训练集D={(x1,y1),(x2,y2…(xn,yn)},其中xnϵRd,ynϵRl,表示输入示例由d个属性组成,输出l维实值变量。现在,我们看看如何求得输出值,以及怎么由输出值调整权值和阈值。
神经元是以生物研究及大脑的响应机制而建立的拓扑结构网络,模拟神经冲突的过程,多个树突的末端接受外部信号,并传输给神经元处理融合,最后通过轴突将神经传给其它神经元或者效应器。神经元的拓扑结构如图:
对于第i个神经元,X1、X2、…、Xj为神经元的输入,输入常为对系统模型关键影响的自变量,W1、W2、…、Wj为连接权值调节各个输入量的占重比。将信号结合输入到神经元有多种方式,选取最便捷的线性加权求和可得neti神经元净输入:
Netin=∑i=1nwi∗xi
θ
i表示该神经元的阈值,根据生物学中的知识,只有当神经元接收到的信息达到阈值是才会被激活。因此,我们将
Netin
和
θj
进行比较,然后通过激活函数处理以产生神经元的输出。
激活函数:激活函数这里我们不多重述。如果输出值有一定的范围约束,比如用来分类,一般我们用的最多的是Sigmod函数,它可以把输入从负无穷大到正无穷大的信号变换成0到1之间输出。如果没有约束的话,我们可以使用线性激活函数(即权值相乘之和)。这样我们得到的输出为:
yj=f(Netin−θj)
我们可以将公式化简一下,设第一个输入永远值为
θ
,权值为-1,则我们可以得到公式:
yj=f(∑i=0nwi∗xi)
其中w
0=-1,x
0=
θ
j,其中f为选择的激活函数。
已经知道在BP神经网络模型中,我们有三层结构,
输入层、隐藏层、输出层,因此输入层到隐藏层的权值,设为
vih
,隐藏层第h个神经元的阈值我们设为
γh
。隐藏层到输出层的权值,设为
whj
,输出层第j个神经元的阈值我们用
θj
表示。在下面这张图里,有d输入神经元,q个隐藏神经元,隐藏有q个隐藏神经元阈值,
l
个输出神经元,因此有
l
个输出神经元阈值。
其中
βj
中的
bh=f(αh−θh)
。隐藏层和输出层的激活函数,在这里我们暂时全部用
Sigmod
函数。
在某个训练示例
(xk,yk)
中,假设神经网络的训练输出为
yk,=(yk,1,yk,2,⋯,yk,l)
,输出为
l
维向量,其中
yk,i=f(βi−θi)
那么这次预测结果的误差我们可以用最小二乘法表示:
Ek=12∑j=1l(yk,j−ykj)2
而我们现在要做的就是根据这个误差去调整
(d+l+1)q+l
个参数的值,一步一步缩小
Ek
。那么从现在开始,我们就要进入数学的世界了。这里我们使用最常用的算法:梯度下降法来更新参数。函数永远是沿着梯度的方向变化最快,那么我们对每一个需要调整的参数求偏导数,如果偏导数>0,则要按照偏导数相反的方向变化;如果偏导数<0,则按照此方向变化即可。于是我们使用-1*偏导数则可以得到参数需要变化的值。同时我们设定一个学习速率
η
,这个学习速率不能太快,也不能太慢。太快可能会导致越过最优解;太慢可能会降低算法的效率。(具体设多少就属于玄学调参的领域了)。因此我们可以得到一个参数调整公式:
Param+=−η∂Ek∂Param
首先我们看看隐藏层到输出层的权值调整值:
Δwhj=−η∂Ek∂whj
好,我们从上到下缕一缕这个偏导该怎么求,我们把每一个公式都罗列出来:
1.输出层到隐藏层:
αh=∑i=1dvih∗xi⋯⋯⋯⋯⋯⋯⋯(1)
|x1x2x3⋯xd|⋅∣∣∣∣∣∣∣∣∣v11v21⋅⋅⋅vd1v12v22⋅⋅⋅wd2v13v23⋅⋅⋅wd3⋯⋯⋅⋅⋅⋯v1qw2q⋅⋅⋅wdq∣∣∣∣∣∣∣∣∣
2.经过隐藏层的激活函数:
bh=f(αh−γh)⋯⋯⋯⋯⋯⋯⋯(2)
3.隐藏层到输出层:
βj=∑h=1qwhj∗bh⋯⋯⋯⋯⋯⋯⋯(3)
用矩阵表示
|b1b2b3⋯bq|⋅∣∣∣∣∣∣∣∣∣w11w21⋅⋅⋅wq1w12w22⋅⋅⋅wq2w13w23⋅⋅⋅wq3⋯⋯⋅⋅⋅⋯w1lw2l⋅⋅⋅wql∣∣∣∣∣∣∣∣∣
4.经过输出层的激活函数:
yk,j=f(βj−θj)⋯⋯⋯⋯⋯⋯⋯(4))
5.误差:
Ek=12∑j=1l(yk,j−ykj)2⋯⋯⋯⋯⋯⋯⋯(5)
综上我们可以得知
whj
先影响
βj
,再影响
yk,j
,最后影响
Ek
,(一个
w
权值只会影响一个
β
)所以我们可得:
Δwhj=−η∂Ek∂whj=−η∂Ek∂yk,j⋅∂yk,j∂βj⋅∂βj∂whj⋯(6)
其中
∂βj∂whj=bh
,前面提到过,
bh
是第h个隐藏神经元的输出。
gj=∂Ek∂yk,j⋅∂yk,j∂βj=(yk,j−ykj)⋅f′(βj−θj)⋯(7)
而我们选择的激活函数是
Sigmod
函数,该函数具有一个很好的性质
f(x)=11+e−x⋯f′(x)=f(x)(1−f(x))⋯(8)
所以我们有:
f′(βj−θj)=f(βj−θj)⋅(1−f(βj−θj))=yk′j⋅(1−yk′j)⋯(9)
综合
formula(6)(7)(9)
我们可得:
Δwhj=−η∂Ek∂whj=−ηgibh=−η(yk′j−ykj)⋅yk′j⋅(1−yk′j)⋅bh⋯(10)
同理:
Δθj=−η∂Ek∂θj=−η∂Ek∂yk′j⋅∂yk′j∂θj=η⋅gj⋯(11)
我们再看看
Δvih
的值怎么求,还是由
formula(1),(2),(3),(4),(5)
推导,一个
v
权值会影响所有的
β
Δvih=−ηehxi⋯⋯⋯⋯(12)
Δγh=ηeh⋯⋯ ⋯(13)
其中
eh=(∑j=1l∂Ek∂βj⋅∂βj∂bj)⋅f′(αh−γh)=(∑j=1l(yk,j−ykj)⋅f′(βj−θj)⋅whj)⋅f′(αh−γh)⋯⋯⋯(14)
至此,我们所有得公式都推导完毕了,剩下做的就是设定一个迭代终止条件,可以是误差小于一定值时终止递归,也可以是设定迭代次数。这样一个BP神经网络模型就算是设计结束。
java实现代码和实验数据在我的github上面