【通俗讲解】BP神经网络
2017-11-26 09:26
295 查看
参考文章:http://www.jianshu.com/p/3d96dbf3f764
David Rumelhart 和 J.McClelland 于1985年提出了BP网络的误差反向后传BP(Back propagation)学习算法
![](http://upload-images.jianshu.io/upload_images/311496-441d17d5c68b51e8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-cd69120fcd11d837.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
输出:
![](http://upload-images.jianshu.io/upload_images/311496-788304add8a4d42b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
输出的导数:
![](http://upload-images.jianshu.io/upload_images/311496-9f9d80f30847ff5f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
使用S型激活函数时,BP网络的输出及其导数图形:
![](http://upload-images.jianshu.io/upload_images/311496-79b487a6deaedcea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
根据S激活函数的图形:
net在 -5~0 的时候导数的值为正,且导数的值逐渐增大,说明此时f(x)在逐渐变大 且 变大的速度越来越快
net在 0~5 的时候导数的值为正,且导数的值逐渐减小,说明此时f(x)在逐渐变大 但是 变大的速度越来越慢
对神经网络进行训练,我们应该尽量将net的值尽量控制在收敛比较快的范围内。
核心思想: 将输出误差
个人理解 : 就如同之前的梯度下降函数每次更新Θ值一样,每次来一个样本,就更新Θ值,使得代价函数变得越来越小。这个类似,先给他们的权值赋个随机初值,然后计算到最后一层(输出层),若输出结果与实际值有误差(这个正常情况下是肯定有的),那么就进行误差的反向传播算法,来优化各层的Θ值(权重值)
学习的过程: 信号的正向传播——》误差的反向传播
输入样本-----输入层------各隐层--------输出层
判断是否转入反向传播阶段
若输入层的实际输出(h(x))与期望的输出(y)不符。
误差反传
误差以某种形式在各层表示-----修正各层单元的权值(w或者Θ)
最终结果
网络输出的误差减少到了可以接受的程度(或 进行到预先设定的学习次数为止)
输入层有
变量定义
![](http://upload-images.jianshu.io/upload_images/311496-d2970e6fdc8b59d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-e2ab9e675c4536e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-5804d4e345477842.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-10e78c58a19dc937.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-8d9d69c91f02f61f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以列出如下等式:
![](http://upload-images.jianshu.io/upload_images/311496-c7e3f502fc2cf4d8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-a89ae136ad18c166.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-520c740ace64f0c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-8d9d69c91f02f61f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
和隐含层的输出计算误差函数对隐含层各神经元的偏导数
![](http://upload-images.jianshu.io/upload_images/311496-3098a88a2f643735.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以列出如下等式:
![](http://upload-images.jianshu.io/upload_images/311496-36e215bf506f1622.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-9e73fbcc520f5aaa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-a5971b30f0f2c1c5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-cab4939f56cc7e87.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最下面那个方框是’=‘号
![](http://upload-images.jianshu.io/upload_images/311496-d11605010a47e0bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
和隐含层各神经元的输出来修正连接权值
![](http://upload-images.jianshu.io/upload_images/311496-1b4e5096764ec8c1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-23e016f9bc21237e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-1275bf9aec0cdfa9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-312a9c907d4661d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
和输入层各神经元的输入参数修正连接权值。
![](http://upload-images.jianshu.io/upload_images/311496-d8f241f19e8742aa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-5d3a02cdb90f0490.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-41528f58e602b184.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-811ffa1d694608cf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
情况1直观表达
当误差对权值的偏导数小于零时,权值调整量为正,实际输出少于期望输出,权值向增大方向调整,使得实际输出与期望输出的差减少。
![](http://upload-images.jianshu.io/upload_images/311496-e20bb9783263595d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
情况二直观表达
作者:东皇Amrzs
链接:http://www.jianshu.com/p/3d96dbf3f764
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
David Rumelhart 和 J.McClelland 于1985年提出了BP网络的误差反向后传BP(Back propagation)学习算法
BP算法基本原理
利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计。一个三层BP网络
![](http://upload-images.jianshu.io/upload_images/311496-441d17d5c68b51e8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
激活函数
必须处处可导(一般都使用S型函数)使用S型激活函数时,BP网络输入与输出关系
输入:![](http://upload-images.jianshu.io/upload_images/311496-cd69120fcd11d837.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
输出:
![](http://upload-images.jianshu.io/upload_images/311496-788304add8a4d42b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
输出的导数:
![](http://upload-images.jianshu.io/upload_images/311496-9f9d80f30847ff5f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
使用S型激活函数时,BP网络的输出及其导数图形:
![](http://upload-images.jianshu.io/upload_images/311496-79b487a6deaedcea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
根据S激活函数的图形:
net在 -5~0 的时候导数的值为正,且导数的值逐渐增大,说明此时f(x)在逐渐变大 且 变大的速度越来越快
net在 0~5 的时候导数的值为正,且导数的值逐渐减小,说明此时f(x)在逐渐变大 但是 变大的速度越来越慢
对神经网络进行训练,我们应该尽量将net的值尽量控制在收敛比较快的范围内。
BP网络的标准学习算法
学习的过程:
神经网络在外界输入样本的刺激下不断改变网络的连接权值,以使网络的输出不断地接近期望的输出。学习的本质:
对各连接权值的动态调整学习规则:
权值调整规则,即在学习过程中网络各神经元的连接权值变化所依据的一定的调整规则BP网络的标准学习算法-算法思想
学习的类型: 有导师学习核心思想: 将输出误差
以某种形式通过隐层向输入层逐层反传(即,将误差分摊给各层的所有单元——各层单元的误差信号,以此来修正各单元权值)
个人理解 : 就如同之前的梯度下降函数每次更新Θ值一样,每次来一个样本,就更新Θ值,使得代价函数变得越来越小。这个类似,先给他们的权值赋个随机初值,然后计算到最后一层(输出层),若输出结果与实际值有误差(这个正常情况下是肯定有的),那么就进行误差的反向传播算法,来优化各层的Θ值(权重值)
学习的过程: 信号的正向传播——》误差的反向传播
BP网络的标准学习算法-学习过程
正向传播输入样本-----输入层------各隐层--------输出层
判断是否转入反向传播阶段
若输入层的实际输出(h(x))与期望的输出(y)不符。
误差反传
误差以某种形式在各层表示-----修正各层单元的权值(w或者Θ)
最终结果
网络输出的误差减少到了可以接受的程度(或 进行到预先设定的学习次数为止)
BP网络的标准学习算法
网络结构输入层有
n个神经元,隐含层有
p个神经元,输出层有
q个神经元
变量定义
![](http://upload-images.jianshu.io/upload_images/311496-d2970e6fdc8b59d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-e2ab9e675c4536e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第一步,网络初始化
给各连接权值分别赋一个区间(-1,1)内的随机数,设定误差函数
e,给定计算精度值
ε和最大学习次数
M。
第二步,随机选取第k个输入样本以及对应的期望输出
![](http://upload-images.jianshu.io/upload_images/311496-5804d4e345477842.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第三步,计算隐含层各神经元的输入和输出
![](http://upload-images.jianshu.io/upload_images/311496-10e78c58a19dc937.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第四步,利用网络期望输出和实际输出,计算误差函数对输出层的各神经元的偏导数
![](http://upload-images.jianshu.io/upload_images/311496-8d9d69c91f02f61f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以列出如下等式:
![](http://upload-images.jianshu.io/upload_images/311496-c7e3f502fc2cf4d8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-a89ae136ad18c166.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-520c740ace64f0c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第五步,利用隐含层到输出层的连接权值、输出层的
![](http://upload-images.jianshu.io/upload_images/311496-8d9d69c91f02f61f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
和隐含层的输出计算误差函数对隐含层各神经元的偏导数
![](http://upload-images.jianshu.io/upload_images/311496-3098a88a2f643735.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以列出如下等式:
![](http://upload-images.jianshu.io/upload_images/311496-36e215bf506f1622.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-9e73fbcc520f5aaa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-a5971b30f0f2c1c5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-cab4939f56cc7e87.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最下面那个方框是’=‘号
第六步,利用输出层各神经元的
![](http://upload-images.jianshu.io/upload_images/311496-d11605010a47e0bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
和隐含层各神经元的输出来修正连接权值
![](http://upload-images.jianshu.io/upload_images/311496-1b4e5096764ec8c1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-23e016f9bc21237e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-1275bf9aec0cdfa9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第七步,利用隐含层各神经元的
![](http://upload-images.jianshu.io/upload_images/311496-312a9c907d4661d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
和输入层各神经元的输入参数修正连接权值。
![](http://upload-images.jianshu.io/upload_images/311496-d8f241f19e8742aa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/311496-5d3a02cdb90f0490.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第八步,计算全局误差
![](http://upload-images.jianshu.io/upload_images/311496-41528f58e602b184.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第九步,判断网络误差是否满足要求,判断网络误差是否满足要求。当误差达到预设精度或学习次数大于设定的最大次数,则结束算法。否则,选取下一个学习样本及对应的期望输出,返回到第三步,进入下一轮学习。
BP算法直观解释
当误差对权值的偏导数大于零时,权值调整量为负,实际输出大于期望输出,权值向减少方向调整,使得实际输出与期望输出的差减少。![](http://upload-images.jianshu.io/upload_images/311496-811ffa1d694608cf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
情况1直观表达
当误差对权值的偏导数小于零时,权值调整量为正,实际输出少于期望输出,权值向增大方向调整,使得实际输出与期望输出的差减少。
![](http://upload-images.jianshu.io/upload_images/311496-e20bb9783263595d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
情况二直观表达
作者:东皇Amrzs
链接:http://www.jianshu.com/p/3d96dbf3f764
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- [转]这是一个广为流传的关于项目管理的通俗讲解
- 对象和接口(通俗讲解)
- 验分享:CSS浮动(float,clear)通俗讲解
- 一个关于项目管理的通俗讲解
- 一个广为流传的关于项目管理的通俗讲解
- 一个广为流传的关于项目管理的通俗讲解
- [收藏]一个广为流传的关于项目管理的通俗讲解
- 这是一个广为流传的关于项目管理的通俗讲解
- 通俗讲解Makefile编写方法<1>
- 通俗讲解:缓存、缓存算法和缓存框架
- 这是一个广为流传的关于项目管理的通俗讲解
- 一个广为流传的关于项目管理的通俗讲解
- 通俗讲解单片机、ARM、MUC、DSP、FPGA、嵌入式错综复杂的关系!
- 这是一个广为流传的关于项目管理的通俗讲解
- 一个关于项目管理的通俗讲解
- (转)经验分享:CSS浮动(float,clear)通俗讲解
- 一个关于项目管理的通俗讲解
- NSNotification的使用(对观察者模式最通俗、易懂的讲解)
- 经验分享:CSS浮动(float,clear)通俗讲解
- mongodb group分组(最详细、最通俗、最易理解的讲解)