3.1 神经计算
本节将介绍构成人类大脑的生物神经元与人工神经网络中使用的人工神经元之间的关系,解释MP模型,并考查感知器的学习能力和局限性;探讨多层神经网络结构,并解释多层网络中的监督学习算法——反向传播算法;通过使用自组织映射解释无监督学习[1-3]。
3.1.1 从生物神经元到人工神经元
人类大脑包含超过100亿个神经元,每个神经元平均与数千个其他神经元连接。这些连接被称为突触,人脑包含大约60万亿这样的连接。
神经元实际上是非常简单的处理单元。每个神经元都由细胞体和突起构成。细胞体具有联络和整合输入信息并传出信息的功能。突起有树突和轴突两种。树突短而分枝多,直接由细胞体扩张突出,形成树枝状,其作用是接收其他神经元轴突传来的冲动并传给细胞体。轴突长而分枝少,为粗细均匀的细长突起,末端形成树枝状的神经末梢。生物神经元的简化图如图3-1所示。
神经元沿其树突接收来自其他神经元的输入,当此输入信号超过某个阈值时,神经元受到“激发”,即被称为动作电位的电脉冲沿着轴突传向与该神经元连接的其他神经元树突。
尽管每个神经元都非常简单,但神经元网络能够以极高的速度和非常复杂的方式处理信息。众所周知,人类的大脑远远比任何由人类创造的装置或宇宙中任何的物体的结构都要复杂。
人类大脑具有称为可塑性的属性,这意味着神经元可以改变与其他神经元连接的性质和数量,以响应发生的事件。通过这种方式,大脑能够学习。大脑使用一种信用分配形式来加强神经元之间的联系,从而形成问题的正确解决方案,并削弱导致错误解决方案的连接。连接或突触的强度决定了它对连接的神经元的影响程度,因此如果连接弱化,它将对随后的计算结果产生较少的影响。
图3-1 生物神经元的简化图
人工神经网络模仿人类大脑,由许多人工神经元组成。人工神经网络中的神经元往往具有比生物神经元更少的连接,并且神经网络在神经元数量方面(目前)明显小于人类大脑。
本章中研究的神经元是由McCulloch 和 Pitts发明的,因此通常被称为MP模型。神经网络中的每个神经元(或节点)接收许多输入,称为激活函数的函数使用这些输入值来激活各个神经元,神经元的激活程度以输出值来表示,可以在神经元中使用许多激活函数。一些最常用的激活函数如图3-2所示。
在图3-2中,每个图的X轴表示神经元的输入值,Y轴表示神经元的输出或激活程度。
图3-2 常用的激活函数
最常用的激活函数是阶跃函数或线性阈值函数。在使用这两个函数时,将神经元的输入相加(每个都乘以权重),并将该总和与阈值t进行比较。如果总和大于阈值,则神经元激发并具有+1的激活程度;否则,它处于非激活状态且激活程度为零。因此,神经元的行为可以表示为
式中,X为神经元的n个输入的加权和。其中,每个输入xi乘以其对应的权重wi,i为从1到n。例如,考虑一个只有两个输入的简单神经元,这两个输入都具有与之相关的权重,即
神经元的输入是x1和x2,即
所以,加权后的总输入为
激活程度为Y,此神经元定义为
因此,如果t等于0.92,当加权和X大于0.92时,这个神经元将用这组特定的输入来激活自身;否则,它的激活程度为零。使用线性激活函数的神经元仅使用其输入的加权和标识其激活程度。Sigmoid函数将输入范围为-∞到+∞的输入转换为0到+1范围内的激活程度。
人工神经网络由一组连接在一起的神经元组成。神经元之间的连接具有与之相关联的权重,并且每个神经元将自身的输出传递到其所连接的神经元作为输入。此输出取决于激活函数所接收的输入。以这种方式,可通过整个网络处理传到网络的输入信号,并产生一个或多个输出,没有中央处理或控制机制,整个网络与其中的每个计算都密切相关。
3.1.2 从单层感知器到多层神经网络
1.单层感知器
感知器最初由Rosenblatt(1958年)提出,是一种简单的神经元模型,用于将输入特征进行两类划分。
感知器可以具有任意数量的输入,有时被排布成网格。该网格可用于表示图像或视野,因此感知器可用于执行简单的图像分类或识别任务。
感知器使用阶跃函数,此函数通常写为Step(X),即
在这种情况下,感知器的激活函数可以写成
注意,这里允许i从0而不是从1开始。这意味着引入了两个新变量:w0和x0。可将x0定义为1,将w0定义为t。
单个感知器可用于学习分类任务,其中它接收输入并将其分类为两个类别之一:1或0,可以用它们来表示真和假。也就是说,感知器可以学习表示布尔运算符,如AND或OR。
感知器的学习过程如下。
首先,将权重随机分配给输入端。通常,这些权重选择的值为-0.5~+0.5。
其次,将一对训练数据呈现给感知器,并观察其输出分类。如果输出不正确,则调整权重以尝试更仔细地对此输入进行分类。换句话说,如果感知器错误地将正类别训练数据划分为负类别,则需要修改权重以增加该组输入对应的输出。这可以通过向具有负值的输入端权重添加正值来完成,反之亦然。
由Rosenblatt(1960年)提出的这种修改公式为
式中,e为产生的误差;为学习率,其中0 <<1。如果输出正确,则e定义为0;如果输出过低,则e为正;如果输出过高,则e为负。以这种方式,如果输出太高,则对于接收到正值的输入减小权值,此规则称为感知器训练规则。
一旦对权重进行了这种修改,下一条训练数据就以相同的方式使用。一旦应用了所有训练数据,该过程再次开始,直到所有权重都正确且所有误差都为零。此过程的每次迭代都称为一个迭代周期。
通过一个简单例子来看感知器如何学习使用两个输入来表示逻辑“或”的函数。下面将使用零阈值(t = 0)和学习率0.2。
首先,将两输入中每个的权重初始化为-1~+1的随机值:
现在,第一个迭代周期已经过去了。训练数据将由1和0的两种输入组成4种组合。因此,第一个训练数据为
预期输出为x1∨x2= 0。将使用的公式为
因此,输出Y如预期的那样,误差e为0,所以权重不会改变。
现在,对于x1 = 0和x2 = 1有
同样,这是正确的,因此权重不需要改变。
对于x1 = 1和x2 = 0有
这是不正确的,因为1∨0= 1,所以这组输入的Y为1。因此,权重被调整。
使用感知器训练规则为权重指定新值:
学习率为0.2,在这种情况下,e为1,所以将下面的值分配给w1:
现在使用相同的公式为w2分配一个新值:
w2权值不变,表示其对错误没有贡献。现在使用最后一对训练数据(x1 = 1和x2 = 1):
这是正确的,因此不调整权重。
这是第一个迭代周期的结束,此时该方法再次运行并继续迭代,直到所有4组训练数据都被正确分类。
表3-1显示了完整的序列,只需要3个周期,感知器就正确地学会对输入值进行分类。在仅仅3个迭代周期后,感知器就学会了如何正确地建立逻辑或函数的模型。以同样的方式,可以训练感知器来模拟其他逻辑功能,如逻辑“与”,但有些函数无法使用感知器建模,如逻辑“异或”。原因是感知器只能学习模拟线性可分的函数。线性可分函数是可以在二维层面绘制的函数,其可以通过在值域画出一条直线,将输入的一类划分到直线的一侧,另一类划分到直线的另一侧。
表3-1 简单感知器在学习表示逻辑“或”时权重的变化示例
由图3-3可知,对逻辑“异或”无法绘制一条分割线,而对逻辑“或”可绘制这样一条分割线。
图3-3 线性可分函数与非线性可分函数之间的区别
图3-3中,实心点表示true,空心点表示false。应该清楚的是,在第二种情况(对于“异或”逻辑)不能绘制一条虚线将实心点与空心点分开。
通过检查以下函数,可以看出单个感知器只能模拟线性可分函数的原因。
使用函数X =t可线性有效地划分搜索空间。因此,在具有两个输入的感知器中,将一个类与另一个类分开的线性方程定义为
感知器通过找到wi的一组值,从而产生合适的函数来起作用。在不存在这种线性函数的情况下,感知器运行不成功。
2.多层神经网络
大多数现实世界的问题都不是线性可分的,因此尽管感知器是研究人工神经元工作方式的有趣模型,但解决实际问题还需要更强大的功能。正如已经指出的那样,神经网络由连接在一起的许多神经元组成,通常以层的形式排列。单个感知器可以被认为是单层感知器。多层感知器能够建模更复杂的函数,包括线性不可分函数,如逻辑“异或”函数。
“或”函数和“与非”函数都是线性可分的,可以用单个感知器来表示。通过将这些函数组合在一起,可以生成所有其他布尔函数。因此,通过仅在两个层中组合单个感知器,可以生成两个输入的任何二元函数。三层前馈神经网络如图3-4所示。
图3-4 三层前馈神经网络
图3-4中,第一层是输入层。该层中的每个节点(或神经元)接收单个输入信号。实际上,通常该层中的节点不是神经元,而只是用于将输入信号传递到下一层中的节点,称为隐层。
网络可以有一个或多个隐层,其中包含执行实际工作的神经元。注意,每个输入信号被传递到该层中的每个节点,并且该层中每个节点的输出被传递到最终层中的每个节点,即输出层。输出层处理后发出输出信号。
该网络称为前馈网络是因为数据从输入节点前馈到输出节点。典型的前馈神经网络由输入层、一个或两个隐层和输出层组成,并且每层可以具有10~1000个神经元。
3.1.3 反向传播算法
多层神经网络的学习方式与单个感知器的学习方式大致相同,主要区别在于:在多层网络中,每个神经元具有与其输入相关联的权重,因此当用一条训练数据产生错误时,就要调整大量的权重。显然,一个重要的问题是,如何调节才能使各个权重增加或减少。最常用的一种方法是反向传播算法。
多层反向传播网络通常使用Sigmoid函数,而不是使用单个感知器使用的简单Step函数。
Sigmoid函数定义为
这个函数很容易微分,因为
这与感知器使用的Step函数形成对比,感知器没有简单的导数。
与单个感知器一样,反向传播算法首先将网络中的权重初始化为随机值,随机值通常设置为较小的值,如为-0.5~0.5;或者权重可以正常分布在-2.4/n到2.4/n的范围,其中n是输入层的输入个数。
算法的每轮迭代都先通过网络将数据从输入馈送到输出,再将输出错误反馈到输入,误差通过网络反馈,沿路径改变节点的权重。以这种方式重复,直到训练数据产生的输出足够接近所需值,换句话说,直到误差值足够小。
因为Sigmoid函数实际上不能达到0或1,所以通常接收如0.9的值表示1,接收如0.1的值表示0。
下面介绍反向传播算法中用于调整权重的公式。考虑三层网络,并使用i表示输入层中的节点,j表示隐层中的节点,k表示输出层中的节点。因此,wij表示输入层中的节点与隐层中的节点之间连接的权重。
用于在网络中导出节点j的输出值的函数为
其中,n为节点j的输入数量;wij为每个节点i和节点j之间连接的权重;为用于节点j的阈值,它被设置为0~1的随机值;xi为输入节点i的输入值;yj为节点j产生的输出值。
一旦输入通过网络馈送产生输出,就计算输出层中每个节点k的误差梯度。k的误差信号定义为该节点的期望值和实际值之间的差值,即
式中,dk为节点k的期望值;yk为实际值。
输出节点k的误差梯度定义为该节点的误差值乘以激活函数的导数,即
式中,xk为节点k的输入值的加权和。
因为y被定义为x的Sigmoid函数,所以可以使用上面给出的Sigmoid函数导数的公式来获得误差梯度的公式:
同样,计算隐层中每个节点j的误差梯度,即
式中,n为输出层中的节点数,因此是隐层中每个节点的输出数。
现在,网络中的每个权重wij或wjk都根据以下公式进行更新。
其中,xi为输入节点i的输入值;α为学习率,它是低于1的正数,并且不应太高。
此方法称为梯度下降,因为它涉及沿着表面下降最陡的路径。该路径表示错误函数,以尝试在错误空间中找到最小值,该最小值表示提供网络最优性能的权重集。
事实上,当一个周期中所有训练数据的输出值的误差平方之和小于某个阈值(如0.001)时,反向传播算法的迭代通常是终止的。
注意,此方法通过将附加到每个节点的权重与该节点相关联的错误进行比较,将责任归咎于网络中的各个节点。在隐藏节点的情况下,没有错误值,因为这些节点没有特定的期望输出值。在这种情况下,隐层节点和输出节点之间的每个连接的权重将乘以该输出节点的误差,以尝试根据每个节点对错误的贡献程度在隐层中的节点之间分配责任。
反向传播似乎并未出现在人类大脑中。此外,它相当低效,而且通常太慢,无法用于解决现实问题。对于一些简单的问题,可能需要数百甚至数千个周期才能达到令人满意的低水平误差,所以需要采取措施提高反向传播的性能。
用于改善反向传播性能的常用方法是使用动量修改公式中的权重。该动量考虑了在前一次迭代中特定权重的变化程度,将使用t来表示当前迭代,并使用t-1来表示前一次迭代。因此,可以编写如下的学习规则。
式中,为第t次迭代节点i和j连接权重的变化;β为动量值,取值为0~1,通常使用较高的值,如0.95,如果β为零,那么这与不使用动量的反向传播算法相同。此规则(包括动量值)称为广义Delta规则,包含动量值的好处是使反向传播算法能够避免局部最小值,并且还能够更快地通过误差空间不变的区域。
加速反向传播的另一种方法是使用超双曲正切函数tanh,而不是Sigmoid函数,这使得网络能够在更少的迭代中收敛于解。tanh函数定义为
式中,a和b均为常数,如a = 1.7,b = 0.7。
提高反向传播性能的最后一种方法是在训练网络的过程中改变学习速率α的值。R.A.Jacobs提出的两种启发式方法使用从一个周期到下一个周期的误差平方和的变化方向(增加或减少)来确定学习速率的变化。如果在多个周期内,误差平方的总和在相同方向上改变,则增加学习速率;如果误差平方总和在几个周期内交替改变方向,则降低学习速率。通过将这些启发式方法结合广义Delta规则使用,可以显著地提高反向传播的性能。
3.1.4 无监督学习网络
到目前为止,我们已熟悉了神经网络的有监督学习,即在对未知样本测试之前先要用已知类别标号的训练数据对网络进行训练。下面要介绍的是神经网络的无监督学习,其训练数据无标号类别属性。
1.Kohonen映射
Kohonen映射或自组织特征映射是Kohonen在20世纪80年代提出的一种神经网络模型。Kohonen映射使用winner-take-all算法,这导致一种称为竞争性学习的无监督学习。winner-take-all算法使用以下原则:只有一个神经元产生网络输出能响应给定的输入,这个具有最高激活水平的神经元称为获胜元。在学习过程中,只有与这个获胜元相连接的神经元才可以更新其权重。
Kohonen映射的目的是将输入数据聚类到多个类簇中。例如,Kohonen映射可用于将新闻故事聚类为主题类别。在没有告知映射类别的情况下,Kohonen映射确定了最有用的内在属性划分。因此,Kohonen映射特别适用于类簇数未知的数据聚类。
Kohonen映射有两层:输入层和聚类层,后者用作输出层。每个输入节点连接到聚类层中的每个节点,并且通常聚类层中的节点以网格形式排列,但这不是必须的。
用于训练Kohonen映射的方法如下。最初,所有权重都设置为小的随机值,学习速率α也设定为小的正值。
输入向量呈现给映射的输入层。该层将输入数据提供给聚类层。聚类层中与输入数据最匹配的神经元被宣布为获胜元。该神经元提供映射的输出分类,并且更新其权重。
为了确定哪个神经元获胜,将其权重视为向量,并将该向量与输入向量进行比较。权重向量最接近输入向量的神经元是获胜元。
具有权重wi的神经元与输入向量x的欧氏距离di为
式中,n为输入层中神经元的数量,即输入向量中元素的数量。例如,计算以下两个向量之间的距离。
因此,这两个向量之间的欧氏距离是4。距离值最小的神经元是获胜元,这个神经元的权重向量更新如下。
这种调整使获胜元的权重向量更接近使其获胜的输入向量。
事实上,不仅是获胜元的权重更新,通常还会更新获胜元邻域内的神经元权值。邻域通常定义为获胜元周边二维网格内某个范围内的神经元。
通常,随着训练数据的加载,邻域半径会随着时间的推移而减小,最终固定在较小的值。同样,在训练阶段,学习率通常会降低。
当所有聚类神经元的权重修改变得非常小时,该训练阶段通常终止。此时,网络已从训练数据中提取了一组类簇,其中类似的样本包含在同一类簇中,并且越相似的类簇彼此靠得越近。
2.Kohonen映射示例
下面来看一个Kohonen映射的简化示例。
Kohonen映射只有两个输入和9个类簇神经元,聚类层神经元排列成一个3×3网格结构,如图3-5所示。
图3-5 简单的Kohonen映射的聚类层
图3-5显示了神经元如何排列在网格中。聚类层中的每个节点都与两个输入节点中的每一个相连,聚类层节点彼此不连接。图3-5中的网格不代表物理连接,而代表如空间邻近节点1靠近节点2和4这样的聚集。神经元的这种空间聚集用于确定在训练阶段更新哪些权重的邻域集。
注意,这种方形排列结构不是必须的。节点通常排列在矩形网格中,但其他形状同样可以成功地使用。
因为网络中有两个输入节点,所以可以将每个输入表示为二维空间中的位置。图3-6所示为用于训练此网络的9个输入值。
在图3-6中,x1和x2是要呈现给输入层的两个输入值,它包含两个神经元。
注意:训练数据是从可用空间中随机选择的,这样它们尽可能多地填充空间。以这种方式,数据将尽可能代表所有可用输入数据,因此Kohonen映射将能够最优地聚类输入空间。
图3-6 图3-5所示Kohonen映射的训练数据
因为聚类层中的每个神经元都与两个输入层神经元有连接,所以它们的权重向量可以在二维空间中绘制。这些权重向量最初设置为随机值,如图3-7所示。图3-7中节点之间的连接再次表示空间接近度。
图3-7 Kohonen映射的初始权重向量
由于有9个聚类节点和9个训练数据,因此希望网络将每个神经元分配给一个训练数据。大多数实用的Kohonen映射由更多的神经元组成,通常使用更多的训练数据。
在简单示例中,通过运行Kohonen映射的多次迭代,权重向量将修正为如图3-8所示的排列。
图3-8 训练Kohonen映射后的权重向量
在这种情况下,很容易看出映射的作用:通过修改每个神经元的权重向量,使其非常类似于一个训练矢量,当呈现新的输入数据时,它将归类到权重向量最接近的节点类别。另外,该节点的权重向量将略微移向新的输入数据。通过这种方式,当向其呈现新数据时,网络将继续学习。当呈现新的输入数据时,随着时间的推移,逐步降低学习率,可以迫使网络达到权重不再变化的稳定状态。
这个例子说明了Kohonen映射的自组织性质。图3-8所示的空间填充形状是这些网络行为的典型特征。