BP神经算法是啥?能给点既通俗易懂又比较详细的回答吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BP神经算法是啥?能给点既通俗易懂又比较详细的回答吗相关的知识,希望对你有一定的参考价值。
参考技术A BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。BP神经网络算法是在BP神经网络现有算法的基础上提出的,是通过任意选定一组权值,将给定的目标输出直接作为线性方程的代数和来建立线性方程组,解得待求权,不存在传统方法的局部极小及收敛速度慢的问题,且更易理解。
1 传统的BP算法简述
BP算法是一种有监督式的学习算法,其主要思想是:输入学习样本,使用反向传播算法对网络的权值和偏差进行反复的调整训练,使输出的向量与期望向量尽可能地接近,当网络输出层的误差平方和小于指定的误差时训练完成,保存网络的权值和偏差。具体步骤如下: (1)初始化,随机给定各连接权[w],[v]及阀值θi,rt。 (2)由给定的输入输出模式对计算隐层、输出层各单元输出 bj=f(■wijai-θj) ct=f(■vjtbj-rt) 式中:bj为隐层第j个神经元实际输出;ct为输出层第t个神经元的实际输出;wij为输入层至隐层的连接权;vjt为隐层至输出层的连接权。 dtk=(ytk-ct)ct(1-ct) ejk=[■dtvjt] bj(1-bj) 式中:dtk为输出层的校正误差;ejk为隐层的校正误差。 (3)计算新的连接权及阀值,计算公式如下: vjt(n+1)=vjt(n)+?琢dtkbj wij(n+1)=wij(n)+?茁ejkaik rt(n+1)=rt(n)+?琢dtk θj(n+1)=θj(n)+?茁ejk 式中:?琢,?茁为学习系数(0<?琢<1,0<?茁<1)。 (4)选取下一个输入模式对返回第2步反复训练直到网络设输出误差达到要求结束训练。 传统的BP算法,实质上是把一组样本输入/输出问题转化为一个非线性优化问题,并通过负梯度下降算法,利用迭代运算求解权值问题的一种学习方法,但其收敛速度慢且容易陷入局部极小,为此提出了一种新的算法,即高斯消元法。
2 改进的BP网络算法
2.1 改进算法概述 此前有人提出:任意选定一组自由权,通过对传递函数建立线性方程组,解得待求权。本文在此基础上将给定的目标输出直接作为线性方程等式代数和来建立线性方程组,不再通过对传递函数求逆来计算神经元的净输出,简化了运算步骤。没有采用误差反馈原理,因此用此法训练出来的神经网络结果与传统算法是等效的。其基本思想是:由所给的输入、输出模式对通过作用于神经网络来建立线性方程组,运用高斯消元法解线性方程组来求得未知权值,而未采用传统BP网络的非线性函数误差反馈寻优的思想。 2.2 改进算法的具体步骤 对给定的样本模式对,随机选定一组自由权,作为输出层和隐含层之间固定权值,通过传递函数计算隐层的实际输出,再将输出层与隐层间的权值作为待求量,直接将目标输出作为等式的右边建立方程组来求解。 现定义如下符号(见图1):x (p)输入层的输入矢量;y (p)输入层输入为x (p)时输出层的实际输出矢量;t (p)目标输出矢量;n,m,r分别为输入层、隐层和输出层神经元个数;W为隐层与输入层间的权矩阵;V为输出层与隐层间的权矩阵。具体步骤如下: (1)随机给定隐层和输入层间神经元的初始权值wij。 (2)由给定的样本输入xi(p)计算出隐层的实际输出aj(p)。为方便起见将图1网络中的阀值写入连接权中去,令:隐层阀值θj=wnj,x(n)=-1,则: aj(p)=f(■wijxi(p)) (j=1,2…m-1)。 (3)计算输出层与隐层间的权值vjr。以输出层的第r个神经元为对象,由给定的输出目标值tr(p)作为等式的多项式值建立方程,用线性方程组表示为: a0(1)v1r+a1(1)v2r+…+am(1)vmr=tr(1)a0(2)v1r+a1(2)v2r+…+am(2)vmr=tr(2) ……a0(p)v1r+a1(p)v2r+…+am(p)vmr=tr(p) 简写为: Av=T 为了使该方程组有唯一解,方程矩阵A为非奇异矩阵,其秩等于其增广矩阵的秩,即:r(A)=r(A┊B),且方程的个数等于未知数的个数,故取m=p,此时方程组的唯一解为: Vr=[v0r,v2r,…vmr](r=0,1,2…m-1) (4)重复第三步就可以求出输出层m个神经元的权值,以求的输出层的权矩阵加上随机固定的隐层与输入层的权值就等于神经网络最后训练的权矩阵。
3 计算机运算实例
现以神经网络最简单的XOR问题用VC编程运算进行比较(取神经网络结构为2-4-1型),传统算法和改进BP算法的误差(取动量因子α=0.001 5,步长η=1.653) 参考技术B BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。追问
具体算法能说一下吗?
追答(2)作用函数模型
作用函数是反映下层输入对上层节点刺激脉冲强度的函数又称刺激函数,一般取为(0,1)内连续取值Sigmoid函数: f(x)=1/(1+e-x) (3)
(3)误差计算模型
误差计算模型是反映神经网络期望输出与计算输出之间误差大小的函数:
Ep=1/2×∑(tpi-Opi)2 (4)
tpi- i节点的期望输出值;Opi-i节点计算输出值。
(4)自学习模型
神经网络的学习过程,即连接下层节点和上层节点之间的权重拒阵Wij的设定和误差修正过程。BP网络有师学习方式-需要设定期望值和无师学习方式-只需输入模式之分。自学习模型为
△Wij(n+1)= h ×Фi×Oj+a×△Wij(n) (5)
h -学习因子;Фi-输出节点i的计算误差;Oj-输出节点j的计算输出;a-动量因子。
2.3 BP网络模型的缺陷分析及优化策略
(1)学习因子h 的优化
采用变步长法根据输出误差大小自动调整学习因子,来减少迭代次数和加快收敛速度。
h =h +a×(Ep(n)- Ep(n-1))/ Ep(n) a为调整步长,0~1之间取值 (6)
(2)隐层节点数的优化
隐节点数的多少对网络性能的影响较大,当隐节点数太多时,会导致网络学习时间过长,甚至不能收敛;而当隐节点数过小时,网络的容错能力差。利用逐步回归分析法并进行参数的显著性检验来动态删除一些线形相关的隐节点,节点删除标准:当由该节点出发指向下一层节点的所有权值和阈值均落于死区(通常取±0.1、±0.05等区间)之中,则该节点可删除。最佳隐节点数L可参考下面公式计算:
L=(m+n)1/2+c (7)
m-输入节点数;n-输出节点数;c-介于1~10的常数。
(3)输入和输出神经元的确定
利用多元回归分析法对神经网络的输入参数进行处理,删除相关性强的输入参数,来减少输入节点数。
(4)算法优化
通俗的例子去理解BP网络
最近因为论文需要,研究了下神经网络,重点看了BP网络。
学习过程中,我不得不感叹造物主的神奇和人类智慧的魅力,同时我也产生了一些想法想写出来跟大家交流。
大家在刚开始学习神经网络的时候可能会比较难理解这种算法原理,我也不例外,但好在还有点高数和数值分析的功底,在拜读了好几篇大牛的文章后,勉勉强强对BP网络有了个大概的认识。
我写这篇博文的目的主要是想让更多的神经网络初学者能加深自己对神经网络的理解,对神经网络有个宏观整体的认识。
大家都知道学习算法应该是“知其然并知其所以然”,只有这样才能真正领悟算法的思想。网上关于BP网络的资料有很多,大多都是从数学的角度给大家介绍BP网络的结构、算法步骤以及为什么这么做。从数学的角度好处是逻辑清晰,思维严谨,可以证明算法的每一步都是正确的,而且还有利于编程,但是从数学角度理解算法,往往是晦涩难懂的,一个个复杂的公式摆在人眼前,想不晕都难,而且不利于大家理解这些公式背后到底代表什么样的意义。
于是我想是否可以举个日常生活中的例子,从这个例子中的现象来解释下神经网络这么做的意义?
答案是肯定的毋庸置疑,毕竟我们讲的神经网络是“人工”造出来的,它们不是人类的创举,人类通过自己的智慧发现了自然神经网络背后蕴藏的数学奥秘并加以应用(可以说是“仿生学”)。
这里强调下:因为我重点学习了BP网络,所以下面的例子都是围绕BP网络展开讲的。下面讲的例子不涉及复杂的公式,也不涉及神经网络算法的具体步骤,只谈谈神经网络在这个例子中的表现。因为不是用严谨的数学去表述,只是通俗化的理解再加上我文笔太菜,所以在表述上可能会不精确,大家关键理解其中的意思(如果你觉得有更好的表述可以在下方评论)。
我举地例子是小孩学习乘法表。为什么举这个例子呢?
因为比较有代表性咯,小孩子的大脑尚在发育阶段,其中的神经网络可以看做是未训练过的。而且大家也都是过来人,比较熟悉。
下面开始说:
如果我现在问你7乘8等于多少,你肯定脱口而出56,但是你还记得小时候背乘法表时候的痛苦吗(如果你忘了,可以去网上看看那些小萌娃被乘法表折磨的视频,太可爱了)。
现在假设输入样本是“乘数+被乘数”,一个是7,一个是8,人脑看成 一个简单的BP网络,输出的积是56,即:
(7,8)→大脑(BP)→56
再介绍下例子的主人公:小明和小明的母亲。
小明拿到乘法表,当看到“7x8=56”的时候,在心里默念“7 8 56...7 8 56”,这个阶段在小明大脑中发生的对应过程我们可以理解为是BP网络训练的第一步:前向传播。这个过程主要是为了让小明大脑对“7x8”有个印象,当小明再次看到“7x8”的时候能做出一个不会偏离太远的应答,至于这个应答是否正确是后面考虑的事(这其实很好理解,如果你从来没有接触过乘法表,当问起你“7x8=?”的时候,你会是什么反应,“=1?,=2?还是=一朵花?”,你的答案可能会偏出正确答案很多,但如果你背过“7x8=56”,即使现在不记得正确答案了,你可能就在56附近纠结,是55还是57)。
小明花了半天时间,硬着头皮记住了乘法表。开心地找他妈妈汇报说:“妈妈,乘法表我记住了,可以出去玩了吗?”(真是个贪玩的小孩)小明的母亲听小明说记住了乘法表,所以想考考小明,说:“我提的问题你都答对了,就可以出去玩了”,小明点点头,他母亲就开始问,前面几个问题小明都答对了,当被问到“7x8=?”时候,小明脑海中浮现的数字开始模糊,只记得答案是“5”开头的数字,但是具体多少就是想不出来,于是他蒙了个数字,“54?”,母亲摇摇头。
注意:如果此时母亲对小明给出的答案不做任何反应,小明是无法知道自己的答案是否正确的。母亲的反应实质是对小明给出的54的一种反馈,这种反馈目的是为了使小明意识到自己的错误。同理当我们使用BP网络前向训练完一组样本时候,我们要看网络的输出值是否符合我们的要求,什么是符合要求的?就要拿预期输出值与实际输出值进行比较,相等自然最好,但是现实往往只需要满足一定精度就可以了。再看这个例子,小明母亲对小明给的答案的反馈只是摇摇头,这种反馈传达给小明的信息只是“自己给出的答案错了”,但是没有传达给小明任何关于“如何修改自己答案”的信息,小明就会纠结“我给出的54是大了还是小了,我应该怎么修改”。反馈是有方向的,好的反馈还是坏的反馈?生物中也有正反馈和负反馈,反馈的信息量越大,网络的修正就能更迅速。BP网络第二阶段:反向传播。第一阶段:前向传播是为了输出一个实际值,第二阶段:反向传播通过实际值与预期值的残差(就是一种反馈,如果研究过这个残差公式,会发现残差是有正负之分的,也就是反馈有正负之分)来修正网络,使得再次输入“7x8”时候能得到更接近56的答案。实际值与预期值的残差在反向传播过程中会按照对应的权重先传递给隐藏层再传给输入层,这其实也好理解,电视上犯罪团伙判刑看到过吧,这么多人一起造成的犯罪事实,最后量刑程度是不同的,你会发现参与犯罪的程度越深,造成的影响越恶劣的主犯判刑往往更重,这里的参与度就好比BP网络的权重,简单点说就是,你造的孽越多,你的责任就越大。BP网络的误差反向传播就是这个原理。
在反向传播修正网络的过程中还涉及一个学习率或者步长的问题。说回小明背乘法表的例子,如果母亲反馈说54低了,那小明就会往比54大的答案答(反向传播为的就是这个效果,使误差尽量的小)。这时候就有一个问题,小明是该从54一个数一个数的往上加,还是56、58..的答法,这就是“步长”的问题了(说明下,在BP网络中,学习率或者步长是在更新权重和偏置的时候才会用上的参数,而我在这里说的“步长”其实是BP网络中权值或者偏置更新对最后网络输出结果的影响)。“学习率”或者“步长”选的好,小明就会越快得出正确值。他如果选“步长”为1,那就要修正两次;如果是选“步长”为2只要修正一次就得到正确答案了。越是复杂的神经网络,训练起来就越慢,所以参数的选择很重要,当然,“步长”也不是越大就越好,你迈的步子越大,不一定越快到达目的地,所谓“欲速则不达”。小明如果选择“步长”为3,那么修正一次后他给出的答案变成了57,这时母亲就会说57太大了,小明只好往比57小的数答,他选了“步长”为2,那么这一次给出的答案变成了55,还是不对。如此反复几次,小明好不容易答对了56,期间由于“步长”选择太大,修正了好几次。同理BP网络中如果学习率或者步长选择过大,就会产生类似小明这种反复的现象,叫做“震荡”——在一个极值附近徘徊,但是就是得不到极值(也是痛苦)。
最后经过一番波折,小明得到了正确答案56,也如愿的出去欢快地玩耍了,但是故事还没有结束。第二天,小明的母亲又问起了乘法表,当问到“7x8=?”,小明又答错了,第三天,第四天。。。。小明母亲每天问一次(orz),小明每次都答错(小明你是不是傻?)我估计再耐心的家长都要疯了(教育孩子不容易啊)“你看看隔壁老王的儿子小王,乘法表一学就会,记住了就不会忘,你再看看你“7x8=56”就是记不住”(“妈妈再打我一次”,什么鬼)。长辈都是喜欢聪明小孩子的,什么叫聪明?一学就会,一点就透。反映在神经网络中,就是网络训练,收敛速度要快,相同的输入样本能更快地得到预期值,我们也更喜欢这种收敛快的网络。
神经网络训练的快慢跟以下因素息息相关:
1.参数(权值,偏置,学习率等)
2.网络结构(层数,每层节点个数)
不知道大家发现没有,我没有从这个例子去讲参数,网络结构的初始化,那是因为不同人,不同的生长阶段,大脑的构造,神经元分布是不同,自然,参数和网络结构也因人而异。
3.要解决的问题
神经网络算法发展有一段时间了,但是对于不同问题还是无法明确什么样的网络才是最适合的,人们只有不断去改进选择的网络,不断去尝试。这其实也好理解,不同的人擅长的领域不同,你可能比较擅长数学,他可能在音乐方面更有造诣,不同的人大脑构造不同,学习不同的事物是有快慢之分的。
4.算法
不同的网络学习过程是不同的,如BP网络采用了反向传播算法来修正网络,但是即使相同网络结构,不同算法也有不同学习速率。上面的小明大脑采用的可能是“最速梯度下降算法”,小王的则可能采用“共轭梯度算法”。
打了这么多字,手都酸了,相信大家眼睛也看酸了(果然还是数学更简洁)。
最后来白话下:
不同的人不同的大脑结构(参数初始值不同,网络结构与算法不同),决定了你在不同领域的天赋(网络收敛快)不同,天赋高应该怀有一颗感恩之心,天赋低也不要气馁,要努力学习(网络训练),不要怕犯错,你去学了就不会错太多(前向传播),犯了错要反思,要改正(反向传播),错的多需要改的就多(更新参数),改完以后继续尝试,直到不再犯错(网络训练结束)。
希望我的这篇博文能让你在学习BP网络的过程中加深对BP网络的整体认识。
简单的表面背后隐藏的是复杂的真相。我们在追寻真相的过程中,是否应该将表象与真相结合起来?
以上是关于BP神经算法是啥?能给点既通俗易懂又比较详细的回答吗的主要内容,如果未能解决你的问题,请参考以下文章