BP神经网络全称为Back Propagation Neural Network,也就是后馈传播神经网络,由Rumelhart和McClelland于1986年正式提出,它属于一种多层前馈模型,在理论上,三层BP神经网络可以任意精度逼近任意非线性函数(万能近似定理),因此被广泛应用于各类人工智能任务。而它的核心是使用误差反向传播算法(BP算法),基于梯度下降法优化网络参数,让网络输出不断逼近期望结果。
下面我们就一步一步来理解BP神经网络究竟是什么,以及如何使用。
一、BP神经网络模型与结构
1.1. BP神经网络-背景介绍
BP神经网络是一种智能仿生模型,我们都知道,生物神经网络由大量生物神经元通过突触连接而成,如下:

大脑能够接收、处理和传递外界信息,帮助生物完成感知判断、思考决策等行为。而BP神经网络正是以此为基础而构建出来的数学模型。
1.2. BP神经网络-模型结构
上面说了大脑的神经元机制了,下来再来看看BP神经网络的结构。

如图所示,BP神经网络是一种多层前馈的模型。它每一层接收前层所有神经元的值,经过w加权后、再加上神经元自身的阈值b,就是神经元的值了,最后再经过激活函数进行激活,就是它传递给下一层神经元的值了。用数学来表述就是:

激活函数一般使用tanh或者sigmoid函数,以前一般都是sigmoid,但后来基本都只用tanh了。
tanh函数的数学表达式如下:

它是一种对称S型函数:

好了,每一层就是如上的运算,经过层层传导后,就是模型最终的输出了。
详细计算例子可以参考《BP神经网络-三层结构与计算例子》
二、BP神经网络-应用例子
上面我们已经大概的了解BP神经网络的结构了,那它到底有什么用呢,它最本质的作用就是可以用来拟合任意的输入输出关系。下面我们直接用一个例子来说明。
2.1. BP神经网络-例子
假设,我们的输入输出是sin函数的关系,如下:

上面已经有10个样本点了,当然,我们事实上并不知道它们是sin函数的关系,下面我们就用BP神经网络通过数据来学习x与y的关系。
具体代码如下:
% 本代码用于展示BP神经网络如何拟合sin曲线
% 本代码来自《老饼讲解BP神经网络》www.bbblearn.com
% -------------生成数据----------------
setdemorandstream(88); % 固定随机种子
X = linspace(-pi,pi,15); % 自变量x采样
y = sin(X); % 函数值y
% ----------训练BP神经网络-------------
net= newff(X,y,3,{'tansig','purelin'},'trainlm'); % 初始化BP神经网络
net.divideParam.trainRatio = 1; % 把数据全用于训练,效果另外测试
net.divideParam.valRatio = 0; % 验证占比为0
net.divideParam.testRatio = 0; % 测试占比为0
[net,tr]= train(net,X,y); % 训练模型
% ----------画出拟合曲线---------------
t = -pi:0.1:pi; % x坐标轴
siny = sin(t); % 真实曲线值
simy = sim(net,t); % 拟合曲线值
plot(t,siny,'b*',t,simy,'r') % 画出曲线图
legend('真实sin曲线','拟合sin曲线') % 显示图例
上面的代码是很简单的,就是构建一个BP神经网络,然后用数据来训练它,最后再打印出BP神经网络对于各个输入的预测值。
代码运行结果如下:

可以看到,BP神经网络的拟合曲线已经与真实的sin曲线基本完全一致了。
结束语
当然,这里我们只是一个简单的例子,事实上我们可以用它来拟合任意的输入输出关系,只需要将样本数据采集回来,再把数据扔给BP神经网络进行学习就可以了。

5万+

被折叠的 条评论
为什么被折叠?



