BP算法的改进(可打印修改)
- 格式:pdf
- 大小:55.20 KB
- 文档页数:1
BP算法的缺点与改进
BP算法的缺点与改进
目前,BP网络得到了越来越广泛的应用,但是BP算法在应用中也同时暴露出一定的缺陷: l)训练次数多,学习效率低,收敛速度慢;
2)易形成局部极小;’
3)隐层神经元的数目难以确定;
4)训练时有学习新样本而忘记旧样本的趋势。
针对这些缺陷,国内外研究者提出了许多有效的改进方法,如:
l)改进学习率参数的调节方法,如使学习率粉的大小随误差梯度变化;
2)改进神经网络的结构,如增加隐层神经元的数目;
3)改变激励函数,如把sigmoid函数改成分段函数;
4)权值修正方法,如增加动量项。
(1)BP神经网络的建立
神经网络工具箱含有许多专用函数用来建立神经网络,其中函数newff()来创建一个BP神经网络。
此函数的调用格式为:
net=newff(PR,【5152…S司,{TITZ…TN},BTF,BLF,PF)
net=newff:用于在对话框中创建BP神经网络;
PR:R*2维矩阵(共有R组输入),每行由每组输入的最大值和最小值组
si:第i层神经元数;
Ti:第i层的激励函数,“tansig”为默认时函数;
BTF:BP神经网络的训练函数,“traiulm”为默认时函数;
BLF:BP神经网络中权值和阂值的算法,“leamgdm”为默认函数;
PF:BP神经网络的性能函数,“mse”为默认函数。
改进的BP神经网络算法以下是一个简单的改进的BP神经网络算法的C语言源码,注释已经添加在代码中,代码的运行结果是将一个简单的线性函数拟合为输入值的平方的2倍。
```c#include <stdio.h>#include <stdlib.h>#include <math.h>#define INPUT_LAYER_SIZE 1 // 输入层节点个数#define HIDDEN_LAYER_SIZE 10 // 隐藏层节点个数#define OUTPUT_LAYER_SIZE 1 // 输出层节点个数#define LEARNING_RATE 0.1 // 学习率double sigmoid(double x)return 1 / (1 + exp(-x));double sigmoid_derivative(double x)return x * (1 - x);//训练函数void train(double input[INPUT_LAYER_SIZE], doubleexpected_output[OUTPUT_LAYER_SIZE], doublew_ih[INPUT_LAYER_SIZE][HIDDEN_LAYER_SIZE], doublew_ho[HIDDEN_LAYER_SIZE][OUTPUT_LAYER_SIZE], double *b_h, double *b_o)//前向传播double hidden_layer_activations[HIDDEN_LAYER_SIZE];double output_layer_activations[OUTPUT_LAYER_SIZE];for (int i = 0; i < HIDDEN_LAYER_SIZE; i++)double activation = 0;for (int j = 0; j < INPUT_LAYER_SIZE; j++)activation += input[j] * w_ih[j][i];}activation += *b_h;hidden_layer_activations[i] = sigmoid(activation);}for (int i = 0; i < OUTPUT_LAYER_SIZE; i++)double activation = 0;for (int j = 0; j < HIDDEN_LAYER_SIZE; j++)activation += hidden_layer_activations[j] * w_ho[j][i];}activation += *b_o;output_layer_activations[i] = sigmoid(activation);}//反向传播double output_layer_errors[OUTPUT_LAYER_SIZE];double hidden_layer_errors[HIDDEN_LAYER_SIZE];for (int i = 0; i < OUTPUT_LAYER_SIZE; i++)output_layer_errors[i] = (expected_output[i] - output_layer_activations[i]) *sigmoid_derivative(output_layer_activations[i]);}for (int i = 0; i < HIDDEN_LAYER_SIZE; i++)double error = 0;for (int j = 0; j < OUTPUT_LAYER_SIZE; j++)error += output_layer_errors[j] * w_ho[i][j];}hidden_layer_errors[i] = error *sigmoid_derivative(hidden_layer_activations[i]);}//更新权值和偏置for (int i = 0; i < HIDDEN_LAYER_SIZE; i++)for (int j = 0; j < OUTPUT_LAYER_SIZE; j++)w_ho[i][j] += LEARNING_RATE * output_layer_errors[j] * hidden_layer_activations[i];}}for (int i = 0; i < INPUT_LAYER_SIZE; i++)for (int j = 0; j < HIDDEN_LAYER_SIZE; j++)w_ih[i][j] += LEARNING_RATE * hidden_layer_errors[j] * input[i];}}*b_o += LEARNING_RATE * output_layer_errors[0];*b_h += LEARNING_RATE * hidden_layer_errors[0];//测试函数double test(double input[INPUT_LAYER_SIZE], doublew_ih[INPUT_LAYER_SIZE][HIDDEN_LAYER_SIZE], doublew_ho[HIDDEN_LAYER_SIZE][OUTPUT_LAYER_SIZE], double b_h, double b_o)double hidden_layer_activations[HIDDEN_LAYER_SIZE];double output_layer_activations[OUTPUT_LAYER_SIZE];for (int i = 0; i < HIDDEN_LAYER_SIZE; i++)double activation = 0;for (int j = 0; j < INPUT_LAYER_SIZE; j++)activation += input[j] * w_ih[j][i];}activation += b_h;hidden_layer_activations[i] = sigmoid(activation);}for (int i = 0; i < OUTPUT_LAYER_SIZE; i++)double activation = 0;for (int j = 0; j < HIDDEN_LAYER_SIZE; j++)activation += hidden_layer_activations[j] * w_ho[j][i]; }activation += b_o;output_layer_activations[i] = sigmoid(activation);}return output_layer_activations[0];int mai//初始化权值和偏置double w_ih[INPUT_LAYER_SIZE][HIDDEN_LAYER_SIZE];double w_ho[HIDDEN_LAYER_SIZE][OUTPUT_LAYER_SIZE];double b_h = 0;double b_o = 0;for (int i = 0; i < INPUT_LAYER_SIZE; i++)for (int j = 0; j < HIDDEN_LAYER_SIZE; j++)w_ih[i][j] = ((double) rand( / RAND_MAX) * 2 - 1; // [-1, 1]之间的随机数}}for (int i = 0; i < HIDDEN_LAYER_SIZE; i++)for (int j = 0; j < OUTPUT_LAYER_SIZE; j++)w_ho[i][j] = ((double) rand( / RAND_MAX) * 2 - 1; // [-1, 1]之间的随机数}}//训练模型for (int epoch = 0; epoch < MAX_EPOCHS; epoch++)double input = ((double) rand( / RAND_MAX) * 10; // [0, 10]之间的随机数double expected_output = 2 * pow(input, 2); // y = 2x^2train(&input, &expected_output, w_ih, w_ho, &b_h, &b_o);}//测试模型double input = 5;double output = test(&input, w_ih, w_ho, b_h, b_o);printf("Input: %.2f, Output: %.2f\n", input, output);return 0;```这个代码实现了一个包含一个输入层、一个隐藏层、一个输出层的BP神经网络,使用了sigmoid激活函数和均方差误差函数。
一种改进BP 人工神经网络收敛性的算法赵刚引言BP (Back Propagation 即误差反向传输)人工神经网络[1],因其结构简洁,能够以任意精度逼近任意函数[2],是目前应用最广泛的一种网络,应用于信号处理,模式识别,结果预测,自适应控制等领域。
但BP 算法的核心是最速梯度下降法,主要优点是计算量小,主要缺点是收敛速度慢[3]。
加快BP 网络的收敛速度一直是热门的研究课题,Rumelhart 提出在权值调整中加入动量项,即将上次的权值调整量ΔW (n -1)乘以动量系数α加上本次计算得到的权值调整量ΔW 乘以学习率η作为本次的权值调整量,即αη⋅-∆+⋅∆=∆)1()(n W W n W (1)该方法能够少量加快BP 网络的收敛速度,但参数η和α的选取比较困难,很容易引起网络振荡。
Harry A.C.Eaton 和Tracy.L.Olivier 提出了学习率的经验公式:22221.../5.1n N N N +++=η (2)他们把训练样本分成n 个模式,每个模式分别是N 1,N 2,…,N n 个样本。
但试验结果一般。
Darken Chrisitian 和Moody John [3]提出动态学习率法,并给出学习率的计算公式:)/1/()0(r n +=ηη (3)式中η(0)是初始学习率,n 为学习次数,r 是一个大于1的常数,用于调节学习率改变速度,该方法的缺点在于用另外一个不确定的常数r 代替了η,实际使用中r 不易找到合适值。
还有另外的很多学者提出了各种改进算法,如Cater (1987),Chan and Fallside (1987),Jacobs (1988),Silva and Almeida (1990)[4] 但这些算法都以改变学习率和动量项为基础,改进效果均不太明显。
本文提出的改进算法和参考文献中的算法有较大差异,体现在以下方面:(1)本文的算法不使用标准BP 算法中的学习率参数。
BP神经网络算法及其改进的几个方法1 概述人工神经网络(Artificial Neural Networks,ANN),是基于人类大脑的生物活动所提出的,是一个模型。
它由众多节点通过一定的方式互联组成,是一个规模巨大、自适应的系统。
其中有一种学习算法是误差传递学习算法即BP 算法。
BP算法是人工智能最常用到的学习方法,从一定意义上来讲,BP算法的提出,终结了多层网络在学习训练算法上的空白史,是在实际应用中最有效的网络训练方法,对ANN的应用和发展起到了决定性的作用。
BP算法是使用从输出层得到的误差来估算前一层的误差,再利用该误差估算更前一层的误差。
依次进行,就会获得其他所有各层的估算误差。
这样就实现了将从输出层的得到误差沿着与输入信号传送相反的方向逐级向网络的输入端传递的过程[1]。
但是,BP算法也存在着不可忽视的缺陷。
基于此,该文总结介绍了BP的改进方法。
2 BP算法的基本思想2.1 BP算法的基本原理BP算法是有监督指导的算法,它的学习训练过程一般分为两步:首先是输入样本的正向传递;第二步误差的反向传递;其中信号正向传递,基本思想是样本值从输入层输入,经输入层传入隐藏层,最后通过输出层输出,中间层对样本数据进行处理操作,利用各层的权值和激活函数对数据进行操作然后在输出层获得输出[2];接下来就是反向传递,算法得到的实际输出值与期望目标输出之间必然会有误差,根据误差的大小来决定下一步的工作。
如果误差值较小满足训练的精度要求,则认为在输出层得到的值满足要求,停止训练;反之,则将该误差传递给隐藏层进行训练,按照梯度下降的方式,对权值和阈值进行调整,接着进行循环,直到误差值满足精度要求停止训练[3]。
3 BP算法的缺陷尽管BP算法有着显著的优点,但是在实际应用过程中,BP算法会出现很多问题。
尤其是下面的问题,对BP神经网络更好的发展有很大影响。
有的甚至会导致算法崩溃。
3.1 收敛速度的问题BP算法在进行训练学习时,收敛速度慢,特别是在网络训练达到一定的精度时,BP算法就会出现一个长时间的误差“平原”,算法的收敛速度会下降到极慢[4]。
一种用于预测的BP 算法的改进旷昀[摘 要] 数据挖掘技术能从海量数据中找出有价值的信息,神经网络中的BP 算法虽然有较广泛的应用,但存在容易陷入局部极小点及网络的瘫痪等问题。
而Cauchy 训练的最大长处是,它有可能使网络逃离局部极小点。
用通过结合Cauchy 训练来改进BP 算法,在收敛速度,局部极小点、网络瘫痪等问题上有所改善。
[关 键 词] 数据挖掘;BP 算法;Cauchy 训练[作者简介] 旷昀,女,柳州运输职业技术学院信息工程系讲师。
广西柳州,545007一、数据挖掘数据挖掘是从大型数据库或数据仓库中发现并提取隐藏在其中的信息的一种新技术,目的是帮助决策者寻找数据间潜在的关联,发现被忽略的要素[1]。
数据挖掘技术涉及数据库、人工智能、机器学习和统计分析等多种技术。
数据挖掘技术能从大型数据库或数据仓库中自动分析数据,进行归纳性推理,从中发掘出潜在的模式;或者产生联想,建立新的业务模型,帮助决策者调整策略,做出正确的决策。
数据挖掘技术中的常用算法有: 人工神经网络、 遗传算法、决策树、公式发现、统计分析方法等。
这些方法各有千秋,总的来说,应该根据不同的问题环境和应用层面来选择合适的方法,并且灵活应用来解决数据挖掘中遇到的难题,BP 算法是一种适用于预测的神经网络算法。
二、BP 算法BP 算法是一种数据挖掘的方法。
BP 网络的神经元同一般的人工神经网络一样,但BP 算法要求使用的激活函数必须是处处可导的。
一般多数设计者都使用S 形函数。
实际上,也可以用其他函数作为BP 神经网络的激活函数,只要该函数是处处可导的。
BP 网络是非循环多级网络,但是实验表明,增加隐藏层的层数和隐藏层的神经元的个数不一定能够提高网络的精度和表达能力,在大多数情况下,BP 网络一般都选用二级网络[2]。
(一)BP 算法的训练过程人工神经网络的训练过程是根据样本集对神经元之间的联接权进行调整的过BP 网络也不例外,而且BP 网络执行的是有导师训练。
BP算法的改进
附加动量法
附加动量法使网络在修正其权值时,不仅考虑误差在梯度上的作用,而且考虑在误差曲面
上变化趋势的影响。
在没有附加动量的作用下,网络可能陷入浅的局部极小值,利用附加
动量的作用有可能滑过这些极小值。
该方法是在反向传播法的基础上在每一个权值(或阈值)的变化上加上一项正比于前次权
值(或阈值)变化量的值,并根据反向传播法来产生新的权值(或阈值)变化。
带有附加动量因子的权值和阈值调节公式为:
其中k为训练次数,mc为动量因子,一般取0.95左右。
附加动量法的实质是将最后一次权值(或阈值)变化的影响,通过一个动量因子来传递。
当动量因子取值为零时,权值(或阈值)的变化仅是根据梯度下降法产生;当动量因子取
值为1时,新的权值(或阈值)变化则是设置为最后一次权值(或阈值)的变化,而依梯
度法产生的变化部分则被忽略掉了。
以此方式,当增加了动量项后,促使权值的调节向着
误差曲面底部的平均方向变化,当网络权值进入误差曲面底部的平坦区时, i将变得很小,于是,从而防止了的出现,有助于使网络从误差曲面的局部极小值中跳出。
根据附加动量法的设计原则,当修正的权值在误差中导致太大的增长结果时,新的权值应
被取消而不被采用,并使动量作用停止下来,以使网络不进入较大误差曲面;当新的误差
变化率对其旧值超过一个事先设定的最大误差变化率时,也得取消所计算的权值变化。
其
最大误差变化率可以是任何大于或等于1的值。
典型的取值取1.04。
所以,在进行附加动
量法的训练程序设计时,必须加进条件判断以正确使用其权值修正公式。
训练程序设计中采用动量法的判断条件为:
E(k)为第k步误差平方和。
V = net.iw{1,1}%输入层到中间层权值
theta1 = net.b{1}%中间层各神经元阈值
W = net.lw{2,1}%中间层到输出层权值
theta2 = net.b{2}%输出层各神经元阈值。