详解BP神经网络

扫描下方“二维码”回复“书籍”,获取30本数据分析、python、Matlab、数据库、统计学”等经典书籍。

原文链接:https://blog.csdn.net/fanxin_i/article/details/80212906

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
Netin=∑i=1nwi∗xi

  θθi表示该神经元的阈值,根据生物学中的知识,只有当神经元接收到的信息达到阈值是才会被激活。因此,我们将NetinNetin和θjθj进行比较,然后通过激活函数处理以产生神经元的输出。 
  激活函数:激活函数这里我们不多重述。如果输出值有一定的范围约束,比如用来分类,一般我们用的最多的是Sigmod函数,它可以把输入从负无穷大到正无穷大的信号变换成0到1之间输出。如果没有约束的话,我们可以使用线性激活函数(即权值相乘之和)。这样我们得到的输出为: 
yj=f(Netin−θj)
yj=f(Netin−θj)

  我们可以将公式化简一下,设第一个输入永远值为θθ,权值为-1,则我们可以得到公式: 
yj=f(∑i=0nwi∗xi)
yj=f(∑i=0nwi∗xi)

  其中w0=-1,x0=θθj,其中f为选择的激活函数。 
  已经知道在BP神经网络模型中,我们有三层结构,输入层、隐藏层、输出层,因此输入层到隐藏层的权值,设为vihvih,隐藏层第h个神经元的阈值我们设为γhγh。隐藏层到输出层的权值,设为whjwhj,输出层第j个神经元的阈值我们用θjθj表示。在下面这张图里,有d输入神经元,q个隐藏神经元,隐藏有q个隐藏神经元阈值,ll个输出神经元,因此有ll个输出神经元阈值。 

  其中βjβj中的bh=f(αh−θh)bh=f(αh−θh)。隐藏层和输出层的激活函数,在这里我们暂时全部用SigmodSigmod函数。 
  在某个训练示例(xk,yk)(xk,yk)中,假设神经网络的训练输出为yk,=(yk,1,yk,2,⋯,yk,l)yk,=(y1k,,y2k,,⋯,ylk,),输出为ll维向量,其中 
yk,i=f(βi−θi)
yik,=f(βi−θi)

  那么这次预测结果的误差我们可以用最小二乘法表示: 
Ek=12∑j=1l(yk,j−ykj)2
Ek=12∑j=1l(yjk,−yjk)2

  而我们现在要做的就是根据这个误差去调整(d+l+1)q+l(d+l+1)q+l个参数的值,一步一步缩小EkEk。那么从现在开始,我们就要进入数学的世界了。这里我们使用最常用的算法:梯度下降法来更新参数。函数永远是沿着梯度的方向变化最快,那么我们对每一个需要调整的参数求偏导数,如果偏导数>0,则要按照偏导数相反的方向变化;如果偏导数<0,则按照此方向变化即可。于是我们使用-1*偏导数则可以得到参数需要变化的值。同时我们设定一个学习速率ηη,这个学习速率不能太快,也不能太慢。太快可能会导致越过最优解;太慢可能会降低算法的效率。(具体设多少就属于玄学调参的领域了)。因此我们可以得到一个参数调整公式: 
Param+=−η∂Ek∂Param
Param+=−η∂Ek∂Param

  首先我们看看隐藏层到输出层的权值调整值: 
Δwhj=−η∂Ek∂whj
Δwhj=−η∂Ek∂whj

  好,我们从上到下缕一缕这个偏导该怎么求,我们把每一个公式都罗列出来:
  1.输出层到隐藏层:

αh=∑i=1dvih∗xi⋯⋯⋯⋯⋯⋯⋯(1)
αh=∑i=1dvih∗xi⋯⋯⋯⋯⋯⋯⋯(1)

|x1x2x3⋯xd|⋅∣∣∣∣∣∣∣∣∣v11v21⋅⋅⋅vd1v12v22⋅⋅⋅wd2v13v23⋅⋅⋅wd3⋯⋯⋅⋅⋅⋯v1qw2q⋅⋅⋅wdq∣∣∣∣∣∣∣∣∣
|x1x2x3⋯xd|⋅|v11v12v13⋯v1qv21v22v23⋯w2q⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅vd1wd2wd3⋯wdq|
  2.经过隐藏层的激活函数:

bh=f(αh−γh)⋯⋯⋯⋯⋯⋯⋯(2)
bh=f(αh−γh)⋯⋯⋯⋯⋯⋯⋯(2)
  3.隐藏层到输出层:

βj=∑h=1qwhj∗bh⋯⋯⋯⋯⋯⋯⋯(3)
βj=∑h=1qwhj∗bh⋯⋯⋯⋯⋯⋯⋯(3)
  用矩阵表示

|b1b2b3⋯bq|⋅∣∣∣∣∣∣∣∣∣w11w21⋅⋅⋅wq1w12w22⋅⋅⋅wq2w13w23⋅⋅⋅wq3⋯⋯⋅⋅⋅⋯w1lw2l⋅⋅⋅wql∣∣∣∣∣∣∣∣∣
|b1b2b3⋯bq|⋅|w11w12w13⋯w1lw21w22w23⋯w2l⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅wq1wq2wq3⋯wql|
  4.经过输出层的激活函数:

yk,j=f(βj−θj)⋯⋯⋯⋯⋯⋯⋯(4))
yjk,=f(βj−θj)⋯⋯⋯⋯⋯⋯⋯(4))
  5.误差:

Ek=12∑j=1l(yk,j−ykj)2⋯⋯⋯⋯⋯⋯⋯(5)
Ek=12∑j=1l(yjk,−yjk)2⋯⋯⋯⋯⋯⋯⋯(5)

  综上我们可以得知whjwhj先影响βjβj,再影响yk,jyjk,,最后影响EkEk,(一个ww权值只会影响一个ββ)所以我们可得: 
Δwhj=−η∂Ek∂whj=−η∂Ek∂yk,j⋅∂yk,j∂βj⋅∂βj∂whj⋯(6)
Δwhj=−η∂Ek∂whj=−η∂Ek∂yjk,⋅∂yjk,∂βj⋅∂βj∂whj⋯(6)

其中∂βj∂whj=bh∂βj∂whj=bh,前面提到过,bhbh是第h个隐藏神经元的输出。 
gj=∂Ek∂yk,j⋅∂yk,j∂βj=(yk,j−ykj)⋅f′(βj−θj)⋯(7)
gj=∂Ek∂yjk,⋅∂yjk,∂βj=(yjk,−yjk)⋅f′(βj−θj)⋯(7)

  而我们选择的激活函数是SigmodSigmod函数,该函数具有一个很好的性质 
f(x)=11+e−x⋯f′(x)=f(x)(1−f(x))⋯(8)
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)
f′(βj−θj)=f(βj−θj)⋅(1−f(βj−θj))=yjk′⋅(1−yjk′)⋯(9)

  综合formula(6)(7)(9)formula(6)(7)(9)我们可得: 
Δwhj=−η∂Ek∂whj=−ηgibh=−η(yk′j−ykj)⋅yk′j⋅(1−yk′j)⋅bh⋯(10)
Δwhj=−η∂Ek∂whj=−ηgibh=−η(yjk′−yjk)⋅yjk′⋅(1−yjk′)⋅bh⋯(10)
  同理:

Δθj=−η∂Ek∂θj=−η∂Ek∂yk′j⋅∂yk′j∂θj=η⋅gj⋯(11)
Δθj=−η∂Ek∂θj=−η∂Ek∂yjk′⋅∂yjk′∂θj=η⋅gj⋯(11)

  我们再看看ΔvihΔvih的值怎么求,还是由formula(1),(2),(3),(4),(5)formula(1),(2),(3),(4),(5)推导,一个vv权值会影响所有的ββ 
Δvih=−ηehxi⋯⋯⋯⋯(12)
Δvih=−ηehxi⋯⋯⋯⋯(12)

Δγh=ηeh⋯⋯ ⋯(13)
Δγ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)
eh=(∑j=1l∂Ek∂βj⋅∂βj∂bj)⋅f′(αh−γh)=(∑j=1l(yjk,−yjk)⋅f′(βj−θj)⋅whj)⋅f′(αh−γh)⋯⋯⋯(14)
  至此,我们所有得公式都推导完毕了,剩下做的就是设定一个迭代终止条件,可以是误差小于一定值时终止递归,也可以是设定迭代次数。这样一个BP神经网络模型就算是设计结束。

  java实现代码和实验数据在我的github上面


原文链接:https://blog.csdn.net/fanxin_i/article/details/80212906

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值