详解BP神经网络

BackPropagationNeuronNetWok  BP神经网络学习算法可以说是目前最成功的神经网络学习算法。显示任务中使用神经网络时,大多数是使用BP算法进行训练.  在我看来BP神经网络就是一个”万能的模型+误差修正函数“,每次根据训练得到的结果与预想结果进行误差分析,进而修改权值和阈值,一步一步得到能输出和预想结果一致的模型。举一个例子:比如某厂商生产一种产品,投放到市场之…

大家好,又见面了,我是你们的朋友全栈君。

#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神经元净输入:
N e t i n = ∑ i = 1 n w i ∗ x i Net_{in}=\sum_{i=1}^{n}{w_i*x_i} Netin=i=1nwixi
   θ \theta θi表示该神经元的阈值,根据生物学中的知识,只有当神经元接收到的信息达到阈值是才会被激活。因此,我们将 N e t i n Net_{in} Netin θ j \theta_j θj进行比较,然后通过激活函数处理以产生神经元的输出。
  激活函数:激活函数这里我们不多重述。如果输出值有一定的范围约束,比如用来分类,一般我们用的最多的是Sigmod函数,它可以把输入从负无穷大到正无穷大的信号变换成0到1之间输出。如果没有约束的话,我们可以使用线性激活函数(即权值相乘之和)。这样我们得到的输出为:
y j = f ( N e t i n − θ j ) y_j=f(Net_{in}-\theta_j) yj=f(Netinθj)
  我们可以将公式化简一下,设第一个输入永远值为 θ \theta θ,权值为-1,则我们可以得到公式:
y j = f ( ∑ i = 0 n w i ∗ x i ) y_j=f(\sum_{i=0}^nw_i*x_i) yj=f(i=0nwixi)
  其中w0=-1,x0= θ \theta θj,其中f为选择的激活函数。
  已经知道在BP神经网络模型中,我们有三层结构,输入层、隐藏层、输出层,因此输入层到隐藏层的权值,设为 v i h v_{ih} vih,隐藏层第h个神经元的阈值我们设为 γ h \gamma_h γh。隐藏层到输出层的权值,设为 w h j w_{hj} whj,输出层第j个神经元的阈值我们用 θ j \theta_j θj表示。在下面这张图里,有d输入神经元,q个隐藏神经元,隐藏有q个隐藏神经元阈值, l l l个输出神经元,因此有 l l l个输出神经元阈值。
这里写图片描述
  其中 β j \beta_j βj中的 b h = f ( α h − γ h ) b_h=f(\alpha_h-\gamma_h) bh=f(αhγh)。隐藏层和输出层的激活函数,在这里我们暂时全部用 S i g m o d Sigmod Sigmod函数。
  在某个训练示例 ( x k , y k ) (x_k,y_k) (xk,yk)中,假设神经网络的训练输出为 y k , = ( y 1 k , , y 2 k , , ⋯   , y l k , ) y_{k^,}=({y_1^{k^,},y_2^{k^,},\cdots,y_l^{k^,}}) yk,=(y1k,,y2k,,,ylk,),输出为 l l l维向量,其中
y i k , = f ( β i − θ i ) y_i^{k^,}=f(\beta_i-\theta_i) yik,=f(βiθi)
  那么这次预测结果的误差我们可以用最小二乘法表示:
E k = 1 2 ∑ j = 1 l ( y j k , − y j k ) 2 E_k=\frac{1}{2}\sum_{j=1}^l(y_j^{k^,}-y_j^k)^2 Ek=21j=1l(yjk,yjk)2
  而我们现在要做的就是根据这个误差去调整 ( d + l + 1 ) q + l (d+l+1)q+l d+l+1q+l个参数的值,一步一步缩小 E k E_k Ek。那么从现在开始,我们就要进入数学的世界了。这里我们使用最常用的算法:梯度下降法来更新参数。函数永远是沿着梯度的方向变化最快,那么我们对每一个需要调整的参数求偏导数,如果偏导数>0,则要按照偏导数相反的方向变化;如果偏导数<0,则按照此方向变化即可。于是我们使用-1*偏导数则可以得到参数需要变化的值。同时我们设定一个学习速率 η \eta η,这个学习速率不能太快,也不能太慢。太快可能会导致越过最优解;太慢可能会降低算法的效率。(具体设多少就属于玄学调参的领域了)。因此我们可以得到一个参数调整公式:
P a r a m + = − η ∂ E k ∂ P a r a m Param+=-\eta\frac{\partial E_k}{\partial Param} Param+=ηParamEk
  首先我们看看隐藏层到输出层的权值调整值:
Δ w h j = − η ∂ E k ∂ w h j \Delta w_{hj}=-\eta\frac{\partial E_k}{\partial w_{hj}} Δwhj=ηwhjEk
  好,我们从上到下缕一缕这个偏导该怎么求,我们把每一个公式都罗列出来:
#####  1.输入层到隐藏层:
α h = ∑ i = 1 d v i h ∗ x i ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ( 1 ) \alpha_h=\sum_{i=1}^dv_{ih}*x_i \cdots \cdots \cdots \cdots \cdots \cdots \cdots(1) αh=i=1dvihxi(1)
∣ x 1 x 2 x 3 ⋯ x d ∣ ⋅ ∣ v 11 v 12 v 13 ⋯ v 1 q v 21 v 22 v 23 ⋯ w 2 q ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ v d 1 w d 2 w d 3 ⋯ w d q ∣ \begin{vmatrix} x_1 &x_2 &x_3&\cdots& x_d \end{vmatrix} \cdot \begin{vmatrix} v_{11} &v_{12} &v_{13}& \cdots& v_{1q} \\ v_{21} &v_{22} &v_{23}& \cdots& w_{2q} \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ v_{d1} &w_{d2}&w_{d3} &\cdots & w_{dq} \end{vmatrix} x1x2x3xdv11v21vd1v12v22wd2v13v23wd3v1qw2qwdq
#####  2.经过隐藏层的激活函数:
b h = f ( α h − γ h ) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ( 2 ) b_h=f(\alpha_h-\gamma_h) \cdots \cdots \cdots \cdots \cdots \cdots \cdots(2) bh=f(αhγh)(2)
#####  3.隐藏层到输出层:
β j = ∑ h = 1 q w h j ∗ b h ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ( 3 ) \beta_j=\sum_{h=1}^qw_{hj}*b_h \cdots\cdots \cdots \cdots \cdots \cdots \cdots(3) βj=h=1qwhjbh(3)
#####  用矩阵表示
∣ b 1 b 2 b 3 ⋯ b q ∣ ⋅ ∣ w 11 w 12 w 13 ⋯ w 1 l w 21 w 22 w 23 ⋯ w 2 l ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ w q 1 w q 2 w q 3 ⋯ w q l ∣ \begin{vmatrix} b_1 &b_2 &b_3&\cdots& b_q \end{vmatrix} \cdot \begin{vmatrix} w_{11} &w_{12} &w_{13}& \cdots& w_{1l} \\ w_{21} &w_{22} &w_{23}& \cdots& w_{2l} \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ w_{q1} &w_{q2}&w_{q3} &\cdots & w_{ql} \end{vmatrix} b1b2b3bqw11w21wq1w12w22wq2w13w23wq3w1lw2lwql

#####  4.经过输出层的激活函数:
y j k , = f ( β j − θ j ) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ( 4 ) ) y_j^{k^,}=f(\beta_j-\theta_j)\cdots \cdots \cdots \cdots \cdots \cdots \cdots(4)) yjk,=f(βjθj)(4))
#####  5.误差:
E k = 1 2 ∑ j = 1 l ( y j k , − y j k ) 2 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ( 5 ) E_k=\frac{1}{2}\sum_{j=1}^l(y_j^{k^,}-y_j^k)^2 \cdots \cdots \cdots \cdots \cdots \cdots \cdots(5) Ek=21j=1l(yjk,yjk)2(5)
  综上我们可以得知 w h j w_{hj} whj先影响 β j \beta_j βj,再影响 y j k , y_j^{k^,} yjk,,最后影响 E k E_k Ek,(一个 w w w权值只会影响一个 β \beta β)所以我们可得:
Δ w h j = − η ∂ E k ∂ w h j = − η ∂ E k ∂ y j k , ⋅ ∂ y j k , ∂ β j ⋅ ∂ β j ∂ w h j ⋯ ( 6 ) \Delta w_{hj}=-\eta\frac{\partial E_k}{\partial w_{hj}}=-\eta\frac{\partial E_k}{\partial y_j^{k^,}}\cdot \frac{\partial y_j^{k^,}}{\partial \beta_j} \cdot\frac{\partial \beta_j}{\partial w_{hj}}\cdots(6) Δwhj=ηwhjEk=ηyjk,Ekβjyjk,whjβj(6)
其中 ∂ β j ∂ w h j = b h \frac{\partial \beta_j}{\partial w_{hj}}=b_h whjβj=bh,前面提到过, b h b_h bh是第h个隐藏神经元的输出。
g j = ∂ E k ∂ y j k , ⋅ ∂ y j k , ∂ β j = ( y j k , − y j k ) ⋅ f ’ ( β j − θ j ) ⋯ ( 7 ) g_j=\frac{\partial E_k}{\partial y_j^{k^,}}\cdot \frac{\partial y_j^{k^,}}{\partial \beta_j}=(y_j^{k^,}-y_j^k)\cdot f^{’}(\beta_j-\theta_j) \cdots(7) gj=yjk,Ekβjyjk,=(yjk,yjk)f(βjθj)(7)
  而我们选择的激活函数是 S i g m o d Sigmod Sigmod函数,该函数具有一个很好的性质
f ( x ) = 1 1 + e − x ⋯ f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) ⋯ ( 8 ) f(x)=\frac{1}{1+e^{-x}}\cdots f^{‘}(x)=f(x)(1-f(x)) \cdots(8) f(x)=1+ex1f(x)=f(x)(1f(x))(8)
  所以我们有:
f ′ ( β j − θ j ) = f ( β j − θ j ) ⋅ ( 1 − f ( β j − θ j ) ) = y j k ′ ⋅ ( 1 − y j k ′ ) ⋯ ( 9 ) f^{‘}(\beta_j-\theta_j)=f(\beta_j-\theta_j)\cdot (1-f(\beta_j-\theta_j))=y_j^{k^{‘}}\cdot (1-y_j^{k^{‘}}) \cdots(9) f(βjθj)=f(βjθj)(1f(βjθj))=yjk(1yjk)(9)
  综合 f o r m u l a ( 6 ) ( 7 ) ( 9 ) formula(6)(7)(9) formula(6)(7)(9)我们可得:
Δ w h j = − η ∂ E k ∂ w h j = − η g i b h = − η ( y j k ′ − y j k ) ⋅ y j k ′ ⋅ ( 1 − y j k ′ ) ⋅ b h ⋯ ( 10 ) \Delta w_{hj}=-\eta\frac{\partial E_k}{\partial w_{hj}}=-\eta g_i b_h=-\eta (y_j^{k^{‘}}-y_j^k) \cdot y_j^{k^{‘}}\cdot (1-y_j^{k^{‘}})\cdot b_h \cdots(10) Δwhj=ηwhjEk=ηgibh=η(yjkyjk)yjk(1yjk)bh(10)
####  同理:
Δ θ j = − η ∂ E k ∂ θ j = − η ∂ E k ∂ y j k ′ ⋅ ∂ y j k ′ ∂ θ j = η ⋅ g j ⋯ ( 11 ) \Delta \theta_j=-\eta \frac{\partial E_k}{\partial \theta_j}=-\eta \frac{\partial E_k}{\partial y_j^{k^{‘}}}\cdot\frac{\partial y_j^{k^{‘}}}{\partial \theta_j}=\eta\cdot g_j \cdots(11) Δθj=ηθjEk=ηyjkEkθjyjk=ηgj(11)
  我们再看看 Δ v i h \Delta v_{ih} Δvih的值怎么求,还是由 f o r m u l a ( 1 ) , ( 2 ) , ( 3 ) , ( 4 ) , ( 5 ) formula(1),(2),(3),(4),(5) formula(1),(2),(3),(4),(5)推导,一个 v v v权值会影响所有的 β \beta β
Δ v i h = − η e h x i ⋯ ⋯ ⋯ ⋯ ( 12 ) \Delta v_{ih}=-\eta e_h x_i \cdots\cdots\cdots\cdots(12) Δvih=ηehxi(12)
Δ γ h = η e h ⋯ ⋯   ⋯ ( 13 ) \Delta \gamma_h=\eta e_h \cdots \cdots\ \cdots(13) Δγh=ηeh (13)
  其中
e h = ( ∑ j = 1 l ∂ E k ∂ β j ⋅ ∂ β j ∂ b j ) ⋅ f ′ ( α h − γ h ) = ( ∑ j = 1 l ( y j k , − y j k ) ⋅ f ’ ( β j − θ j ) ⋅ w h j ) ⋅ f ′ ( α h − γ h ) ⋯ ⋯ ⋯ ( 14 ) e_h=(\sum_{j=1}^l \frac{\partial E_k}{\partial \beta_j}\cdot \frac{\partial \beta_j}{\partial b_j})\cdot f^{‘}(\alpha_h-\gamma_h)=(\sum_{j=1}^l(y_j^{k^,}-y_j^k)\cdot f^{’}(\beta_j-\theta_j) \cdot w_{hj})\cdot f^{‘}(\alpha_h-\gamma_h) \cdots \cdots \cdots(14) eh=j=1lβjEkbjβjf(αhγh)=(j=1l(yjk,yjk)f(βjθj)whj)f(αhγh)(14)
####  至此,我们所有得公式都推导完毕了,剩下做的就是设定一个迭代终止条件,可以是误差小于一定值时终止递归,也可以是设定迭代次数。这样一个BP神经网络模型就算是设计结束。
  java实现代码和实验数据在我的github上面

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125758.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • async/await 的理解和用法

    async/await 的理解和用法async/await是什么async/await是ES7提出的基于Promise的解决异步的最终方案。asyncasync是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。//async基础语法asyncfunctionfun0(){console.log(1);return1;}fun0().then(val=>{conso

  • pycharm激活码2021年3月【在线破解激活】[通俗易懂]

    pycharm激活码2021年3月【在线破解激活】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • linux objdump命令,Linux objdump命令

    linux objdump命令,Linux objdump命令一、简介objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。二、选项三、实例1)显示文件头信息objdump-ftest2)显示SectionHeader信息objdump-htest3)显示全部Header信息objdump-xtest4)显示全部Header信息,并显示对应的十六进制文件代码objdump-stest5)输出目标文件的符号表objdump…

    2022年10月30日
  • PHP处理字符中的emoji表情

    PHP处理字符中的emoji表情

  • 测试用例编写_功能测试用例自动生成

    测试用例编写_功能测试用例自动生成前言写用例之前,我们应该熟悉API的详细信息。建议使用抓包工具Charles或AnyProxy进行抓包。har2case我们先来了解一下另一个项目har2case他的工作原理就是将当前主流的抓

  • VUE如何关闭Eslint 的方法

    VUE如何关闭Eslint 的方法最近在家里面创建vue项目的时候,手一抖把UseESLinttolintyourcode?(Y/N)选择了Y,然后到写代码的时候,虽然说是浏览器完全能运行结果,但是在cmd就是一直报错。强迫症没有办法。所以大家安装的时候最好选择N.如果不小心选择错了没有关系的,下面就是解决办法,一)在你的项目中找到build—–&gt;webpack.base.conf.js文件…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号