首先声明,这篇文章不是神经网络的扫盲文,如果只想知道神经网络的概念那笔者还是推荐找一些深入浅出的文章来看。但是如果需要自己实际搭建和使用一个神经网络,同时具备一定的数学功底的话,那这篇文章就是为了深入的剖析神经网络算法的工作过程和模型而写的。这里笔者把整个神经网络的工作过程由特殊情况推广到一般情况,让读者了解整个神经网络的工作过程,并且给出实际搭建一个神经网络的方法。希望有意愿了解的读者能够拿起笔跟着文章一起把公式写一遍。作者也是边推导公式边整理思路,最后从只有概念性的认识到能够自己搭建一个Matlab的神经网络架构。

神经网络必备的基础的数学知识:

梯度:

相较于单变量的函数,梯度和导数的含义是一样的,但是对于一个多变量的向量来说,其梯度的含义就是在某点处变化最快的向量场,例如对于一个三元函数t=f(x,y,z)来说,其在空间某点的梯度就是:

matlab bp神经网络函数 分类 matlab bp神经网络程序_神经网络

链式法则:

链式法则常用于复合函数求导问题

神经网络算法:

神经网路算法灵感来源于生物细胞中的神经元结构,神经元具有树状突触用来和其他神经元进行交流,在数学上突触就可以视为信号的来源和对象。不同神经元之间的树状突触大小可能不同,不同大小的突触对于信号的响应程度也不同,在数学上对于信号的响应程度就可以用权值来表示。对于相互交流频繁的神经元其之间的突触连接更加紧密,对应的也就是其信号的权值较高。神经元对得到的信号进行总结,在数学上就是对所有输入信号乘以各自的权值后求和。神经元在对总结好信号进行处理,判断是否需要输出生物电信号,在数学上就是将求和的信号作为代入到某个函数中,得到函数结果,根据结果决定输出值。一个神经元可以有多个输出对象,但是只有一个输出结果,也就是相同的输出结果可以输出给多个输出对象。

matlab bp神经网络函数 分类 matlab bp神经网络程序_神经网络_02

如图所示归纳出一个神经元的数学模型,一个神经元有多个输入x1、x2……xn,每个输入对应了各自的权值k1、k2……kn,则其输入的加权和为

si=x1∗k1+x2∗k2+......xn∗knsi=x1∗k1+x2∗k2+......xn∗kn

假设其输入的偏置为b,则实际的加权和为

si=x1∗k1+x2∗k2+......xn∗kn+bsi=x1∗k1+x2∗k2+......xn∗kn+b

现在,输入变量的表达式得到了,那输入和输出的关系,即函数f()怎么得到呢?一般来说,考虑到输出的结果在0到1的范围内,而输入的结果的取值范围则为实数域,因此需要一个函数其定义域为实数域,值域为0到1,常见的函数有阶跃函数、sigmoid函数等,将sisi带入函数中,得到的结果就是神经元的输出h。这里输出的值只有一个,但是输出的对象可以有多个。

在了解单个神经元的数学模型后,将多个神经元组合起来形成网络,就是神经网络。神经网络的组成主要有三部分。对于没有其他神经元的输入,只有输出的神经元,往往在第一层作为感受器而存在,这一层叫做输入层。对于没有其他神经元的输出,只有别的神经元对其输入的神经元往往在最后一层作为执行器而存在,这一层叫做输出层。而中间既有神经元的输入又有神经元的输出的均为隐层。一般来说输入层和输出层只有一个,但是隐层可以有多个。

matlab bp神经网络函数 分类 matlab bp神经网络程序_神经网络_03

为了方便数学模型的表示,我们对于各层之间的变量进行一个命名。对于某一层的某一个神经元,与之相关的参数有:来自上一层的输入和权值和对下一层的输出和权值,以及其输入的加权和,还有该神经元的处理函数。

matlab bp神经网络函数 分类 matlab bp神经网络程序_神经网络_04

如图所示,对于第M层的第j个神经元,其输入的加权和为sMjsjM,表示第M层的第j个神经元的加权和s;其输出为xMjxjM,表示第M层的第j个神经元的输出x;而第L层的第i个神经元和第M层的第j个神经元之间的权值为kMi−jki−jM;而第M层的处理函数可以写为fM()fM()。由此一个神经元有关的变量就全部都能表示了。

根据上面所讲述的神经元的知识,可以得到,对于第M层的第j个神经元,有以下关系方程

1.来自上一层的输入乘以对应的权值得到该神经元的加权和

sMj=xL1∗kL1−j+......xLi∗kLi−j+......xLl∗kLl−jsjM=x1L∗k1−jL+......xiL∗ki−jL+......xlL∗kl−jL

用累加来表示,可以写成

sMj=∑i=1l(xLi∗kLi−j)sjM=∑i=1l(xiL∗ki−jL)

2.对加权和进行函数处理得到该神经元的输出

xMj=fM(sMj)xjM=fM(sjM)

由此可以类推出任意层的任意一个神经元的关系方程。

在信号的正向传递中,所有的信号经过一个个的神经元,在上述关系方程的计算下层层累积最终对输出造成影响。

这里,对于神经网络来说,在一次神经网络计算过程中,其各个神经元之间的权值的变化将会导致输出的变化,为了得到一个较为理想的输出,就要改变其各个神经元之间的权值,从而最终得到一个合适的输出,使得该输出和理想输出的差值最小。这就变成了一个数学上求最值的问题,最值的对象是偏差值,也就是求偏差值最小值。其自变量就是神经网络中的各个神经元之间的权值。对于这种多变量的函数,求最值的问题就关系到了文章开头所说的梯度。也就是求出在当前权值组合下偏差对于各权值的梯度,然后按照与梯度相反的方向,稍微修改权值,;然后再计算该权值下的梯度,然后按照与梯度相反的方向修改权值,重复上述步骤一直到输出偏差到达最小值。这就是为什么神经网络算法又是一种学习算法的原因,因为它会自己不断的趋向最优的结果。

但是这里存在一个问题,就是有可能最终得到的结果只是一个局部最优解,而不是全局最优解。对于这种情况可以通过设定初始权值,惯性等来避免,这里先不进行阐述。

现在对上述求梯度这一过程给出数学上的表达。这里也是神经网络算法反向传递的精髓所在。

首先以一个3-4-2的神经网络为例,然后类比成a-b-c的神经网络,然后再类比成更多层的神经网络。

matlab bp神经网络函数 分类 matlab bp神经网络程序_权值_05

首先输入通过正向传递到达输出,这里我们先一第二层的第一个和第三层的第一个为例:

第2层第1个神经元:

s21=x11∗k11−1+