通俗讲解BP神经网络

BP(backward propogation)神经网络是广泛使用的一种神经网络。要我说,神经网络就是一种高端的插值技术。相应比较好的实现教程有:

  1. Matlab工具箱版本(使用简便,但是不适用于理解原理):漫谈ANN(2):BP神经网络
  2. Matlab原理实现(根据原理实现的版本,未使用神经网络工具箱):简单易学的机器学习算法——神经网络之BP神经网络
  3. C++原理实现(根据原理实现):BP神经网络原理及C++实战

三篇文章,第2、3篇适用于理解原理。详细的数学推导已经在里面了,就不赘述了。下面记录一下我在实现过程中碰到的一些错误与总结:

神经网络的过程。见下图:

简单说,就是我有一堆已知的输入向量(每个向量可能有多维),每次读取一个向量(可能会有多维度),每个维度成为上图的输入层中一个输入节点

每个维度的数值,将自己的一部分(按照权值分配、自己选用的传递函数)送给隐藏层。写程序的时候很容易问:第一次的权值怎么办呢?其实(-1,1)随机化就好了,后续会逐渐修正。

这样一来,隐藏层每个节点同样有了属于自己的数值,同样道理,传给输出节点。其中每个输出节点的每个值对应输出向量的一个维度

至此,我们完成了一次 forward pass 过程,方向是:输入层 => 输出层。

熟悉神经网络的同学肯定知道,神经网络使用时有“训练”、“测试”两部分。我们现在考虑训练过程。每次 forward pass 过程之后,输出层的值与真实值之间,存在一个差,这个差记为误差
error。 此时我们根据公式(参考上文中的链接教程,使用不同的传递函数),将误差作为参数传给隐藏层节点。

这些误差有什么用呢?还记得我们各个层之间的随机化的权值么?就是用来修正这个权值的,具体推导过程见上文中的链接教程。同理,修改输入层与隐藏层之间的权值,我们的视角到达输入层。

至此,我们完成了一次 backward pass 过程,方向是:输入层 <= 输出层。

第一个样本的一套做完了,即 forward pass + backward pass。接下来呢?再做第二个样本的一套,并把这层的误差与上一层的误差相加。

然后,第三个样本的一套,加误差;……第N个样本的一套,加误差。这时候,所有样本都过了一遍,看看误差和是否小于一个可以接受的值(这个值根据实际情况,自由设定)时。如果不小于,则进行下一套大保健,即:

清零误差;第一个样本的一套,加误差;第二个样本的一套,加误差;……第N个样本的一套,加误差。误差和误差和是否小于一个可以接受的值。如果不小于,则进行下一套大保健。

误差和达到要求了,妥了,不训练了。此时再用测试数据,输入一个测试样本,将各个维度的数值输入到节点,进行一次 forward pass(测试样本只有输入,无法校对输出的正确性与否)。得到的输出值就是我们的预测值

神经网络神奇之处在这么几个地方:

  1. 传递函数的选取:把上一层各个节点的数值按照权重汇聚之后,作为传递函数的输入,得到函数输出值就是当前层当前节点的数值。这个传递函数,是线性函数?二次函数?还是一元函数?二元函数?都有着不同的性质,适用不同的场景。
  2. 隐藏层节点数:全靠蒙啊……选多了算着慢,选少了不能充分传递消息。
  3. 隐藏层层数:虽然图例中说的是只有一层的情况,但不是说不可以多层。多层自有多层的好处,比如 Deep Learning 中,一般就是七层或者以上。

既然这么通俗易懂,为什么还是在实现中会出现错误呢?下面我说说几个我遇到的错误:

  1. 输入节点,究竟是每个向量的维度一个节点?还是一个样本向量一个节点?尤其是上图中的情况,特别容易造成误解。以为一个样本对应一个输出节点,其实是错误的。对于一个多维度的输入数据,例如下图:
  2. 对待误差究竟是每次训练一个样本,调整到最优,是错误的。误差应该站在整个学习样本的观点来看,需要整个训练样本的累积误差,然后所有样本的多次循环。

最后给大家推荐三篇 IBM DeveloperWorks 上面的相关原理性文章,讲的很清楚:

  1. 神经网络介绍:利用反向传播算法的模式学习
  2. 人工智能 Java 坦克机器人系列: 神经网络,上部
  3. 人工智能 Java 坦克机器人系列: 神经网络,下部
时间: 2024-10-19 21:29:29

通俗讲解BP神经网络的相关文章

BP神经网络识别手写数字项目解析及代码

这两天在学习人工神经网络,用传统神经网络结构做了一个识别手写数字的小项目作为练手.点滴收获与思考,想跟大家分享一下,欢迎指教,共同进步. 平常说的BP神经网络指传统的人工神经网络,相比于卷积神经网络(CNN)来说要简单些. 人工神经网络具有复杂模式和进行联想.推理记忆的功能, 它是解决某些传统方法所无法解决的问题的有力工具.目前, 它日益受到重视, 同时其他学科的发展, 为其提供了更大的机会.1986 年, Romelhart 和Mcclelland提出了误差反向传播算法(Error Back

ECG信号读取,检测QRS,P,T 波(基于小波去噪与检测),基于BP神经网络的身份识别

这学期选了神经网络的课程,最后作业是处理ECG信号,并利用神经网络进行识别. 1  ECG介绍与读取ECG信号 1)ECG介绍  具体ECG背景应用就不介绍了,大家可以参考百度 谷歌.只是简单说下ECG的结构: 一个完整周期的ECG信号有 QRS P T 波组成,不同的人对应不用的波形,同一个人在不同的阶段波形也不同.我们需要根据各个波形的特点,提取出相应的特征,对不同的人进行身份识别. 2)ECG信号读取 首先需要到MIT-BIH数据库中下载ECG信号,具体的下载地址与程序读取内容介绍可以参考

BP神经网络

BP 神经网络中的 BP 为 Back  Propagation 的简写,最早它是由Rumelhart.McCelland等科学家于 1986 年提出来的,Rumelhart 并在Nature 上发表了一篇非常著名的文章 <Learning representations by back-propagating errors> .随着时代的迁移,BP神经网络理论不断的得到改进.更新,现在无疑已成为了应用最为广泛的神经网络模型之一.让我们一起来探索下 BP神经网络最初的 基本模型和概念! 从神经

【转载】BP神经网络

原文地址:http://blog.csdn.net/acdreamers/article/details/44657439 今天来讲BP神经网络,神经网络在机器学习中应用比较广泛,比如函数逼近,模式识别,分类,数据压缩,数据 挖掘等领域.接下来介绍BP神经网络的原理及实现. Contents   1. BP神经网络的认识   2. 隐含层的选取   3. 正向传递子过程   4. 反向传递子过程   5. BP神经网络的注意点   6. BP神经网络的C++实现 1. BP神经网络的认识    

遗传算法优化BP神经网络——非线性函数拟合

遗传算法基本的操作分为: 1.选择操作 2.交叉操作 3.变异操作 遗传算法的基本要素包括染色体编码方法.适应度函数.遗传操作和运行参数. 遗传算法优化BP神经网络算法流程如图3-4所示:

C#实现的bp神经网络并应用于综合评价

由于课程设计选的题目是基于神经网络的综合评价,利用暑假时间用C#实现的bp神经网络.其中用到的_Matrix类是C#实现的矩阵类http://blog.csdn.net/lanqiuchaoren/article/details/37738665.此bp神经网络包含1个隐藏层,其中输入层,隐藏层,输出层个数都可以根据需要更改. 具体bp神经网络代码如下 BP类: using Matrix_Mul; using Excel = Microsoft.Office.Interop.Excel; usi

题外:分类篇(音乐风格分类)基于BP神经网络

语音特征参数MFCC的提取及识别 (2012-09-07 20:24:03) 转载▼ 耳蜗实质上相当于一个滤波器组,耳蜗的滤波作用是在对数频率尺度上进行的,在1000HZ下,人耳的感知能力与频率成线性关系:而在1000HZ以上,人耳的感知能力与频率不构成线性关系,而更偏向于对数关系,这就使得人耳对低频信号比高频信号更敏感.Mel频率的提出是为了方便人耳对不同频率语音的感知特性的研究.频率与Mel频率的转换公式为: MFCC在一定程度上模拟了人耳对语音的处理特点,应用了人耳听觉感知方面的研究成果,

再看BP神经网络

权值 BP网络中 w(1,1)  表示第 1 个输入矢量在输入层和隐含层中的权值.                w(1,2)  表示第 2 个输入矢量在输入层和隐含层中的权值.             ...w(1, j )  表示第 j 个输入矢量在输入层和隐含层中的权值. w(2,1) :第 1 个输入矢量在隐含层和输出层中的权值....   若w( i , j ) 中i > 2,则有多个隐含层. 1. net.IW 属性定义了从网络输入向量到网络层的权值向量(即输入层的权值向量)结构.

BP神经网络推导过程详解

BP算法是一种最有效的多层神经网络学习方法,其主要特点是信号前向传递,而误差后向传播,通过不断调节网络权重值,使得网络的最终输出与期望输出尽可能接近,以达到训练的目的. 一.多层神经网络结构及其描述 下图为一典型的多层神经网络. 通常一个多层神经网络由L层神经元组成,其中:第1层称为输入层,最后一层(第L层)被称为输出层,其它各层均被称为隐含层(第2层~第L-1层). 令输入向量为: \[ \vec x = [x_1 \quad x_2 \quad \ldots \quad x_i \quad