bp神经网络隐含层神经元个数_一步一步教你认识BP神经网络是如何工作的

后向传播(Backpropagation)是训练神经网络最通用的方法之一,网上有许多文章尝试解释后向传播是如何工作的,但是很少有包括真实数字的例子,这篇博文尝试通过一个简单的例子一步一步向你展示BP神经网络是怎样工作的。


原文网址:https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

Python源码:https://github.com/mattm/simple-neural-network

登录不了github的可到百度盘下载:链接:https://pan.baidu.com/s/1sJSoufcXBRU7KtHyNY64JQ ;提取码:4vm3

其他资源:如果你想进一步了解神经网络,我建议你看Adrian Rosebrock的教程 Getting Started with Deep Learning and Python


概述

我们将使用2个输入神经元2个隐含层神经元以及2个输出层神经元组成一个神经网络;另外,隐含层和输出层神经元各包含一个偏差。
这是基本结构:

96a8f58c20c49c454784b1f7197ff48f.png
神经网络的基本结构

首先,我们对权重w偏差b训练的输入/输出设置一个初始值:

e039ace3b3106df9210b4ede136204ce.png
神经网络初始化

后向传播通过优化权重,从而让神经网络学习怎样得到正确的输出。


我们的输入为:0.05和0.10,我们想要神经网络输出:0.01和0.99。

前向反馈

我们把输入值向前传递,就可以计算得到神经网络的输出结果。

我们知道输入值和权重值,就可以计算得到隐含层中每个神经元的值;同理,也可以计算得到输出层每个神经元的值。

计算h1的输入:

10e6cc9a2ee45ae6a76eb1ac83a2c8a4.png
神经元h1的净输入

我们利用激活函数(logistic函数),计算得到h1的输出outh1:

02d89013e54ce3ae7362329862214154.png
神经元h1的输出

同样可以计算得到h2的输出值:
outh2=0.596884378

对输出层神经元重复操作,使用隐含层神经元的输出作为输出层神经元的输入。

这是o1的输出:

de083ec571cba1d2bfe4c5a05537a1d9.png
输出层o1的输入和输出结果

o2的输出值:
outo2=0.772928465

计算整体误差

我们能计算每个输出层神经元的误差:

d7785f911a514cbcf67fc69a18ee1920.png
误差计算公式

例如,o1的目标输出是0.01,但是神经网络输出是0.75136507,因此误差是:

16bed3fd0d63ab0daa8b336d876f4bbd.png
o1的误差

o2的误差:
Eo2=0.023560026

所以,可知神经网络整体误差:

608ffbbf6ebffdf0ee018436c32f96f0.png

那么,BP神经网络是如何逐渐调整权重系数,减小总体误差的呢?

后向传播(BP)方法

后向传播的目的是更新网络中每个权重,以便他们的输出值逐渐接近目标输出,从而最小化输出层神经元的误差。

权重系数对输出结果的影响

例如,我们想要知道w5怎样影响整体误差,即:

eb20c74b18144e69d7bcfe9ecc37d2aa.png

应用链式规则,可以得到:

306803739666553d6d4221953bf5c5cd.png
权重系数对总体误差的影响

下图更清楚地展示了,这个公式是如何得到的,

bb6e2edc83510dc78333560117e615d2.png
图解-权重系数如何响应总体误差

理解这一步,是理解BP如何工作的关键。

(1),output怎样改变整体误差?

94420f204dd09278337a297ea5c6dd67.png
输出结果o1对总体误差的影响

(2),net input怎样改变o1输出?
哈哈,这里需要一点导数的知识:

a4befa5ce70dba77174d6e08e2554bd4.png
输入结果是如何影响输出结果的

(3),w5又怎样改变o1的net input?

6f676ff5167bf3f6997f78958813403c.png
权重系数w5如何改变o1的输入的呢

把它们结合起来,就可以得到:

5fc031b70c145fff93a21682cee4c9fb.png

理解了上一步,我就可以接下来继续看BP是如何调整权重值,从而减小最终的输出误差了

为了减少误差,我们调整当前的权重值,(调整的大小为:误差对权重系数的导数×学习率0.5):

adf08f794f50223a1379a291bdf24bec.png
调整权重系数

同理,我们可以得到更新后的权重w6,w7和w8:

58efdb0050c7c84ba5f51442974a12a6.png
更新后的其他权重系数

如何调整输入层和隐含层之间的权重系数

下一步,我们将继续向后计算w1,w2,w3和w4的新值,注意:我们继续使用初始权重,而不是更新过的权重。

首先,我们看下w1是如何影响总体结果误差的:

2fac44f6844af2d67aa21d87906748a1.png
w1对总体结果误差的影响

对应的图解:

ddddd47f6fc48c7081a0709a7d912857.png
w1和总体结果误差的贡献

首先,计算h1对总体误差的贡献

h1对总体误差贡献可以分为两部分,即Eo1和Eo2,

a103ee35268bad04a1834b4a64a0dbca.png

这里以Eo1为例,

462ef2fcb8d7d6ee2fe190a5c4083d08.png

可知:

e419984099ce566f7de105985b45cc83.png

也可以计算得到:

f4a5ef07efd87aa8daf6c97dd047d969.png

因此,可以计算得到Eo1对outh1的偏导:

bf8b533b101c718a6aef046f19c7c5d4.png

同理,可以得到Eo2对outh1的偏导:

8ee316dd21b24bced270c4dfd532ca99.png

进而,可得到总体误差对outh1的偏导

6f7ff521682295a8c3b04f2d0e3a90a0.png

结合激活函数,可得到outh1对neth1的导数,

bcf9b420e1ad589d26d903e34834c7b9.png

neth1对w1的偏导数如下:

fc5015e1149b6d38d1684a9b7ff91882.png

把它们串联起来,可得:

86ab1f2110b9ca743a6262dd561b5189.png

现在我们可以去更新权重值w1了:

8e60d58d16680ffa8a3099549248496d.png

同理,可对w2,w3和w4进行更新:

c9075606fb6e0c0fa3b1bae1382fbe75.png

最后,我们统一更新所有权重(即计算完w1-w8后,统一替换原有的权重值)。

效果如何呢?

神经网络的初始误差为0.298371109,在一次权重调整后,整体误差降至0.291027924;看似变化不大,但重复10000次之后,误差就可以下降至0.000035085。这就是BP算法的精髓:找到正确的方向,积跬步以至千里。

最后,神经网络o1和o2输出的值分别为0.015912196和0.984065734,和目标值0.01和0.99十分接近了。

BP神经网络的精髓你get到了吗?

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值