神经网络

【模型】一篇入门之-BP神经网络

作者 : 老饼 发表日期 : 2023-03-25 00:20:29 更新日期 : 2024-10-20 10:00:04
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



BP(back propagation)神经网络是一种基于大脑神经原理的仿生模型,它可以拟合任意曲线

本文讲解BP神经网络的模型结构、误差函数,以及训练方法,并展示一个BP神经网络的实现例子

通过本文可以快速了解BP神经网络是什么,如何利用matlab训练一个BP神经网络来拟合X与y的关系




    01. 什么是BP神经网络     




本节讲解BP神经网络的结构与计算方法,以及三层BP神经网络




     BP神经网络是什么     


BP神经网络也称为MLP(Multilayer Perceptron)多层感知机,是一种基于大脑神经原理的仿生模型
由于BP神经网络可以用来拟合任意形态的曲线,因此它广泛应用于回归问题,即数值预测
 此外,在数值预测的基础上,BP还可以延伸性解决其它问题,例如类别预测、数据压缩等等
BP神经网络的结构
 BP神经网络是前馈型神经网络,它由多层组成,层与层前后连接、逐层向前传递
 BP神经网络的模型结构如下:
 BP神经网络的拓扑结构
 
如图所示,BP神经网络包含了输入层、隐层和输出层,其中隐层可以是多个隐层
每个隐层和输出层的神经元都有自己的阈值b和激活函数T,每层与前层用权重W连接
BP神经网络的计算
 BP神经网络以逐层前馈的方式来计算模型的输出,如下:
 即从第1个隐层开始,以输入层作为它的输入,算出第1个隐层的输出
再将第1个隐层的输出作为第2个隐层的输入 ,算出第2个隐层的输出
如此类推,逐层计算,直到最后的输出层,就得到模型最终的输出值

 对于第i层,它的输出如下计算:
 
 其中,
 
     :第i层的输入           
 
 :第i层与前层的连接权重 
 
      :第i层的阈值           
 
     :第i层的激活函数       
可以看到,BP神经网络就是一种套娃结构,一层一层不断套娃,直到最后一层






     三层BP神经网络     


    在日常应用中,一般只使用三层BP神经网络,因为三层BP已经足以拟合任意形态的曲线
 三层BP神经网络的结构 
 三层BP神经网络是指只有一个隐层的BP神经网络,它的结构如下:
 三层BP神经网络的拓扑结构 
其中,隐层的激活函数一般为tansig,输出层激活函数一般为purelin
 三层BP的隐节点个数根据具体问题具体设定,是一个灵活设置的参数
 三层BP神经网络的模型表达式
由于三层BP神经网络较为简单,因此,它的模型表达式可以直接表出
 三层BP神经网络的数学表达式如下:
  三层BP神经网络的数学表达式   
其中,tansig函数是一个S型函数,如下:  
 
     
purelin函数则是线性恒等函数,如下:
 
                   
     三层BP神经网络的意义     
 从三层BP的数学表达式可以看到,y其实就是多个S型函数tansig之和
因此,三层BP神经网络可以简单地理解为,使用多个S型曲线来凑合出目标曲线
 由于tansig具有局部非线性的特点,即每个tansig只会比较显著地影响某个局部
则对任意形态的目标曲线,只要用一个tansig进行逐段拟合,必能将其拟合得不相上下

由于三层BP已有充足的拟合能力,所以一般被当作一个“可拟合任意形态”的黑箱模型而被广泛使用







   02. BP神经网络的训练   




本节讲解什么是BP神经网络的训练及训练算法




   BP神经网络模型的误差函数   


在BP神经网络中,采用均方误差作为模型的误差函数
 BP神经网络的误差函数如下: 
 
 其中,:为训练样本个数               
 :为输出个数          
              :第i个样本第j个输出的预测值
               :第i个样本第j个输出的真实值 
直观来说,E就是所有样本、所有输出的平方误差的平均值






       BP神经网络的训练     


BP神经网络一般先初始一组W,B,然后使用梯度下降法、或者lm算法进行训练
  以梯度下降法为例,BP神经网络的训练流程如下:
 
梯度下降法训练BP神经网络-算法流程图 
一、初始化W、B                                                                 
二、逐步让W、B按的负梯度方法调整                                   
1. 计算W、B在误差函数E的梯度gW,gB                    
2. 将W与B按负梯度方向调整                                       
                        
                         
 其中,lr是预设的学习率                       
3. 检查是否满足终止条件                                            
 满足终止条件,则退出训练                                  
终止条件以下:                         
(1) 梯度是否过小                        
(2) 是否达到最大迭代次数                

三、输出训练好的W、B                                                       
✍️BP的梯度计算
  对于三层BP神经网络,误差函数E对W、b的梯度,可以直接计算偏导数就可以得到
而对于多层BP神经网络,直接计算梯度会略为复杂,因此一般用BP算法来计算梯度
注意,BP(back propagation)后馈传播算法并不是一种训练算法,而是一种梯度计算方法
BP神经网络之所以叫BP,就是因为它计算梯度时使用的是BP算法,使得它训练时能轻松计算梯度







  03. BP神经网络代码实现例子  




本节讲解如何实现一个BP神经网络




       BP神经网络-代码实现       


 在matlab中,可以用newff函数来构建一个BP神经网络,然后train函数对网络进行训练
在训练完成之后,就可以用sim函数来对数据进行预测了
 现有数据如下:
 BP神经网络代码例子数据  
下面构建一个三层的BP神经网络,用于拟合  与 的关系 
  具体代码实现如下:
% ---------数据生成---------------
X = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8;
     -2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,-2.2204,0.2,0.4,0.6,0.8,1,1.2]; 
y  = [0.65,0.22,-0.16,-0.47,-0.68,-0.79,-0.80, -0.71,-0.53,-0.28 ,0,0.30,0.59,0.85,1.06,1.19,1.26];   
setdemorandstream(88888);                            % 指定随机种子,这样每次训练出来的网络都一样

%----------模型训练------------------
% 隐节点个数设为3.
% 其中隐层、输出层的传递函数分别为tansig和purelin
% 使用trainlm方法训练
net = newff(X,y,3,{'tansig','purelin'},'trainlm');   %初始化一个BP神经网络

% 设置一些常用参数,然后训练网络
net.trainparam.goal   = 0.0001;                      % 训练目标:均方误差低于0.0001
net.trainparam.show   = 400;                         % 每训练400次展示一次结果
net.trainparam.epochs = 15000;                       % 最大训练次数:15000.

% 模型训练与预测                                     
[net,tr] = train(net,X,y);                           % 训练网络
py = sim(net,X);                                     % 使用训练好的网络预测X
											         
%---------展示结果--------------------               
t  = 1:length(py);                                   % 生成序列  
plot(t,y,t,py,'r')                                   % 画图,对比原来的y和BP神经网络预测的y
legend('真实值','BP的预测值')                        % 图例
title('BP神经网络预测结果')                          % 标题
  代码运行结果如下:
 BP神经网络代码运行结果 
可以看到,对于训练数据,BP神经网络的预测结果与原始数据基本一致














 End 




联系老饼