BP神经网络理论

科普神经网络是一种运算模型由大量的节点(或称“神经元”,或“单元”)和之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重(weight),这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。人工神经网络通常是通过一个基于数学统计学类型的学习方法(Learning Method)得以优化,所以人工神经网络也是数学统计学方法的一种实际应用,通过统计学的标准数学方法我们能够得到大量的可以用函数来表达的局部结构空间,另一方面在人工智能学的人工感知领域,我们通过数学统计学的应用可以来做人工感知方面的决定问题(也就是说通过统计学的方法,人工神经网络能够类似人一样具有简单的决定能力和简单的判断能力),这种方法比起正式的逻辑学推理演算更具有优势。

 

单个神经元(理解神经网络第一步):

 

  • a1~an为输入向量的各个分量
  • w1~wn为神经元各个突触的权值
  • b为偏置bias,或者称之为阈值(threshold
  • f为传递函数,通常为非线性函数。一般有traingd(),tansig(),hardlim()。以下默认为hardlim()
  • t为神经元输出

 数学表示

 

  • 向量W为权向量
  • 向量A为输入向量,做内积需要用到转置
  • b为偏置(bias),或者称之为阈值(threshold)
  • f为传递函数,也即激励函数

带有 sigma 函数(顶部)和 cutoff 函数(底部)

可见,一个神经元的功能是求得输入向量与权向量的内积后,经一个非线性传递函数得到一个标量结果

单个神经元的作用:把一个n维向量空间用一个超平面分割成两部分(称之为判断边界),给定一个输入向量,神经元可以判断出这个向量位于超平面的哪一边。(SVM也即是做的这部分工作,所以说,当单个神经元的时候,BP神经网络做的工作与SVM类似。该超平面的方程:WXT + b = 0)

  • 向量W为权向量
  • 向量X为输入向量
  • b为偏置(bias),或者称之为阈值(threshold)

 首先解释一下单个神经元如何进行分类判断:

 引入一个阈值逻辑单元(Threshold Logic Unit,TLU)的名词,它可以输入一组加权系数的量,对它们进行求和,如果这个和达到或者超过了某个阈值,输出一个量。

 

让我们用符号标注这些功能,首先,有输入值以及它们的权系数:1, X 2, ..., X n 1, W 2, ..., W n。接着是求和计算出的 i*W i ,产生了激发层 a,换一种方法表示:

a = (X1 * W1)+(X2 * W2)+...+(Xi * Wi)+...+ (Xn * Wn)

阈值称为 theta。最后,输出结果 y。当 a >=theta  y=1,反之 y=0。请注意输出可以是连续的,因为它也可以由一个 squash 函数 s(或 sigma)判定,该函数的自变量是 a,函数值在 0  1 之间,y=s(a)

  假设一个 TLU 有两个输入值,它们的权系数等于 1,theta 值等于 1.5。当这个 TLU 输入 <0,0>、<0,1>、<1,0> 和 <1,1> 时,它的输出分别为 0、0、0、1。TLU 将这些输入分为两组:0 组和 1 组。就像懂得逻辑连接(布尔运算 AND)的人脑可以类似地将逻辑连接的句子分类那样,TLU 也懂得一点逻辑连接之类的东西。 

 神经网络的学习是模仿大脑调节神经网络连接的原理。TLU通过改变它的权值以及阈值来进行学习。回想上面,我们看到SUM()>=theta时候,TLU在临界点是输出的是1而不是0,这就相当于当SUM(Wi * Xi)  +  (-1 * theta) >= 0的时候。这时候,我们把-1当做是一个常量输入,而他的权系数theta θ在学习过程(或者说是训练过程)中进行调整。这样,当 SUM(X i* W i)+ (-1 * theta) >= 0 时,y=1,反之 y=0。

在培训过程中,神经网络输入:

  1. 一系列需要分类的术语示例X(input)
  2. 它们的正确分类或者目标Target

这样的输入可以看成一个向量:<X 1, X 2, ..., X n, theta, t>,这里 t 是一个目标或者正确分类。神经网络用这些来调整权系数,其目的使培训中的目标与其分类相匹配。因为神经网络是有指导的培训。或许你现在会问,神经网络是如何通过“调整权系数”来进行学习的?也即神经网络的学习规则。下面介绍一下:权系数的调整有一个学习规则,一个理想化的学习算法如下所示

理想化的学习算法 fully_trained = FALSE
DO UNTIL (fully_trained):
    fully_trained = TRUE
    FOR EACH training_vector = <X1, X2, ..., Xn, theta, target>::
                               # Weights compared to theta
        a = (X1 * W1)+(X2 * W2)+...+(Xn * Wn) - theta
        y = sigma(a)
        IF y != target:
            fully_trained = FALSE
        FOR EACH Wi:
        MODIFY_WEIGHT(Wi)      # According to the training rule
    IF (fully_trained):
        BREAK

有一条似乎合理的规则是基于这样一种思想,即权系数和阈值的调整应该由分式 (t - y) 确定。这个规则通过引入 alpha (0 < alpha < 1) 完成。我们把 alpha 称为 学习率。W i 中的更改值等于 (alpha * (t - y)* Xi)。当 alpha 趋向于 0 时,神经网络的权系数的调整变得保守一点;当 alpha 趋向于 1 时,权系数的调整变得激进。一个使用这个规则的神经网络称为 感知器,并且这个规则被称为 感知器学习规则。概念一下貌似太多,针对单节点的描述可以暂时到此,对于我们的主题BP网络的学习规则接下来将会描述。

神经元网络:

单层神经元网络是最基本的神经元网络形式,由有限个神经元构成,所有神经元的输入向量都是同一个向量。由于每一个神经元都会产生一个标量结果,所以单层神经元的输出是一个向量,向量的维数等于神经元的数目。 示意图:

多层神经元网络(BP网络图)

BP (Back Propagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。由上图可知,BP神经网络是一个三层的网络:

  • 输入层(input layer)输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;
  • 隐藏层(Hidden Layer):中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程
  • 输出层(Output Layer):顾名思义,输出层向外界输出信息处理结果

  当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。

  好了,以上对于神经网络的结构以及各个组件之间的运行时关系描述到此为止,那么,现在重要的是:具体是如何在误差反向传播的过程中,对各个层权系数进行调整?规则是什么?总结上面,调整的目的即是每次训练后减少误差。可以使用最小二乘法或者是梯度下降算法。首先需要介绍一下Delta学习规则

关于 delta 规则

感知器培训规则是基于这样一种思路 ——权系数的调整是由目标和输出的差分方程表达式决定。而 delta 规则是基于梯度降落(也即梯度下降)这样一种思路。在权系数的调整中,神经网络将会找到一种将误差减少到最小的权系数的分配方式。梯度下降参考WIKI。这里不再摘抄。

为了便于说明,将我们的网络限制为没有隐藏节点,但是可能会有不止一个的输出节点

设p是一组培训中的一个元素,t(p,n)是相应的输出节点 n 的目标。设y(p,n)为经过神经网络处理后的结果,前面提到过的squash函数s决定(还记得我们前面提到说这个函数只是为了将连续的输出对应到我们不连续的分类target么?这个函数本身与神经网络没有关系哈),这里a(p,n)是与p相关的n的激活函数,或者用(p,n) =s(a(p,n))表示为与p相关的节点n的squash过的激活函数。

为网络设定权系数(每个Wi),也为每个p和n建立t(p,n)与 y(p,n)的差分这就意味着为每个p设定了网络全部的误差(因为通过这个P求出来的结果有误差,那么久要更新所有的权系数)。因此对于每组权系数来说有一个平均误差。但是 delta 规则取决于求平均值方法的精确度以及误差。我们先不讨论细节问题,只是说一些与某些p和n相关的误差:1/2* square( t(p,n) - y(p,n) ) ;现在对于每个权系数Wi,平均误差定义如下:

sum = 0
FOR p = 1 TO M:         # M is number of training vectors
    FOR n = 1 TO N:     # N is number of output nodes
        sum = sum + (1/2 * (t(p,n)-y(p,n))^2)
average = 1/M * sum

delta 规则就是依据这个误差的定义来定义的。因为误差是依据那些培训向量来说明的,delta 规则是一种获取一个特殊的权系数集以及一个特殊的向量的算法。而改变权系数将会使神经网络的误差最小化。我们不需要讨论支持这个算法的微积分学,只要认为任何Wi发生的变化都是如下所示就够了:

alpha * s'(a(p,n)) * (t(p,n) - y(p,n)) * X(p,i,n)

X(p,i,n)是输入到节点n的p中的第i个元素alpha是已知的学习率。最后 s'(a(p,n))是与p相关的第n个节点激活的 squashing 函数的变化(派生)率,这就是 delta 规则

最后说说:梯度下降算法对学习速率alpha的值非常敏感,学习速率的值越大,步长越大收敛的速度就会越快。学习速率越小,步长就小,需要迭代的次数就会多些。当alpha非常小的时候,权系数向量接近某个将误差最小化的向量。用于权系数调节的基于delta规则的算法就是如此。

继续回到BP神经网络的讨论,反向传播这一算法把支持delta规则的分析扩展到了带有隐藏节点的神经网络。为了理解这个问题,设想Bob给Alice讲了一个故事,然后Alice又讲给了TedTed检查了这个事实真相,发现这个故事是错误的。现在 Ted 需要找出哪些错误是Bob造成的而哪些又归咎于Alice。当输出节点从隐藏节点获得输入,网络发现出现了误差,权系数的调整需要一个算法来找出整个误差是由多少不同的节点造成的,网络需要问,“是谁让我误入歧途?到怎样的程度?如何弥补?”这时,网络该怎么做呢?

同样源于梯度降落原理,在权系数调整分析中的唯一不同是涉及到t(p,n)与y(p,n)的差分。通常来说Wi的改变在于:

alpha * s'(a(p,n)) * d(n) * X(p,i,n)

其中d(n)是隐藏节点n的函数,让我们来看

  1. n 对任何给出的输出节点有多大影响;
  2. 输出节点本身对网络整体的误差有多少影响。

一方面,n 影响一个输出节点越多,n 造成网络整体的误差也越多。另一方面,如果输出节点影响网络整体的误差越少,n 对输出节点的影响也相应减少。这里d(j)是对网络的整体误差的基值,W(n,j) 是 n 对 j 造成的影响,d(j) * W(n,j) 是这两种影响的总和。但是 n 几乎总是影响多个输出节点,也许会影响每一个输出结点,这样,d(n) 可以表示为:

SUM(d(j)*W(n,j))

这里j是一个从n获得输入的输出节点,联系起来,我们就得到了一个培训规则

第1部分:在隐藏节点n和输出节点j之间权系数改变,如下所示:

alpha * s'(a(p,n))*(t(p,n) - y(p,n)) * X(p,n,j)

第 2 部分:在输入节点i和输出节点n之间权系数改变,如下所示:

alpha * s'(a(p,n)) * sum(d(j) * W(n,j)) * X(p,i,n)

这里每个从n接收输入的输出节点j都不同。关于反向传播算法的基本情况大致如此。

使误差小到适当的程度要遵循的步骤

第 1 步:输入培训向量。

第 2 步:隐藏节点计算它们的输出

第 3 步:输出节点在第 2 步的基础上计算它们的输出。

第 4 步:计算第 3 步所得的结果和期望值之间的差。

第 5 步:把第 4 步的结果填入培训规则的第 1 部分。

第 6 步:对于每个隐藏节点 n,计算 d(n)。

第 7 步:把第 6 步的结果填入培训规则的第 2 部分。

通常把第 1 步到第 3 步称为 正向传播,把第 4 步到第 7 步称为 反向传播。反向传播的名字由此而来。

参考资料:

http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html神经网络编程入门,这儿有一个BP的matlab程序示例。

http://zh.wikipedia.org/wiki/%E6%9C%80%E9%80%9F%E4%B8%8B%E9%99%8D%E6%B3%95 梯度下降法

http://www.ibm.com/developerworks/cn/linux/other/l-neural/index.html 神经网络介绍

http://en.wikipedia.org/wiki/Backpropagation wiki上面的BP介绍

 

posted on 2012-07-05 14:39  Pe.潘义  阅读(43190)  评论(2编辑  收藏

导航

统计