BP神经网络的神经网络

在人工神经网络发展历史中,很长一段时间里没有找到隐层的连接权值调整问题的有效算法。直到误反向传播算法(BP算法)的提出,成功地解决了求解非线性连续函数的多层前馈神经网络权重调整问题。

bp神经网络的构成 bp神经网络的含义bp神经网络的构成 bp神经网络的含义


bp神经网络的构成 bp神经网络的含义


bp神经网络的构成 bp神经网络的含义


bp神经网络原理

BP神经网络被称为“深度学习之旅的开端”,是神经网络的入门算法。

开始发展——在人工神经网络的发展历史上,感知机网络曾对人工神经网络的发展发挥了极大的作用,它的出现曾掀起了人们研究人工神经元网络的热潮。单层感知网络(M-P模型)做为初的神经网络,具有模型清晰、结构简单、计算量小等优点。

只能解决线性可分——但是,随着研究工作的深入,人们发现它还存在不足,例如无法处理非线性问题,即使计算单元的作用函数不用阀函数而用其他较复杂的非线性函数,仍然只能解决解决线性可分问题.不能实现某些基本功能,从而限制了它的应用。

BP神经网络登场——20世纪80年代中期,Did Runelhart。Geoffrey Hinton和Ronald W-llians、DidParker等人分别发现了误反向传播算法,简称BP,系统解决了多层神经网络隐含层连接权学习问题,并在数学上给出了完整推导。人们把采用这种算法进行误校正的多层前馈网络称为BP网。

BP神经网络(误反传网络)

虽然每个人工神经元很简单,但是只要把多个人工

神经元按一定方式连接起来就构成了一个能处理复杂信息的神经网络。采用BP算法的多层前馈网络是目前应用广泛的神经网络,称之为BP神经网络。它的功能就是能映射复杂的非线性函数关系。

对于已知的模型空间和数据空间,我们知道某个模型和他对应的数据,但是无法写出它们之间的函数关系式,但是如果有大量的一一对应的模型和数据样本,利用BP神经网络可以模拟(映射)它们之间的函数关系。

一个三层BP网络如图8.11所示,分为输入层、隐层、输出层。它是常用的BP网络。理论分析证明三层网络已经能够表达任意复杂的连续函数关系了。只有在映射不连续函数时(如锯齿波)才需要两个隐层[8]。

图8.11中,X=(x1,…,xi,…,xn)T为输入向量,如加入x0=-1,可以为隐层神经元引入阀值;隐层输出向量为:Y=(y1,…,yi,…,ym)T,如加入y0=-1,可以为输出层神经元引入阀值;输出层输出向量为:O=(o1,…,oi,…,ol)T;输入层到隐层之间的权值矩阵用V表示,V=(V1,…,Vj,…,Vl)T,其中列向量Vj表示隐层第j个神经元的权值向量;隐层到输出层之间的权值矩阵用W表示,W=(W1,…,Wk,…,Wl)T,

其中列向量Wk表示输出层第k个神经元的权值向量。

图8.11 三层BP网络[8]

BP算法的基本思想是:预先给定一一对应的输入输出样本集。学习过程由信号的正向传播与误的反向传播两个过程组成。正向传播时,输入样本从输入层传入,经过各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误的反向传播。将输出误以某种形式通过隐层向输入层逐层反传,并将误分摊给各层的所有神经元,获得各层的误信号,用它们可以对各层的神经元的权值进行调整(关于如何修改权值参见韩立群著作[8]),循环不断地利用输入输出样本集进行权值调整,以使所有输入样本的输出误都减小到满意的精度。这个过程就称为网络的学习训练过程。当网络训练完毕后,它相当于映射(表达)了输入输出样本之间的函数关系。

在地球物理勘探中,正演过程可以表示为如下函数:

d=f(m) (8.31)

它的反函数为

m=f-1(d) (8.32)

如果能够获得这个反函数,那么就解决了反演问题。一般来说,难以写出这个反函数,但是我们可以用BP神经网络来映射这个反函数m=f-1(d)。对于地球物理反问题,如果把观测数据当作输入数据,模型参数当作输出数据,事先在模型空间随机产生大量样本进行正演计算,获得对应的观测数据样本,利用它们对BP网络进行训练,则训练好的网络就相当于是地球物理数据方程的反函数。可以用它进行反演,输入观测数据,网络就会输出它所对应的模型。

BP神经网络在能够进行反演之前需要进行学习训练。训练需要大量的样本,产生这些样本需要大量的正演计算,此外在学习训练过程也需要大量的时间。但是BP神经网络一旦训练完毕,在反演中的计算时间可以忽略。

要想使BP神经网络比较好地映射函数关系,需要有全面代表性的样本,但是由于模型空间的无限性,难以获得全面代表性的样本。用这样的样本训练出来的BP网络,只能反映样本所在的较小范围数据空间和较小范围模型空间的函数关系。对于超出它们的观测数据就无确反演。目前BP神经网络在一维反演有较多应用,在二维、三维反演应用较少,原因就是难以产生全面代表性的样本空间。

什么是BP神经网络

BP网络是一种神经网络学习算法。其由输入层、中间层、输出层组成的阶层型神经网络,中间层可扩展为多层。相邻层之间各神经元进行全连接,而每层各神经元之间无连接,网络按有教师示教的方式进行学习,当一对学习模式提供给网络后,各神经元获得网络的输入响应产生连接权值(Weight)。然后按减小希望输出与实际输出误的方向,从输出层经各中间层逐层修正各连接权,回到输入层。此过程反复交替进行,直至网络的全局误趋向给定的极小值,即完成学习的过程。

找个神经网络软件,如NeuroSolutions或迈实神经网络软件,边作边学习,会更好的理解神经网络。

BP神经网络

神经网络能很好地解决不同的机器学习问题。神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。

上图显示了人工神经网络是一个分层模型,逻辑上可以分为三层:

输入层 :输入层接收特征向量 x

输出层 :输出层产出终的预测 h

隐含层 :隐含层介于输入层与输出层之间,之所以称之为隐含层,是因为当中产生的值并不像输入层使用的样本矩阵 X或者输出层用到的标签矩阵 y 那样直接可见。

下面引入一些标记法来帮助描述模型:

!$ a^{(j)}_{i} $ 代表第j层的第i个激活单元。 !$ theta^{(j)} $ 代表从第 j 层映射到第 j+1 层时的权重的矩阵,例如 !$ theta^{(1)} $ 代表从层映射到第二层的权重的矩阵。其尺寸为:以第 j+1层的激活单元数量为行数,以第 j 层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中 !$ theta^{(1)} $ 的尺寸为 34。

对于上图所示的模型,激活单元和输出分别表达为:

!$ a^{(2)}_{1} = g( theta^{(1)}_{10}x_0 + theta^{(1)}_{11}x_1 + theta^{(1)}_{12}x_2 + theta^{(1)}_{13}x_3 ) $

!$a^{(2)}_{2} = g( theta^{(1)}_{20}x_0 + theta^{(1)}_{21}x_1 + theta^{(1)}_{22}x_2 + theta^{(1)}_{23}x_3 ) $

!$a^{(2)}_{3} = g( theta^{(1)}_{30}x_0 + theta^{(1)}_{31}x_1 + theta^{(1)}_{32}x_2 + theta^{(1)}_{33}x_3 ) $

!$h_{theta}{(x)} = g( theta^{(2)}_{10}a^{2}_{0} + theta^{(2)}_{11}a^{2}_{1} + theta^{(2)}_{12}a^{2}_{2} + theta^{(2)}_{13}a^{2}_{3} ) $

下面用向量化的方法以上面的神经网络为例,试着计算第二层的值:

对于多类分类问题来说:

我们可将神经网络的分类定义为两种情况:二类分类和多类分类。

二类分类: !$ S_{L} = 0,y = 0,y = 1$

多类分类: !$ S_{L} = k, y_{i} = 1表示分到第i类;(k>2)$

在神经网络中,我们可以有很多输出变量,我们的 !$h_{theta}{(x)} $ 是一个维度为K的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为: !$ h_{theta}{(x)} in R^{K}(h_{theta}{(x)})_{i} = i^{th} output$

我们希望通过代价函数来观察算法预测的结果与真实情况的误有多大,不同的是,对于每一行特征,我们都会给出K个预测,基本上我们可以利用循环,对每一行特征都预测K个不同结果,然后在利用循环在K个预测中选择可能性的一个,将其与y中的实际数据进行比较。

正则化的那一项只是排除了每一层 !$theta_0$ 后,每一层的 矩阵的和。里层的循环j循环所有的行(由 +1 层的激活单元数决定),循环i则循环所有的列,由该层( !$ s_l$ 层)的激活单元数所决定。即: !$h_{theta}{(x)}$ 与真实值之间的距离为每个样本-每个类输出的加和,对参数进行 regularization 的 bias 项处理所有参数的平方和。

由于神经网络允许多个隐含层,即各层的神经元都会产出预测,因此,就不能直接利用传统回归问题的梯度下降法来小化 !$J(theta)$ ,而需要逐层考虑预测误,并且逐层优化。为此,在多层神经网络中,使用反向传播算法(Backpropagation Algorithm)来优化预测,首先定义各层的预测误为向量 !$ δ^{(l)} $

训练过程:

当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但终的结果可能并不是解。

为了避免这样的问题,我们采取一种叫做梯度的数值检验( Numerical Gradient Checking )方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。

对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 ,我们计算出在 !$theta - epsilon$ 处和 !$theta + epsilon$ 的代价值(是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 !$theta$ 处的代价值。

当 !$theta$ 是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对 !$theta_1$ 进行检验的示例:

如果上式成立,则证明网络中BP算法有效,此时关闭梯度校验算法(因为梯度的近似计算效率很慢),继续网络的训练过程。