BP神经网络是一种广泛应用于数值预测、模式识别、曲线拟合、数据压缩等问题的仿生模型,它属于一种前馈神经网络,它通过BP(误差后向传播)算法来计算梯度、再通过梯度下降等算法来进行训练。本文面向初学者展示一个BP神经网络的实现与应用。
本文主要来自《老饼讲解-BP神经网络》
一、BP神经网络-介绍
BP神经网络是一种前馈神经网络,它通过BP(误差后向传播)算法来计算梯度、再通过梯度下降等算法来进行训练。BP神经网络的模型结构如下:

一个训练完成的BP神经网络理论上可以用于拟合任意的x、y关系。常用于解决数值预测、模式识别、曲线拟合、数据压缩(特征提取)等等问题:

二、如何训练一个BP神经网络
在matlab中可以比较快速的训练一个BP神经网络,下面我们以matlab自带的acetylene化学反应数据为例,来展示如何训练一个BP神经网络用于预测。
2.1.例子数据
acetylene化学反应数据如下:

如表格所示,acetylene数据共16条数据,包含三个变量x1,x2,x3和一个y,现在要用x1,x2,x3来预测y就好了。
2.2. 代码实现
使用matlab来构建一个BP神经网络,并进行训练,代码如下:
matlab
% 本代码来自《老饼讲解-BP神经网络》www.bbblearn.com
load acetylene.mat % 加载acetylene数据
setdemorandstream(88888); % 指定随机种子,这样每次训练出来的网络都一样
% 数据加载
X = [x1,x2,x3]'; % 将x1,x2,x3作为输入数据
Y = y'; % 将y作为输出数据
% 模型训练
net = newff(X,Y,4,{'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); % 调用matlab自带的train函数训练网络
% 模型预测
py = sim(net,X); % 调用matlab的sim函数得到网络的预测值
figure; % 新建画图窗口窗口
t = 1:length(py); % 数据的序号
plot(t,Y,'*',t,py,'o') % 画图,对比原来的y和网络预测的y
legend('真实值','预测值') % 展示图例
代码运行结果如下:

可以看到,我们的BP神经网络的预测值与样本数据的真实值基本是一致的,说明我们的模型训练成功了。
2.3. 关键代码解说
好了,接下来我们看看关键代码。
(1) 训练代码

第8行是初始化一个BP神经网络,newff函数就是matlab里构建BP神经网络的函数了,newff函数第1、2个参数,就是我们的训练数据的X和Y了。然后第3个参数4代表隐节点个数,第4个参数{'tansig','purelin'}则代表第一个隐层用tanh函数,第二个隐层(即输出层)用purelin(y=x)函数,最后呢,我们选择了用trainlm算法进行训练,它所使用的就是LM列文伯格-马跨特算法进行训练,如果不设训练算法,那么默认也是用trainlm算法。
(其实matlab已经有新函数构建BP了,但大部分资料仍用newff,用新函数不易找资料,所以继续用newff就好了。)
第9-11行是设置一些训练参数。goal=0.0001代表误差达到0.0001时就会停止训练,show=400代表每训练400步就会展示一次结果,而epochs=15000就是最多训练15000步。还有一些其它参数,我们以后再讲。
第12行就是正式训练模型了。好了,train函数共有三个关键入参,其中net就是我们上面初始化好的BP神经网络,而X,Y就是我们用来训练模型(也就是调整模型的参数)所使用的数据。然后经过train后,模型就开始训练了,训练完后就会返回net和tr这两个关键出参,其中net就是训练好的BP神经网络,tr是训练中的一些记录,就是train record的意思,tr具体的使用我们暂时先不管,以后用到再说。
整体来说,第8行newff是初始化模型,第9-11行是设置训练参数,第12行的train才真正用X、Y来训练模型。
(2) 模型预测-代码解说
上面我们已经训练好模型了,下面我们来看看如何用训练好的模型进行预测。

第15行是使用训练好的模型net来对X进行预测,其中sim函数就是simmulate(模拟)的意思,sim(net,X)就会返回net对X的预测结果,曾经有同学问我,这个X是什么,这个X就是你想预测的X,例如想知道x1=1000,x2=2,x3=5时y的预测结果,那么就需要传入X=1000,2,5'。这里我们传入了所有X样本,最终就会得到所有X的预测结果。
16-19行就是画图了,就是画出真实Y与预测Y的散点图,没什么好说的。
结束语
以上就是BP神经网络的简单使用了。更详细可以参考:
【1】BP神经网络-简单例子
【2】BP神经网络-模型结构
【3】BP神经网络-训练算法