上次讨论了基于Hopfield神经网络的数字识别,BP(Back Propagation)神经网络也可以进行相关的数字识别如手写数字识别等,由于BP神经网络的特性,该网络需要一定的样本进行对网络进行训练、测试以及校验。本次不再赘述数字识别,而是将目光集中于基于BP神经网络的数据拟合。
本次所采用的神经网络为BP神经网络,是一个误差反向传播训练(Error Back Propagation Training)的多层前馈网络,主要包含输入层、隐含层和输出层。数据由输入层输入,经过标准化处理后,传到第二层即隐含层,隐含层进行输入数据的权值计算、转换,然后传输到输出层,输出层将给出神经网络的预测值。 由于人工神经网络不需要事先给定输入量与输出量之间的映射关系,BP网络需要通过范例进行学习。因此,给定一个包含了输入量样本以及已知的正确输出量样本是必须的。利用给定的示例,BP神经网络可以得知什么是所期望达到的行为并且BP算法也能支持网络进行调整来达到预期。
BP网络包含正向计算和反向计算两个过程,其学习过程是通过循环步骤来实现的。当接收到范例时,该网络会先进行正向计算过程,随机输出一些数据。这个输出的结果将会与已知的正确样本进行比较,然后一个含有其均方误差的信号将会通过建立的神经网络进行反向传递。隐含层接收到信号后,会“分摊”给各个神经单元,每个单元的权值因此将根据接收到的误差进行相应的调整。这个过程将会不断循环,直到误差达到规定的阈值或完成了规定的学习次数而停止。此时该神经网络被认为已经学习成功,完成了训练过程。BP神经网络仿真虽然无法达到最理想的功能,但是其结果已经接近了完美。
在BP算法中采用的激活函数是S型(Sigmoid)函数,该函数应用于隐含层的输出中。S函数有效地将非线性变化引入到了神经网络中,使得每一层权值得变化呈现非线性趋势而不是直接承接上一层的线性变化输出结果。此外,S型函数具有将小信号放大、大信号缩小的特征,可以保证输出结果在(0,1)之间,如下图所示。然而在输出层中,需要直接保障输出端能接收到输出层输出的任何值,故采用线性函数。该特征也将在MATLAB生成网络结构视图中体现。
图1. Sigmoid函数曲线示意图
现在开始使用MATLAB中的函数feedforwardnet创建BP神经网络结构。如图2所示,绿色图标代表的输入端(Input)和输出端(Output)各为1个,蓝色图标代表着隐含层和输出层。其中20代表着隐含层神经元数为20,1指代输出层只有一个神经元。代表隐含层的方框中其中一个含有S曲线的图标指激活函数为S函数,输出层中的直线代表着输出层使用的线性函数。此外,w指权值(weight,b为偏置(bias)。
图2. 创建BP网络视图
本次神经网络的训练方法采用默认的Levenberg-Marquardt方法,误差指标为均方差(MSE),设置的训练次数为1000次,期望达到的误差目标为10-10。训练结果完成的示意图如图3所示。在进展(Progress)项中,Epoch为训练次数,绿色指标显示1000 iterations意为已经完成了设置的1000次循环。性能指(Performance)为均方差中的最大值,蓝色精度条显示地为当前均方差,当该值小于设定的指标时,则停止训练。和性能指一样,当梯度值(Gradient)小于目标值时,也会停止训练。泛化能力检查(Validation Checks)在训练中始终为0,这个是指在训练过程中没有出现过误差不降反升的情况,如果超过6次误差不降反升,为防止出现过度拟合的情况,训练将会强行停止。
训练过程中生成的训练结果可以绘出如回归线图、性能指图等来体现该次训练的特征,以及为输出的拟合结果提供判断可靠性的有力佐证。当回归率R越接近于1时,则证明数据拟合效果越好。
图3. 训练结果信息图
本次数据拟合的结果如图4所示,采用的样本数据为MATLAB自带的数据库(simplefit_dataset),可以看出拟合曲线与样本值的趋势完美重合。不同于Hopfield神经网络输出结果的不稳定性,BP神经网络每次训练的迭代过程中产生的误差以及权值等会变化但是输出结果总是可靠的。除了使用MATLAB自带的数据库进行数据拟合测试外,也可以自己创建样本矢量,进行对多项式、正余弦函数以及其他函数映射等的数据拟合分析。
图4. 数据拟合结果
最后,有机器学习相关需求,欢迎通过微信公众号联系我们。