BP神经网络:BP网络(Back Propagation)是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一,是1986年由Rumelhart和McCelland为首的科学家小组提出。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。
第1章 神经网络
1.1 生物神经网络的主要结构结构和类比
细胞体:神经元的主体;
树突:细胞体向外延伸的神经纤维,接受来自其他神经元的消息,相当于输入端;
轴突:细胞体向外延伸出的最长的一条神经纤维,相当于输出端;
突触:神经元通过轴突末梢和其它神经元进行信号连接,相当于输入和输出接口;
1.2 人工神经元模型
人工神经元模型(Artificial Neural Networks,ANNs),也叫做神经网络(NNs),是一种模拟生物神经网络进行信息处理的一种数学模型。人工神经元是其基本信息处理单元,类似于生物神经网络和生物神经元关系,简而言之神经网络就是一种仿生。
1.3 人工神经网络的分类
1.3.1 分层网络
一般有输入层、隐含层(中间层)和输出层,各层级顺次连接。
分层网络又分为3类:
(1)单纯的前向型网络:可以用有向无环结构表示,输入层经过中间层模式变换,由输出层输出一个输出模式,这样便完成了一次网络状态的更新,单纯的前向型网络结构见下图(图以三个输入和三个输出为例)。
(2)具有反馈的前向型网络:在单纯前向型网络的基础上,加上反馈机制,即有环结构,具有反馈的单元称为隐单元,反馈前向型网络结构见下图(图以三个输入和三个输出为例)。
(3)层内互联的前向型网络:在单纯前向型网络的基础上,同一层级内的单元相互连接,可以限制同级内的激活单元数目,层内互联的前向型网络见下图(图以三个输入和三个输出为例)。
1.3.2 相互连接型网络
互联网络分为两类:局部互联和全互联。局部互联就是网络中每个单元输出并没有全和其它神经元相连;全互联是每个单元的输出都和其它神经元相。对于一般简单的前向神经网络,给定输入,可以快速给出输出;而相互连接的神经网络对于给定的输入。全互联网络结构见下图(图以三个输入和三个输出为例)。
1.4 神经元的数学模型
神经元的数学模型表达式:
:输入或输出的延时;
:神经元j的阈值;
:神经元i到j的权值,与时间无关,具有非时变性,正负取值代表兴奋和抑制;
f() :神经元变换函数;
若上式中延时取单位延时,则可写为:
1.5 神经网络的学习方式
监督学习:事先给定标准样本,如反传网络、感知器等;
非监督学习:事先不给定标准样本,如Hebb学习规则等;
第2部分 BP神经网络
1 %% BP神经网络 2 3 %% 第1部分 BP提供了两个函数实现创建, 4 %% 1.1 newcf函数 调用格式: net = newcf(PR,[S1,S2...SN],{TF1,TF2...TFN},BTF,BLF,PF) 5 %% PR:每组输入(共有R组输入)元素的最大值和最小值组成的R*2维的矩阵; 6 %% Si:第i层的长度; 7 %% TFi:各层的传递函数; 8 %% BTF:BP网络的训练函数,默认值为"trainlm" 9 %% BLF:权值和阈值的学习算法,默认值"learngdm"; 10 %% PF:网络的性能函数,默认值"mse"; 11 %% 1.2 newff函数 调用格式: net = newff(PR,[S1,S2...SN],{TF1,TF2...TFN},BTF,BLF,PF) 12 %% 参数含义同newcf函数; 13 %% 案例:创建一个BP网络; 14 clear all; 15 X = [1 2; 2 3]; %输入训练集 16 T = [1 2;2 1]; %目标集 17 net = newff(X,T,5); %建立BP网络 18 net = train(net,X,T); %网络训练 19 X1 = X; 20 disp('输出网络仿真数据'); 21 y = sim(net,X1); 22 23 %% 第2部分 传递函数 24 %% 2.1 logsig函数:对数S型函数传递曲线, 调用格式: A = logsig(N,FP) 25 %% N:S*Q维的网络输入向量矩阵; 26 %% FP:性能参数,可忽略; 27 %% dA_dN = logsig('dn',N,A,FP); 28 %% 返回A关于N的导数dA_dN,如果A或FP没有给出或空矩阵,则FP返回默认参数; 29 %% info = logsig('code'); 30 %% 若 code = name,返回传递函数的全称; 31 %% code=output,返回输出值域; 32 %% code=active,返回有效的输入区间; 33 %% code=fullderiv,返回导数的次数; 34 %% code=fpnames,返回函数参数的名称; 35 %% code=fpdefaults,返回默认的函数参数; 36 %% 案例:绘制一个对数S型函数传递曲线; 37 clear all; 38 n = -5:0.1:5; 39 a = logsig(n); 40 plot(n,a); 41 grid on; 42 xlabel('输入数据'); 43 ylabel('对数S型传递曲线'); 44 45 46 %% 2.2 tansig函数:双曲正切S型传递函数, 调用格式: A = tansig(N,PF) 47 %% N:S*Q维的网络输入向量矩阵; 48 %% PF:性能参数,可忽略; 49 %% 案例: 绘制一个双曲正切S型传递函数 50 clear all; 51 n =-5:0.1:5; 52 a =tansig(n); 53 plot(n,a); 54 grid on ; %画网格 55 xlabel('输入数据'); 56 ylabel('双曲正切S型传递函数'); 57 58 59 %% 第3部分 BP学习函数 60 %% 3.1 learngd函数:梯度下降权值/阈值学习函数,它通过神经网络的输入和误差,以及权值和阈值的学习速率来计算权值或阈值的变化率; 61 %% 调用格式:[dW,LS] = learngd(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) 62 %% info = learngd('code') 63 %% 若 code=pnames,返回设置的学习参数; 64 %% code=pdefaults,返回默认的学习参数; 65 %% code=needg,如果函数使用了解gW或gA,则返回1; 66 %% W;S*R维的权值矩阵; 67 %% P:Q组R维的输入向量; 68 %% Z:Q组S维的加权输入向量; 69 %% N:Q组S维的输入向量; 70 %% A:Q组S维的输出向量; 71 %% T:Q组S维的层目标向量; 72 %% E:Q组S维的层误差向量; 73 %% gW;与性能相关的S*R维梯度; 74 %% gA:与性能相关的S*R维输出梯度; 75 %% D:S*S维的神经元距离矩阵; 76 %% LP:学习状态,初始状态下为空; 77 %% 输出参数LS:新的学习速率; 78 %% 输出参数dW:S*R维的权值或阈值变化率矩阵; 79 %% 案例:根据给出的随机梯度及速率计算权值与阈值的变化率 80 clear all; 81 gW = rand(3,2); 82 lp.lr = 0.5; 83 dW = learngd([],[],[],[],[],[],[],gW,[],[],lp,[]); 84 85 %% 3.2 learngdm函数:梯度下降动量学习函数,它通过神经网络的输入和误差、权值和阈值的学习速率和动量常数来计算权值或阈值的变化率; 86 %% 调用格式:[dW,LS] = learngdm(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) 87 %% info = learngdm('code') 88 %% 参数同learngd函数 89 %% 案例:根据给定的梯度、学习速率以及动量计算其权值及阈值变化率 90 clear all; 91 gW = rand(3,2); 92 lp.lr = 0.5; 93 lp.mc = 0.8; 94 ls = []; 95 [dW,ls] = learngdm([],[],[],[],[],[],[],gW,[],[],lp,ls); 96 97 %% 第4部分 性能函数 98 %% 4.1 mse函数:用于计算BP神经网络的均方误差; 99 %% 调用格式: perf = mse(E,Y,X,FP); 100 %% dPerf_dy = mse('dy',E,Y,X,perf,FP); 101 %% dPerf_dx = mse('dx',E,Y,X,perf,FP); 102 %% info = mse('code'); 103 %% 当 code=pnames,返回设置的学习参数; 104 %% code=pdefaults,返回默认的学习参数; 105 %% code=pdefaults,返回默认的训练参数; 106 %% E:误差矩阵或向量(E = T-Y,T表示网络的目标向量) 107 %% Y:网络的输出向量(可忽略); 108 %% X:所有权值和阈值向量(可忽略); 109 %% FP:性能参数(可忽略); 110 %% perf:平均绝对误差; 111 %% dPerf_dy:perf对Y的导数; 112 %% dPerf_dx:perf对X的导数; 113 %% 案例:创建一个BP网络,并计算其均方误差性能 114 clear all; 115 net = newff([-10 10],[4,1],{'tansig','purelin'}); %创建一个BP网络 116 p = [-10 -5 0 5 10]; 117 t = [0 0 1 1 1]; 118 disp('网络仿真值'); 119 y = sim(net,p); 120 disp('绝对误差值'); 121 e = t-y; 122 disp('均方误差性能'); 123 perf = mse(e); 124 125 %% 4.2 msereg函数:用于通过两个因子的加权和来评估网络性能,这两个因子分别为均方误差、均方权值和阈值。 126 %% 调用格式: perf = msereg(E,Y,X,FP); 127 %% dPerf_dy = msereg('dy',E,Y,X,perf,FP); 128 %% dPerf_dx = msereg('dx',E,Y,X,perf,FP); 129 %% 参数与mse同 130 %% 案例: 创建一个BP网络并评估其性能 131 clear all; 132 net = newff([-10 10],[4,1],{'tansig','purelin'}); %创建一个BP网络 133 p = [-10 -5 0 5 10]; 134 t = [0 0 1 1 1]; 135 y = sim(net,p); 136 e = t-y; 137 net.performParam.ratio = 20/(20+1); 138 perf = msereg(e,net); 139 140 141 %% 第5部分 训练函数 142 %% 5.1 trainbfg函数:该函数是BFGS准牛顿BP算法函数。除了BP网络外,还可以训练任意形式的神经网络,只要它的传递函数对于权值和输入存在导数 143 %% 即可; 144 %% 调用格式:[net,TR] = trainbfg(net,TR,trainV,valV,testV); 145 %% net:神经网络对象; 146 %% TR:初始化的训练记录; 147 %% trainV:训练向量; 148 %% valV:验证向量; 149 %% testV:测试向量; 150 %% 输出参数net:训练网格; 151 %% 输出参数TR:训练记录; 152 %% info = trainbfg('code'); 返回有关函数的有用信息; 153 %% 154 %% BP网格训练参数(MATLAB R2011a默认值) 155 %% 参数名称 默认值 属性 156 %% net.trainParam.epochs 100 训练次数,100为人工设定训练次数最大值 157 %% net.trainParam.showWindow 25 两次显示之间的训练步数(无显示时设为NaNa) 158 %% net.trainParam.showCommandLine 0 生成命令行输出 159 %% net.trainParam.showGUI 1 显示GUI训练 160 %% net.trainParam.goal 0 训练目标 161 %% net.trainParam.time inf 训练时间,inf表示训练时间不限 162 %% net.trainParam.min_grad le-6 最小性能梯度 163 %% net.trainParam.min_fail 5 最大确认失败次数 164 %% net.trainParam.searchFcn 'srchcha' 所用的线性搜索路径 165 %% 166 %% 167 %% 案例:对创建的BP网络进行BFGS准牛顿学习 168 clear all; 169 P = [0 1 2 3 4 5]; 170 T = [0 0 0 1 1 1]; 171 net = newff(P,T,2,{},'trainbfg'); 172 a1 = sim(net,P); 173 net = train(net,P,T); 174 a2 = sim(net,P); 175 176 %% 5.2 traingd函数 177 %% 案例:对创建的BP网络进行梯度下降学习; 178 clear all; 179 p = [-1 -1 2 2 ;0 5 0 5]; 180 t = [-1 -1 1 1]; 181 net = newff(p,t,3,{},'traingd'); 182 % 对BP网络训练参数进行设置 183 net.divideFcn = ''; 184 net.trainParam.show = 50; 185 net.trainParam.lr = 0.05; 186 net.trainParam.epochs = 300; 187 met.trainParam.goal = 1e-5; 188 a = sim(net,p); 189 190 %% 5.3 traingdm函数:梯度下降动量BP算法函数; 191 %% 案例:对创建的BP网络进行动量梯度下降学习; 192 clear all; 193 p = [-1 -1 2 2;0 5 0 5]; 194 t = [-1 -1 1 1]; 195 net = newff(p,t,3,{},'traingdm'); %创建BP网络; 196 % 对BP网络训练参数进行设置; 197 net.trainParam.lr = 0.05; 198 net.trainParam.mc = 0.9; 199 y = sim(net,p); %对网络进行仿真; 200 201 %% 第6部分 显示函数(MATLAB神经网络工具箱提供了三个函数) 202 %% 6.1 errsurf函数:用于计算单个神经网络的误差曲面; 203 %% 调用格式:errsurf(P,T,WV,BV,F) 204 %% P:输入行向量; 205 %% T:目标行向量; 206 %% WV:权值列向量; 207 %% BV:阈值向量; 208 %% F:函数名称; 209 210 %% 6.2 plotes函数:用于绘制误差曲面图;由权值和阈值确定的、由函数errsurf计算得出的; 211 %% plotes(WV,BV,ES,V); 212 %% WV:权值的N维行向量; 213 %% BV:M维的阈值行向量; 214 %% ES:误差向量组成的额M*N维矩阵; 215 %% V:视角,默认[-37.5,30]; 216 %% 案例:根据样本和木笔噢数据,绘制误差曲面图; 217 clear all; 218 p = [-6.0 -6.1 -4.1 -4.0 +4.0 +4.1 +6.0 +6.1]; 219 t = [+0.0 +0.0 +.97 +.99 +.01 +.03 +1.0 +1.0]; 220 wv = -1:0.1:1; 221 bv = -2.5:0.25:2.5; 222 es = errsurf(p,t,wv,bv,'logsig'); 223 plotes(wv,bv,es,[60 30]); 224 set(gcf,'color','w'); 225 226 227 %% 6.3 plotep函数 228 %% 调用格式:F = plotep(W,B,E); 229 %% F = plotep(W,B,E,H); 230 %% W:当前权值矩阵; 231 %% B:当前阈值向量; 232 %% E:当前神经元误差; 233 %% H:权值和阈值在上一时刻的位置向量 234 %% F:当前的权值和阈值位置信息向量; 235 %% 案例:根据输入样本和目标数据,计算权值和阈值在误差曲面上的位置; 236 clear all; 237 X =[2.0 2.0]; 238 T = [0.5 0.52]; 239 W = -4:0.4:4; 240 b = W; 241 ES = errsurf(X,T,W,b,'logsig'); 242 plotes(W,b,ES,[60 60]); 243 W = -2; 244 b = 0; 245 net = newlind(X,T); 246 a = sim(net,X); 247 E = T-a; 248 e = sumsqr(E); 249 plotep(W,b,e);