




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
BP 神经网络 今天来讲 BP 神经网络 神经网络在机器学习中应用比 较广泛 比如函数逼近 模式识别 分类 数据压缩 数 据 挖掘等领域 接下来介绍 BP 神经网络的原理及实现 Contents 1 BP 神经网络的认识 2 隐含层的选取 3 正向传递子过程 4 反向传递子过程 5 BP 神经网络的注意点 6 BP 神经网络的 C 实现 1 BP 神经网络的认识 BP Back Propagation 神经网络分为两个过程 1 工作信号正向传递子过程 2 误差信号反向传递子过程 在 BP 神经网络中 单个样本有个输入 有个输出 在 输入层和输出层之间通常还有若干个隐含层 实际 上 1989 年 Robert Hecht Nielsen 证明了对于任何闭区 间内的一个连续函数都可以用一个隐含层的 BP 网 络来逼近 这就是万能逼近定理 所以一个三层的 BP 网络就可以完成任意的维到维的映射 即这三层分 别是输入层 I 隐含层 H 输出层 O 如下图示 2 隐含层的选取 在 BP 神经网络中 输入层和输出层的节点个数都是确 定的 而隐含层节点个数不确定 那么应该设置为多少 才合适呢 实际上 隐含层节点个数的多少对神经网络 的性能是有影响的 有一个经验公式可以确定隐含层 节点数目 如下 其中为隐含层节点数目 为输入层节点数目 为输出层 节点数目 为之间的调节常数 3 正向传递子过程 现在设节点和节点之间的权值为 节点的阀值为 每个 节点的输出值为 而每个节点的输出 值是根据上层所有节点的输出值 当前节点与上一层所 有节点的权值和当前节点的阀值还有激活函数来实现 的 具体计算方法如下 其中为激活函数 一般选取 S 型函数或者线性函数 正向传递的过程比较简单 按照上述公式计算即可 在 BP 神经网络中 输入层节点没有阀值 4 反向传递子过程 在 BP 神经网络中 误差信号反向传递子过程比较复杂 它是基于 Widrow Hoff 学习规则的 假设输出层 的所有结果为 误差函数如下 而 BP 神经网络的主要目的是反复修正权值和阀值 使 得误差函数值达到最小 Widrow Hoff 学习规则 是通过沿着相对误差平方和的最速下降方向 连续调整 网络的权值和阀值 根据梯度下降法 权值矢量 的修正正比于当前位置上 E w b 的梯度 对于第个输出 节点有 假设选择激活函数为 对激活函数求导 得到 那么接下来针对有 其中有 同样对于有 这就是著名的学习规则 通过改变神经元之间的连接权 值来减少系统实际输出和期望输出的误差 这个规 则又叫做 Widrow Hoff 学习规则或者纠错学习规则 上面是对隐含层和输出层之间的权值和输出层的阀值计 算调整量 而针对输入层和隐含层和隐含层的阀值调 整量的计算更为复杂 假设是输入层第 k 个节点和隐含 层第 i 个节点之间的权值 那么有 其中有 这样对学习规则理解更为深刻了吧 有了上述公式 根据梯度下降法 那么对于隐含层和输 出层之间的权值和阀值调整如下 而对于输入层和隐含层之间的权值和阀值调整同样有 至此 BP 神经网络的原理基本讲完 5 BP 神经网络的注意点 BP 神经网络一般用于分类或者逼近问题 如果用于分 类 则激活函数一般选用 Sigmoid 函数或者硬极限函 数 如果用于函数逼近 则输出层节点用线性函数 即 BP 神经网络在训练数据时可以采用增量学习或者批量 学习 增量学习要求输入模式要有足够的随机性 对输入模式 的噪声比较敏感 即对于剧烈变化的输入模式 训 练效果比较差 适合在线处理 批量学习不存在输入模 式次序问题 稳定性好 但是只适合离线处理 标准 BP 神经网络的缺陷 1 容易形成局部极小值而得不到全局最优值 BP 神经网络中极小值比较多 所以很容易陷入局 部极小值 这就要求对初始权值和阀值有要求 要使 得初始权值和阀值随机性足够好 可以多次随机来 实现 2 训练次数多使得学习效率低 收敛速度慢 3 隐含层的选取缺乏理论的指导 4 训练时学习新样本有遗忘旧样本的趋势 BP 算法的改进 1 增加动量项 引入动量项是为了加速算法收敛 即如下公式 动量因子一般选取 2 自适应调节学习率 3 引入陡度因子 通常 BP 神经网络在训练之前会对数据归一化处理 即 将数据映射到更小的区间内 比如 0 1 或 1 1 6 BP 神经网络的 C 实现 BP 神经网络的 C 文件如下 BP h ifndef BP H define BP H include vector define LAYER 3 三层神经网络 define NUM 10 每层的最多节点数 define A 30 0 define B 10 0 A 和 B 是 S 型函数的参数 define ITERS 1000 最大训练次数 define ETA W 0 0035 权值调整率 define ETA B 0 001 阀值调整率 define ERROR 0 002 单个样本允许的误差 define ACCU 0 005 每次迭代允许的误差 define Type double define Vector std vector struct Data VectorType x 输入数据 VectorType y 输出数据 class BP public void GetData const VectorData void Train VectorType ForeCast const VectorType private void InitNetWork 初始化网络 void GetNums 获取输入 输出和隐含层节点数 void ForwardTransfer 正向传播子过程 void ReverseTransfer int 逆向传播子过程 void CalcDelta int 计算 w 和 b 的调整量 void UpdateNetWork 更新权值和阀值 Type GetError int 计算单个样本的误差 Type GetAccu 计算所有样本的精度 Type Sigmoid const Type 计算 Sigmoid 的值 private int in num 输入层节点数 int ou num 输出层节点数 int hd num 隐含层节点数 VectorData data 输入输出数据 Type w LAYER NUM NUM BP 网络的权值 Type b LAYER NUM BP 网络节点的阀值 Type x LAYER NUM 每个神经元的值经 S 型函数转化后 的输出值 输入层就为原值 Type d LAYER NUM 记录 delta 学习规则中 delta 的值 endif BP H BP cpp include string h include stdio h include math h include assert h include BP h 获取训练所有样本数据 void BP GetData const VectorData data data data 开始进行训练 void BP Train printf Begin to train BP NetWork n GetNums InitNetWork int num data size for int iter 0 iter ITERS iter for int cnt 0 cnt num cnt 第一层输入节点赋值 for int i 0 i in num i x 0 i data at cnt x i while 1 ForwardTransfer if GetError cnt ERROR 如果误差比较小 则针对单 个样本跳出循环 break ReverseTransfer cnt printf This is the d th trainning NetWork n iter Type accu GetAccu printf All Samples Accuracy is lf n accu if accu ACCU break printf The BP NetWork train End n 根据训练好的网络来预测输出值 VectorType BP ForeCast const VectorType data int n data size assert n in num for int i 0 i in num i x 0 i data i ForwardTransfer VectorType v for int i 0 i ou num i v push back x 2 i return v 获取网络节点数 void BP GetNums in num data 0 x size 获取输入层节点数 ou num data 0 y size 获取输出层节点数 hd num int sqrt in num ou num 1 0 5 获取隐含层节 点数 if hd num NUM hd num NUM 隐含层数目不能超 过最大设置 初始化网络 void BP InitNetWork memset w 0 sizeof w 初始化权值和阀值为 0 也可以初 始化随机值 memset b 0 sizeof b 工作信号正向传递子过程 void BP ForwardTransfer 计算隐含层各个节点的输出值 for int j 0 j hd num j Type t 0 for int i 0 i in num i t w 1 i j x 0 i t b 1 j x 1 j Sigmoid t 计算输出层各节点的输出值 for int j 0 j ou num j Type t 0 for int i 0 i hd num i t w 2 i j x 1 i t b 2 j x 2 j Sigmoid t 计算单个样本的误差 Type BP GetError int cnt Type ans 0 for int i 0 i ou num i ans 0 5 x 2 i data at cnt y i x 2 i data at cnt y i return ans 误差信号反向传递子过程 void BP ReverseTransfer int cnt CalcDelta cnt UpdateNetWork 计算所有样本的精度 Type BP GetAccu Type ans 0 int num data size for int i 0 i num i int m data at i x size for int j 0 j m j x 0 j data at i x j ForwardTransfer int n data at i y size for int j 0 j n j ans 0 5 x 2 j data at i y j x 2 j data at i y j return ans num 计算调整量 void BP CalcDelta int cnt 计算输出层的 delta 值 for int i 0 i ou num i d 2 i x 2 i data at cnt y i x 2 i A x 2 i A B 计算隐含层的 delta 值 for int i 0 i hd num i Type t 0 for int j 0 j ou num j t w 2 i j d 2 j d 1 i t x 1 i A x 1 i A B 根据计算出的调整量对 BP 网络进行调整 void BP UpdateNetWork 隐含层和输出层之间权值和阀值调整 for int i 0 i hd num i for int j 0 j ou num j w 2 i j ETA W d 2 j x 1 i for int i 0 i ou num i b 2 i ETA B d 2 i 输入层和隐含层之间权值和阀值调整 for int i 0 i in num i for int j 0 j hd num j w 1 i j ETA W d 1 j x 0 i for int i 0 i hd num i b 1 i ETA B d 1 i 计算 Sigmoid 函数的值 Type BP Sigmoid const Type x return A 1 exp x B Test cpp include iostream include string h include stdio h include BP h using namespace std double sample 41 4 0 0 0 0 5 1 4 19 020 5 3 3 14 150 5 5 2 14 360 5 3 3 14 150 5 3 2 15 390 5 3 2 15 390 5 5 1 19 680 5 1 2 21 060 5 3 3 14 150 5 5 4 12 680 5 5 2 14 360 5 1 3 19 610 5 3 4 13 650 5 5 5 12 430 5 1 4 19 020 5 1 4 19 020 5 3 5 13 390 5 5 4 12 680 5 1 3 19 610 5 3 2 15 390 1 3 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论