1、基本原理
一种按照误差逆向传播算法训练的多层前馈神经网络。BP网络模型处理信息的基本原理是:输入信号 Xi X i 通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号 Yk Y k ,网络训练的每个样本包括输入向量 X X 和期望输出量,网络输出值 Y Y 与期望输出值之间的偏差,通过调整输入节点与隐层节点的联接强度取值 Wij W i j 和隐层节点与输出节点之间的联接强度 Tjk T j k 以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。
输入 X=[x0,x1,⋯,xn],x0=−1 X = [ x 0 , x 1 , ⋯ , x n ] , x 0 = − 1
权值 w=⎡⎣⎢⎢⎢⎢⎢⎢⎢wi0wi1wi2⋮win⎤⎦⎥⎥⎥⎥⎥⎥⎥ w = [ w i 0 w i 1 w i 2 ⋮ w i n ]
neti=∑j=1nwijxj−θ=XW n e t i = ∑ j = 1 n w i j x j − θ = X W
输出: yi=f(neti) y i = f ( n e t i )
阈值: θ θ
2、网络模型
BP神经网络包括输入层、隐含层和输出层。
2.1 激活函数模型
常用的激活函数
- 线性函数: f(x)=k∗x+c f ( x ) = k ∗ x + c
- 斜坡函数: f(x)=⎧⎩⎨Tk∗x−Tx>c|x|<cx<−c f ( x ) = { T x > c k ∗ x | x | < c − T x < − c
- 阈值函数: f(x)={10x≥cx<c f ( x ) = { 1 x ≥ c 0 x < c
S型函数(sigmoid): f(x)=11+e−αx(0<f(x)<1)f′(x)=αe−αx(1+e−αx)2=αf(x)[1−f(x)] f ( x ) = 1 1 + e − α x ( 0 < f ( x ) < 1 ) f ′ ( x ) = α e − α x ( 1 + e − α x ) 2 = α f ( x ) [ 1 − f ( x ) ]
双极S型函数: f(x)=21+e−αx−1f′(x)=2αe−αx(1+e−αx)2=α[1−f(x)2]2 f ( x ) = 2 1 + e − α x − 1 f ′ ( x ) = 2 α e − α x ( 1 + e − α x ) 2 = α [ 1 − f ( x ) 2 ] 2
通常用sigmoid函数作为激活函数
2.2 误差计算模型
误差计算模型反映了神经网络期望输出与计算输出之间误差的大小的函数
- Ykj Y j k :第i个节点的期望输出值
- ykj y j k :第i个节点计算输出值
2.3学习模型
神经网络的学习过程是连接下层节点和上层节点之间的权重的矩阵
Wij
W
i
j
的设定和修改的过程。
学习方式:
- 监督学习
- 无监督学习
BP神经网络的模型:
隐含层的第 h h 个神经元看,输入层总共有 个权重传递参数传给他,它又总共有 l l 个权重传递参数传给输出层, 自身还有 个阈值。所以在我们这个神经网络中,一个隐含层神经元有 (d+l+1) ( d + l + 1 ) 个参数待确定。输出层每个神经元还有一个阈值,所以总共有 l 个阈值。最后,总共有 个待定参数。
首先,随机给出这些待定的参数,后面通过BP算法的迭代,这些参数的值会逐渐收敛于合适的值,那时,神经网络也就训练完成了。
任意权重参数的更新公式为:
下面以隐含层到输出层的权重参数
whj
w
h
j
为例说明:
我们按照前面给出的公式求出均方差误差
Ek
E
k
,期望其为0,或者为最小值。而BP算法基于梯度下降法(gradient descent)来求解最优解,以目标的负梯度方向对参数进行调整,通过多次迭代,新的权重参数会逐渐趋近于最优解。对于误差
Ek
E
k
,给定学习率(learning rate)即步长
η
η
,则有:
再看一下参数的传递方向,首先
whj
w
h
j
影响到了输出层神经元的输入值 βj ,然后影响到输出值
Yjk
Y
j
k
,然后再影响到误差
Ek
E
k
,所以可以列出如下关系式:
根据输出层神经元的输入值
βj
β
j
的定义:
可以得到:
当激活函数为sigmoid函数时:
令: gj=−∂Ek∂Ykj∂Ykj∂Whj g j = − ∂ E k ∂ Y j k ∂ Y j k ∂ W h j
应为: Ek=12∑j=1I(Ykj−ykj)2 E k = 1 2 ∑ j = 1 I ( Y j k − y j k ) 2
则: gj=−∂Ek∂Ykj∂Ykj∂Whj=−(Ykj−ykj)f′(βj−θj)=(ykj−Ykj)f(βj−θj)[1−f(βj−θj)] g j = − ∂ E k ∂ Y j k ∂ Y j k ∂ W h j = − ( Y j k − y j k ) f ′ ( β j − θ j ) = ( y j k − Y j k ) f ( β j − θ j ) [ 1 − f ( β j − θ j ) ]
定义: Ykj=f(βj−θj) Y j k = f ( β j − θ j )
所以: gj=(ykj−Ykj)Ykj(1−Ykj) g j = ( y j k − Y j k ) Y j k ( 1 − Y j k )
结合得:
得到:
所以:
3. 缺点及优化
缺点:
- 学习速度慢,即使是一个简单的问题,一般也需要几百次甚至上千次的学习才能收敛。
- 容易陷入局部极小值。
- 网络层数、神经元个数的选择没有相应的理论指导。
- 网络推广能力有限。
优化
(1)学习因子h 的优化
采用变步长法根据输出误差大小自动调整学习因子,来减少迭代次数和加快收敛速度。
η=η+α×EK(n)−Ek(n−1)EK(n) η = η + α × E K ( n ) − E k ( n − 1 ) E K ( n ) α α 为调整步长,0~1之间取值
(2)隐层节点数的优化
隐节点数的多少对网络性能的影响较大,当隐节点数太多时,会导致网络学习时间过长,甚至不能收敛;而当隐节点数过小时,网络的容错能力差。利用逐步回归分析法并进行参数的显著性检验来动态删除一些线形相关的隐节点,节点删除标准:当由该节点出发指向下一层节点的所有权值和阈值均落于死区(通常取±0.1、±0.05等区间)之中,则该节点可删除。最佳隐节点数L可参考下面公式计算:
- m——输入节点数
- n——输出节点数
- c——介于1~10的常数
(3)输入和输出神经元的确定
利用多元回归分析法对神经网络的输入参数进行处理,删除相关性强的输入参数,来减少输入节点数。
(4)算法优化
由于BP算法采用的是剃度下降法,因而易陷于局部最小并且训练时间较长。用基于生物免疫机制地既能全局搜索又能避免未成熟收敛的免疫遗传算法IGA取代传统BP算法来克服此缺点。
应用(Matlab)辛烷值含量预测
%% 清空环境变量
clear all
clc
%% 训练集/测试集产生
% 1. 导入数据
load spectra_data.mat
%%
% 2. 随机产生训练集和测试集
temp = randperm(size(NIR,1));
% 训练集——50个样本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 测试集——10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
[t_train, ps_output] = mapminmax(T_train,0,1);
%% BP神经网络创建、训练及仿真测试
% 1. 创建网络
net = newff(p_train,t_train,9);
%%
% 2. 设置训练参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-5;
net.trainParam.lr = 1e-4;
% 3. 训练网络
net = train(net,p_train,t_train);
% 4. 仿真测试
t_sim = sim(net,p_test);
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);
%% 性能评价
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;
%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));
%%
% 3. 结果对比
result = [T_test' T_sim' error']
%% VI. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]};
title(string)
训练数据
4.相关介绍
数据归一化:
1. 输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。
2. 数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。
3. 由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。
4. S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X)在参数a=1时,f(100)与f(5)只相差0.0067。
函数:[Y, PS] = mapminmax(X,YMIN,YMAX)
- X:N-by-Q matrix or a 1-by-TS row cell array of N-by-Q matrices
- YMIN:Minimum value for each row of Y(default is -1)
- YMAX:Maximum value for each row of Y(default is +1)
- Y:Each M-by-Q matrix (where M==N) (optional)
- PS:Process setting that allow consistent processing of values
newff()
newff Create a feed-forward backpropagation network.
Syntax
net = newff(P,T,S)
net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)
Description
newff(P,T,S) takes,
P - RxQ1 matrix of Q1 representative R-element input vectors.
T - SNxQ2 matrix of Q2 representative SN-element target vectors.
Si - Sizes of N-1 hidden layers, S1 to S(N-1), default = [].
(Output layer size SN is determined from T.)
and returns an N layer feed-forward backprop network
net.trainparam.goal :神经网络训练的目标误差
net.trainparam.show : 显示中间结果的周期
net.trainparam.epochs :最大迭代次数
net.trainParam.lr : 学习率
决定系数
y^i y ^ i 为第 i i 个样本的预测值,为第i个样本的真实值。n为样本的数量
说明
- 相对误差系数越小,表明模型的性能越好
- 决定系数范围在[0,1]内,愈接近1,模型的行性能越好,接近0,模型的性能越差。