BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。

一个神经网络的结构示意图如下所示。

BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。输入层神经元的个数由样本属性的维度决定,输出层神经元的个数由样本分类个数决定。隐藏层的层数和每层的神经元个数由用户指定。每一层包含若干个神经元,每个神经元包含一个而阈值,用来改变神经元的活性。网络中的弧线表示前一层神经元和后一层神经元之间的权值。每个神经元都有输入和输出。输入层的输入和输出都是训练样本的属性值。

对于隐藏层和输出层的输入
其中,是由上一层的单元i到单元j的连接的权;是上一层的单元i的输出;而是单元j的阈值。

神经网络中神经元的输出是经由赋活函数计算得到的。该函数用符号表现单元代表的神经元活性。赋活函数一般使用simoid函数(或者logistic函数)。神经元的输出为:

除此之外,神经网络中有一个学习率(l)的概念,通常取0和1之间的值,并有助于找到全局最小。如果学习率太小,学习将进行得很慢。如果学习率太大,可能出现在不适当的解之间摆动。

交代清楚了神经网络中基本要素,我们来看一下BP算法的学习过程:

BPTrain(){

初始化network的权和阈值。

while 终止条件不满足 {

for samples中的每个训练样本X {

// 向前传播输入

for 隐藏或输出层每个单元j {

;//
相对于前一层i,计算单元j的净输入 ;//
计算单元j的输出

}

// 后向传播误差

for 输出层每个单元j {

;//
计算误差

}

for 由最后一个到第一个隐藏层,对于隐藏层每个单元j {

;//
k是j的下一层中的神经元

}

for network中每个权
{


; // 权增值


; // 权更新

}

for network中每个偏差
{


// 偏差增值

;//
偏差更新

}

}

}

算法基本流程就是:

1、初始化网络权值和神经元的阈值(最简单的办法就是随机初始化)

2、前向传播:按照公式一层一层的计算隐层神经元和输出层神经元的输入和输出。

3、后向传播:根据公式修正权值和阈值

直到满足终止条件。

算法中还有几点是需要说明的:

1、关于是神经元的误差。

对于输出层神经元,其中,是单元j的实际输
出,而是j基于给定训练样本的已知类标号的真正输出。

对于隐藏层神经元,其中,是由下一较高层中单元k到单元j的连接权,而是单元k的误差。

权值增量是,阈值增量是,其中是学习率。

对于的推导采用了梯度下降的算法。推导的前提是保证输出单元的均方差最小。,其中P是样本总数,m是输出层神经元个数是样本实际输出,是神经网络输出。

梯度下降思路就是对的导数。

对于输出层:

其中的就是

对于隐藏层:

其中=就是隐藏层的误差计算公式。

2、关于终止条件,可以有多种形式:

§ 前一周期所有的都太小,小于某个指定的阈值。

§ 前一周期未正确分类的样本百分比小于某个阈值。

§ 超过预先指定的周期数。

§ 神经网络的输出值和实际输出值的均方误差小于某一阈值。

一般地,最后一种终止条件的准确率更高一些。

在实际使用BP神经网络的过程中,还会有一些实际的问题:

1、 样本处理。对于输出,如果只有两类那么输出为0和1,只有当趋于正负无穷大的时候才会输出0,1。因此条件可适当放宽,输出>0.9时就认为是1,输出<0.1时认为是0。对于输入,样本也需要做归一化处理。

2、 网络结构的选择。主要是指隐藏层层数和神经元数决定了网络规模,网络规模和性能学习效果密切相关。规模大,计算量大,而且可能导致过度拟合;但是规模小,也可能导致欠拟合。

3、 初始权值、阈值的选择,初始值对学习结果是有影响的,选择一个合适初始值也非常重要。

4、 增量学习和批量学习。上面的算法和数学推导都是基于批量学习的,批量学习适用于离线学习,学习效果稳定性好;增量学习使用于在线学习,它对输入样本的噪声是比较敏感的,不适合剧烈变化的输入模式。

5、 对于激励函数和误差函数也有其他的选择。

总的来说BP算法的可选项比较多,针对特定的训练数据往往有比较大的优化空间。

BP 神经网络的更多相关文章

  1. BP神经网络原理及python实现

    [废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...

  2. BP神经网络

    秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation ...

  3. 数据挖掘系列(9)——BP神经网络算法与实践

    神经网络曾经很火,有过一段低迷期,现在因为深度学习的原因继续火起来了.神经网络有很多种:前向传输网络.反向传输网络.递归神经网络.卷积神经网络等.本文介绍基本的反向传输神经网络(Backpropaga ...

  4. BP神经网络推导过程详解

    BP算法是一种最有效的多层神经网络学习方法,其主要特点是信号前向传递,而误差后向传播,通过不断调节网络权重值,使得网络的最终输出与期望输出尽可能接近,以达到训练的目的. 一.多层神经网络结构及其描述 ...

  5. 极简反传(BP)神经网络

    一.两层神经网络(感知机) import numpy as np '''极简两层反传(BP)神经网络''' # 样本 X = np.array([[0,0,1],[0,1,1],[1,0,1],[1, ...

  6.  BP神经网络

     BP神经网络基本原理 BP神经网络是一种单向传播的多层前向网络,具有三层或多层以上的神经网络结构,其中包含输入层.隐含层和输出层的三层网络应用最为普遍. 网络中的上下层之间实现全连接,而每层神经元之 ...

  7. BP神经网络学习笔记_附源代码

    BP神经网络基本原理: 误差逆传播(back propagation, BP)算法是一种计算单个权值变化引起网络性能变化的较为简单的方法.由于BP算法过程包含从输出节点开始,反向地向第一隐含层(即最接 ...

  8. 机器学习(一):梯度下降、神经网络、BP神经网络

    这几天围绕论文A Neural Probability Language Model 看了一些周边资料,如神经网络.梯度下降算法,然后顺便又延伸温习了一下线性代数.概率论以及求导.总的来说,学到不少知 ...

  9. 基于Storm 分布式BP神经网络,将神经网络做成实时分布式架构

    将神经网络做成实时分布式架构: Storm 分布式BP神经网络:    http://bbs.csdn.net/topics/390717623 流式大数据处理的三种框架:Storm,Spark和Sa ...

  10. BP神经网络算法学习

    BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是眼下应用最广泛的神经网络模型之中的一个 ...

随机推荐

  1. 在自己笔记本电脑上如何访问虚拟机的内容、包括可以使用ssh、访问tomcat、访问nginx

    1.给自己的电脑设置一个回环网卡,关于如何配置回环网卡,可以百度搜索一下 设置好后的状态如下: 并把回环网卡的ipv4的值设置成192.168.1.1 配置如下: 2.将vmware中的"虚 ...

  2. 信用卡3D验证相关资料

    3D 验证服务,是银行与VISA .MASTERCARD国际组织联合推出的为保障银行维萨及万事达信用卡持卡客户网上交易安全,防范网上伪冒交易的一项信用卡网上支付安全验证服务( 维萨卡使用的验证服务叫& ...

  3. tomcat启动批处理——setclasspath.bat

    除了上面两个批处理,还有一个比较重要的脚本,即是setclasspath.bat,它主要负责寻找.检查JAVA_HOME和JRE_HOME两个变量. ************************* ...

  4. java项目管理工具maven使用初级

    一.前言        早就知道maven 在java 项目的管理方面名声显赫,于是就想着学习掌握之,于是查阅了大量文档.发现这些文档的作者都是java 的大腕,大多都是站在掌握了一定maven 基础 ...

  5. linux下的清屏命令

    Linux下有两个清屏命令: clear 这个命令将会刷新屏幕,系统的操作是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息.一般都会使用这个命令. reset 这个命令将完全刷新终 ...

  6. SQL Server SA 最佳实践(也许不仅仅是翻译)

    老实说,本文主要部分是翻译的,并且由于英语水平的问题,我没有完全翻译,有些我觉得不重要的就跳过了,目前看来应该八九不离十,或者说不会影响最终效果,对于英语水平好的读者,可以自行查看原文.但这一年里面我 ...

  7. Servlet之文件上传

    上传表单中的注意事项: 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法 表单 enctype 属性应该设置为multipart/form-data 下面的实例是借助于com ...

  8. 使用Swift开发一个MacOS的菜单状态栏App

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/52054107 ...

  9. 收藏了4年的Android 源码分享

    Android 超过2个G的源代码集合~~几乎涵盖了所有功能效果的实现,一应俱全~~应有尽有~~ 360云盘地址:Android 各类源码集合汇总 (提取码:f930) 另外,附上Github上及自己 ...

  10. 如何自动增加和从代码读取Xcode项目的版本号

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Xcode项目和版本号相关的有2个地方Version和Buil ...