数据挖掘学习笔记之人工神经网络(一)
由于本人这段时间在学习数据挖掘的知识,学习了人工神经网络刚好就把学习的一些笔记弄出来,也为以后自己回头看的时候方便些。
神经网络学习方法对于逼近实数值、离散值或向量值的目标函数提供了一种健壮性很强的方法。对于某些类型的问题,如学习解释复杂的现实世界中的传感器数据,人工神经网络是目前知道的最有效学习方法。人工神经网络的研究在一定程度上受到了生物学的启发,因为生物的学习系统是由相互连接的神经元(neuron)组成的异常复杂的网络。而人工神经网络与此大体相似,它是由一系列简单单元相互密集连接构成,其中每一个单元有一定数量的实值输入(可能是其他单元的输出),并产生单一的实数值输出(可能成为其他很多单元的输入)。
实例:
接下来用一个很简单的例子简要说明一下神经网络的应用:
Pomerleau(1993)的ALVINN系统是ANN学习的一个典型实例,这个系统使用一个学习到的ANN以正常的速度在高速公路上驾驶汽车。ANN的输入是一个30´32像素的网格,像素的亮度来自一个安装在车辆上的前向摄像机。ANN的输出是车辆行进的方向。这个ANN通过观察人类驾驶时的操纵命令进行训练,训练过程大约5分钟。ALVINN用学习到的网络在高速公路上以70英里时速成功地驾驶了90英里(在分行公路的左车道行驶,同时有其他车辆)。
下图画出了ALVINN系统的一个版本中使用过的神经网络表示,这也是很多ANN系统的典型表示方式。神经网络显示在图的左边,输入的摄像机图像在它的下边。网络图中每个结点对应一个网络单元(unit)的输出,而从下方进入结点的实线为其输入。可以看到,共有四个单元直接从图像接收所有的30´32个像素。这四个单元被称为“隐藏”单元,因为它们的输出仅在网络内部,不是整个网络输出的一部分。每个隐藏单元根据960个输入的加权和计算得到单一的实数值输出。然后这四个隐藏单元的输出被用作第二层30个“输出单元”的输入。每个输出单元对应一个特定的驾驶方向,这些单元的输出决定哪一个驾驶方向是最强烈推荐的。
接下来,就简单研究下人工网络学习的两个相似的算法:感知器训练法则和梯度下降法则,这个两个法则的区分主要是根据训练样例是不是线性可分或者收敛的性质来决定的。这两种算法保证收敛到可接受的假设,在不同的条件下收敛到的假设略有不同。
感知器训练法则:
什么是感知器?
感知器以一个实数值向量作为输入,计算这些输入的线性组合,然后如果结果大于某个阈值就输出1,否则输出-1。更精确地,如果输入为x1到xn,那么感知器计算的输出为:
其中每一个wi是一个实数常量,或叫做权值(weight),用来决定输入xi对感知器输出的贡献率。请注意,常量(-w0)是一个阈值,它是为了使感知器输出1,输入的加权和必须超过的阈值。如下图:
为了简化表示,我们假想有一个附加的常量输入x0=1,那么我们就可以把上边的不等式写为,或以向量形式写为。为了简短起见,我们有时会把感知器函数写为:
其中,
学习一个感知器意味着选择权w0, …,wn的值。所以感知器学习要考虑的候选假设空间H就是所有可能的实数值权向量的集合。
什么叫线性可分?
我们可以把感知器看作是n维实例空间(即点空间)中的超平面决策面。对于超平面一侧的实例,感知器输出1,对于另一侧的实例输出-1,这个决策超平面方程是。当然,某些正反样例集合不可能被任一超平面分割。那些可以被分割的称为线性可分(linearly separable)样例集合,如图3,(a)一组训练样例和一个能正确分类这些样例的感知器决策面。(b)一组非线性可分的训练样例(也就是不能用任一直线正确分类的样例)。x1和x2是感知器的输入。“+”表示正例,“-”表示反例。
图 3
感知器可以表示所有的原子布尔函数(primitive boolean function):与、或、与非(NAND)和或非(NOR)。但是,一些布尔函数无法用单一的感知器表示,例如异或函数(XOR),它当且仅当x1¹x2时输出为1。请注意图3(b)中线性不可分的训练样本集对应于异或函数。
感知器训练法则:
我们现在从如何学习单个感知器的权值开始。准确地说,这里的学习任务是决定一个权向量,它可以使感知器对于给定的训练样例输出正确的1或-1。
为得到可接受的权向量,一种办法是从随机的权值开始,然后反复地应用这个感知器到每个训练样例,只要它误分类样例就修改感知器的权值。重复这个过程,直到感知器正确分类所有的训练样例。每一步根据感知器训练法则(perceptron training rule)来修改权值,也就是根据下面的法则修改与输入xi对应的权wi:
wi<--wi+Dwi
其中
Dwi =h(t-o)xi
这里t是当前训练样例的目标输出,o是感知器的输出,h是一个正的常数称为学习速率(learning rate)。学习速率的作用是缓和每一步调整权的程度。它通常被设为一个小的数值(例如0.1),而且有时会使其随着权调整次数的增加而衰减。
现在我们来讲下为什么这个更新法则会成功收敛到正确的权值呢?
为了得到直观的感觉,考虑一些特例。假定训练样本已被感知器正确分类。这时,(t-o)是0,这使Dwi为0,所以没有权值被修改。而如果当目标输出是+1时感知器输出一个-1,这种情况为使感知器输出一个+1而不是-1,权值必须被修改以增大的值。例如,如果xi>0,那么增大wi会使感知器更接近正确分类这个实例。注意这种情况下训练法则会增长wi,因为(t-o),h和xi都是正的。例如,如果xi=0.8,h=0.1,t=1,并且o= -1,那么权更新就是Dwi =h(t-o)xi=0.1(1-(-1))0.8=0.16。另一方面,如果t=-1而o=1,那么和正的xi关联的权值会被减小而不是增大。
梯度下降法则
尽管当训练样例线性可分时,感知器法则可以成功地找到一个权向量,但如果样例不是线性可分时它将不能收敛。因此,人们设计了另一个训练法则来克服这个不足,称为delta法则(delta rule)。如果训练样本不是线性可分的,那么delta法则会收敛到目标概念的最佳近似。
delta法则的关键思想:使用梯度下降(gradient descent)来搜索可能权向量的假设空间,以找到最佳拟合训练样例的权向量。
我们把delta训练法则理解为训练一个无阈值的感知器,也就是一个线性单元(linear unit),它的输出o如下:
于是,一个线性单元对应于感知器的第一阶段,不带有阈值。
为了推导线性单元的权值学习法则,先指定一个度量标准来衡量假设(权向量)相对于训练样例的训练误差(training error)。尽管有很多办法定义这个误差,一个常用的特别方便的度量标准为:
其中D是训练样例集合,td是训练样例d的目标输出,od是线性单元对训练样例d的输出。在这个定义中,是目标输出td和线性单元输出od的差异的平方在所有的训练样例上求和后再除以2。
这里我们把E定为的函数,是因为线性单元的输出o依赖于这个权向量。当然E也依赖于特定的训练样例集合,但我们认为它们在训练期间是固定的,所以不必麻烦地把E写为训练样例的函数。第6章给出了选择这种E定义的一种贝叶斯论证。确切地讲,在那里我们指出了在一定条件下,对于给定的训练数据使E最小化的假设也就是H中最可能的假设。为了理解梯度下降算法,形象地表示整个假设空间如下:
形象化假设空间
下图画出了包含可能权向量的整个假设空间和与与它们相关联的E值。这里,坐标轴w0,w1表示一个简单的线性单元中两个权的可能的取值。纵轴指出相对于某固定的训练样例的误差E。因此图中的误差曲面概括了假设空间中每一个权向量的企望度(desirability)(我们企望得到一个具有最小误差的假设)。如果给定了用来定义E的方法,那么对于线性单元,这个误差曲面必然是具有单一全局最小值的抛物面。对于有两个权值的线性单元,假设空间H就是w0,w1平面。
下图纵轴表示与固定的训练样例集合相应的权向量假设的误差。箭头显示了该点梯度的相反方向,指出了在w0,w1平面中沿误差曲面最陡峭下降的方向。
梯度下降搜索确定一个使E最小化的权向量的方法是从一个任意的初始权向量开始,然后以很小的步伐反复修改这个向量。在每一步,按照沿误差曲面产生最陡峭下降的方向修改权向量。继续这个过程直到到达全局的最小误差。
算法:
梯度下降法则的推导:
Gradient-Descent(training_examples, h) training_examples中每一个训练样例形式为序偶<, t>,其中是输入值向量,t是目标输出值。h是学习速率(例如0.05)。 初始化每个wi为某个小的随机值 遇到终止条件之前,做以下操作: 初始化每个Dwi为0 对于训练样例training_examples中的每个<, t>,做: 把实例输入到此单元,计算输出o 对于线性单元的每个权wi,做 Dwi<-- Dwi +h(t-o)xi 对于线性单元的每个权wi,做 wi<-- wi +Dwi
|
我们通过计算E相对向量的每个分量的导数来得到这个方向。这个向量导数被称为E对于的梯度(gradient),记作:
注意本身是一个向量,它的成员是E对每个wi的偏导数。当梯度被解释为权空间的一个向量时,它确定了使E最陡峭上升的方向。所以这个向量的反方向给出了最陡峭下降的方向。
既然梯度确定了E最陡峭上升的方向,那么梯度下降的训练法则是:
(1)
其中:
(2)
这里h是一个正的常数叫做学习速率,它决定梯度下降搜索中的步长。其中的负号是因为我们想要让权向量向E下降的方向移动。这个训练法则也可以写成它的分量形式:
wi¬wi+Dwi
其中(3)
这样很清楚,最陡峭的下降可以通过按比例改变的每一分量wi来实现。
(4)
其中xid表示训练样例d的一个输入分量xi。现在我们有了一个等式,能够用线性单元的输入xid、输出od、以及训练样例的目标值td表示。把等式(4)代入等式(3)便得到了梯度下降权值更新法则。
总结:训练线性单元的梯度下降算法如下:选取一个初始的随机权向量;应用线性单元到所有的训练样例,然后根据公式(5)计算每个权值的Dwi;通过加上Dwi来更新每个权值,然后重复这个过程。因为误差曲面仅包含一个全局的最小值,所以无论训练样本是否线性可分,这个算法会收敛到具有最小误差的权向量,条件是必须使用一个足够小的学习速率h。如果h太大,梯度下降搜索就有越过误差曲面最小值的危险,而不是停留在那一点。因此,对此算法的一种常用的改进是随着梯度下降步数的增加逐渐减小h的值。
然而应用梯度下降的主要实践问题是:
(1)有时收敛过程可能非常慢(它可能需要数千步的梯度下降);
(2)如果在误差曲面上有多个局部极小值,那么不能保证这个过程会找到全局最小值。
缓解这些困难的一个常见的梯度下降变体被称为增量梯度下降(incremental gradient descent),或随机梯度下降(stochasticgradient descent)。
随机梯度下降的思想:
根据每个单独样例的误差增量地计算权值更新,得到近似的梯度下降搜索。修改后的训练法则与公式(5)给出的相似,只是在迭代计算每个训练样例时根据下面的公式来更新权值
Dwi =h(t-o)xi
其中t,o,和xi分别是目标值、单元输出和第i个训练样例的输入。看待随机梯度下降的一种方法是考虑为每个单独的训练样例d定义不同的误差函数Ed():
其中td和od是训练样例d的目标输出值和单元输出值。
标准的梯度下降和随机的梯度下降之间的关键区别是:
· 在标准的梯度下降中,是在权值更新前对所有样例汇总误差,然而在随机的梯度下降中,权值是通过考查每个训练实例来更新的。
· 在标准的梯度下降中权值更新的每一步对多个样例求和,这需要更多的计算。另一方面,因为使用真正的梯度,标准的梯度下降对于每一次权值更新经常使用比随机梯度下降有较大的步长。
· 如果E(w)有多个局部极小值,随机的梯度下降有时可能避免陷入这些局部极小值。
在实践中,无论是随机的还是标准的梯度下降方法都被广泛应用。
小结
我们学习了迭代学习感知器权值的两个相似的算法。这两个算法间的关键差异是感知器训练法则根据阈值化(thresholded)的感知器输出的误差更新权值,然而增量法则根据输入的非阈值化(unthresholded)线性组合的误差来更新权。
这两个训练法则间的差异反映在不同的收敛特性上。感知器训练法则经过有限次的迭代收敛到一个能理想分类训练数据的假设,但条件是训练样例线性可分。增量法则渐近收敛到最小误差假设,可能需要无限的时间,但无论训练样例是否线性可分都会收敛。
线性规划是解线性不等式方程组的一种通用的有效方法。注意每个训练样例对应一个形式为>0或£0的不等式,并且它们的解就是我们期望的权向量。但是,这种方法仅当训练样例线性可分时有解,无论如何,这种线性规划的方法不能扩展到训练多层网络,这是我们最关心的,但是基于增量法则的梯度下降方法可以简单地扩展到多层网络,这就是反向传播算法。
来自: http://blog.csdn.net//u011067360/article/details/22309501