主要内容

感知器神经网络

Rosenblatt [Rose61的许多变体感知器。其中最简单的一种是单层网络,它的权重和偏差可以经过训练,在给出相应的输入向量时产生正确的目标向量。这种训练方法被称为感知器学习规则。由于感知器能够从其训练向量中泛化,并从最初随机分布的连接中学习,因此它引起了极大的兴趣。感知器特别适用于模式分类中的简单问题。对于它们所能解决的问题,它们是快速而可靠的网络。此外,理解感知器的操作为理解更复杂的网络提供了良好的基础。

本节对感知机的讨论必然是简短的。有关更深入的讨论,请参阅[的第4章,“感知器学习规则”HDB1996],它讨论了使用多层感知器来解决超出一层能力的更困难的问题。

神经元模型

一个感知器神经元,它使用硬极限传递函数hardlim,如下所示。

每个外部输入都有适当的权重w1 j,加权输入的和被发送给硬极限传递函数,硬极限传递函数也有一个输入1通过偏置传输给它。返回0或1的硬限制传递函数如下所示。

如果传递函数的净输入等于或大于0,感知器神经元产生1;否则结果是0。

硬极限传递函数使感知器能够将输入空间划分为两个区域,对输入向量进行分类。具体来说,如果净输入为0,则输出为0n小于0,如果净输入小于1n为0或更大。下图显示了带权值的双输入硬极限神经元的输入空间w1, - 1=−1,w1、2= 1和偏差b= 1。

两个分类区域由决定边界L线在
Wp+b= 0。这条线垂直于权重矩阵W并根据偏置进行位移b.线L上方和左侧的输入向量将导致净输入大于0,因此导致硬限制神经元输出1。在直线L下方和右侧的输入向量导致神经元输出为0。您可以选择权重和偏置值来定位和移动分割线,以便根据需要对输入空间进行分类。

没有偏倚的硬极限神经元总是有一条穿过原点的分类线。添加偏置可以让神经元解决两组输入向量不位于原点两侧的问题。偏差允许决策边界偏离原点,如上图所示。

您可能想要运行示例程序nnd4db.有了它,您可以移动决策边界,选择新的输入进行分类,并查看重复应用学习规则如何产生正确分类输入向量的网络。

感知器架构

感知器网络由单层的年代感知器神经元连接R通过一组权重进行输入w我,我,如下图所示为两种形式。和前面一样,网络索引而且j表明,w我,我是力量的联系从何而来j的Th输入神经元。

简短描述的感知器学习规则只能训练单层。因此这里只考虑一层网络。这个限制限制了感知器可以执行的计算。中讨论了感知器能够解决的问题类型限制和注意事项

创建一个感知机

你可以用以下方法创建一个感知器:

网络=感知器;net =配置(net,P,T);

其中输入参数如下:

  • P是由R个元素的Q个输入向量组成的R × Q矩阵。

  • T是由每个S个元素的Q个目标向量组成的S × Q矩阵。

通常,hardlim函数用于感知器,因此它是默认值。

下面的命令创建一个感知器网络,它有一个单元素输入向量,值为0和2,一个神经元的输出可以是0或1:

P = [0 2];T = [0 1];网络=感知器;net =配置(net,P,T);

可以通过执行以下命令查看已创建的网络:

inputwights = net. inputwights {1,1}

的收益率

inputwights =时延:0 initFcn: 'initzero' learn: true learnFcn: 'learnp' learnParam: (none) size: [1 1] weightFcn: 'dotprod' weightParam: (none) userdata:(您的自定义信息)

缺省情况下,学习功能为learnp,在感知器学习规则(learnp).的净输入hardlim传递函数为dotprod,生成输入向量与权重矩阵的乘积,并加上偏置,计算净输入。

默认初始化函数initzero用于将权重的初始值设置为零。

同样的,

偏差= net.偏差{1}

给了

偏差= initFcn: 'initzero' learn: 1 learnFcn: 'learnp' learnParam: [] size: 1 userdata: [1x1 struct]

您可以看到偏差的默认初始化也是0。

感知器学习规则(learnp)

感知器是根据期望行为的例子进行训练的。所需的行为可以由一组输入、输出对进行总结

p 1 t 1 p 2 t 1 ... p t

在哪里p是网络的输入和t对应的正确(目标)输出。目标是减少误差e,这就是区别t一个神经元之间的反应一个而目标向量t.的感知器学习规则learnp在给定输入向量的情况下,计算感知器权重和偏差的期望变化p以及相关的误差e.目标向量t必须包含0或1的值,因为感知器(带hardlim传递函数)只能输出这些值。

每一次learnp执行时,感知器有更好的机会产生正确的输出。如果一个解存在,感知器规则被证明在有限次迭代中收敛于一个解。

如果不使用偏置,learnp仅通过改变权重向量来找到解决方案w指向分类为1的输入向量,远离分类为0的向量。这将导致决策边界垂直于w这样就对输入向量进行了恰当的分类。

对于单个神经元,一旦成为输入向量,就会出现三种情况p呈现和网络的响应一个计算:

案例1。如果给出了输入向量,并且神经元的输出是正确的(一个t而且et- - - - - -一个= 0),则为权向量w没有改变。

例2。如果神经元输出为0,并且应该为1 (一个= 0和t= 1, andet- - - - - -一个= 1),为输入向量p加到权向量上w.这使得权重向量更接近输入向量,增加了输入向量在未来被分类为1的机会。

例3。如果神经元输出为1,并且本应为0 (一个= 1和t= 0,和et- - - - - -一个= -1),输入向量p从权向量中减去w.这使得权重向量的点离输入向量更远,增加了输入向量在未来被分类为0的机会。

感知器学习规则可以更简洁地写成误差的形式et- - - - - -一个以及对权重向量Δ的更改w

案例1。如果e= 0,然后进行更改Δw等于0。

例2。如果e= 1,然后进行更改Δw等于pT

例3。如果e= -1,然后进行更改Δw等于-pT

这三种情况都可以用一个表达式来写:

Δ w t α p T e p T

你可以通过注意偏差只是一个输入总是为1的权重来得到神经元偏差变化的表达式:

Δ b t α 1 e

以神经元层为例

Δ W t 一个 p T e p T

而且

Δ b t 一个 e

感知器学习规则可以总结为:

W n e w W o l d + e p T

而且

b n e w b o l d + e

在哪里et- - - - - -一个

现在试试一个简单的例子。从一个只有两个元素的输入向量的单个神经元开始。

网络=感知器;Net =配置(Net,[0;0],0);

为了简化问题,将偏差设置为0,权重设置为1和-0.8:

网b{1}=[0]; w = [1 -0.8]; net.IW{1,1} = w;

输入目标对由

P = [1;2);T = [1];

可以使用

A =净(p) A = 0 e = t-a e = 1

然后使用函数learnp求权重的变化量。

dw = learnp (w, p ,[],[],[],[], e ,[],[],[],[],[]) dw = 1 2

那么,得到的新权重为

W = W + dw W = 2.000 1.2000

可以重复寻找新的权重(和偏差)的过程,直到没有错误为止。回忆一下,对于感知器可以解决的所有问题,感知器学习规则保证在有限步数内收敛。这包括所有线性可分的分类问题。在这种情况下,需要分类的对象可以用单行分隔。

你可能想试试这个例子nnd4pr.它允许您选择新的输入向量并应用学习规则对它们进行分类。

培训(培训)

如果sim卡而且learnp被反复用于向感知机呈现输入,并根据误差改变感知机的权重和偏差,感知机最终会找到解决问题的权重和偏差值,假设感知机可以解决它。对所有训练输入和目标向量的遍历称为a通过

这个函数火车执行这样一个循环的计算。在每个传递函数中火车通过指定的输入序列,计算输入序列中每个输入向量的输出、误差和网络调整。

请注意,火车并不能保证生成的网络能够正常工作。的新值W而且b通过计算每个输入向量的网络输出,看看是否达到了所有目标。如果一个网络不能成功运行,你可以通过调用来进一步训练它火车再次使用新的权重和偏差进行更多的训练,或者你可以分析这个问题,看看它是否适合感知器。文中讨论了感知器网络不能解决的问题限制和注意事项

为了说明训练过程,先做一个简单的问题。考虑一个单神经元感知器,其输入向量有两个元素:

这个网络和您将要考虑的问题非常简单,如果您愿意,您可以通过手工计算来完成。下面讨论的问题是在[HDB1996]。

假设你有以下分类问题,并想用一个单向量输入,两元感知器网络来解决它。

p 1 2 2 t 1 0 p 2 1 2 t 2 1 p 3. 2 2 t 3. 0 p 4 1 1 t 4 1

使用初始权重和偏差。在此计算的每一步中,在变量后使用括号内的数字表示变量。因此,上面的初值为W(0)和b(0)。

W 0 0 0 b 0 0

首先计算感知器的输出一个对于第一个输入向量p1,使用初始权值和偏差。

α h 一个 r d l W 0 p 1 + b 0 h 一个 r d l 0 0 2 2 + 0 h 一个 r d l 0 1

输出一个不等于目标值t1,因此使用感知器规则来找到基于误差的权重和偏差的增量变化。

e t 1 α 0 1 1 Δ W e p 1 T 1 2 2 2 2 Δ b e 1 1

您可以使用感知器更新规则计算新的权重和偏差。

W n e w W o l d + e p T 0 0 + 2 2 2 2 W 1 b n e w b o l d + e 0 + 1 1 b 1

现在展示下一个输入向量,p2.输出计算如下。

α h 一个 r d l W 1 p 2 + b 1 h 一个 r d l 2 2 1 2 1 h 一个 r d l 1 1

在这种情况下,目标为1,因此误差为零。因此权重或偏差没有变化,所以W(2) =W(1) =[−2−2]和b(2) =b(1) =−1。

你可以继续这种方式,呈现p3.接下来,计算输出和误差,并更改权重和偏差等。在通过所有四个输入后,您将得到这些值W(4) =[−3−1]和b(4) = 0。为了确定是否得到一个满意的解决方案,对所有输入向量进行一次遍历,看看它们是否都产生了所需的目标值。第四个输入不是这样,但算法确实收敛于输入的第六个表示。最终值为

W(6) =[−2−3]和b(6) = 1。

手算结束了。现在,你如何使用火车函数?

下面的代码定义了一个感知器。

网络=感知器;

考虑单个输入的应用程序

P = [2;2);

有目标

T = [0];

时代到1,所以火车遍历输入向量(这里只有一个)只有一次。

net.trainParam.epochs = 1;Net = train(Net,p,t);

新的权重和偏差是

W = net。我w{1, - 1},b=网b{1}w=-2 -2 b = -1

因此,初始权重和偏差为0,在仅对第一个向量进行训练后,它们的值为[−2−2]和−1,正如您手工计算的那样。

现在应用第二个输入向量p2.输出是1,直到权重和偏差被改变,它将是1,但现在目标是1,误差将是0,变化将是0。您可以以这种方式继续,从前面的结果开始,一次又一次地应用一个新的输入向量。但是你可以自动地做这个工作火车

应用火车对于一个epoch,对所有四个输入向量的序列进行一次遍历。从网络定义开始。

网络=感知器;net.trainParam.epochs = 1;

输入向量和目标是

P = [[2;2] [1;-2] [-2;2] [-1;1]] t = [0 1 0 1]

现在用

Net = train(Net,p,t);

新的权重和偏差是

W = net。我w{1, - 1},b=网b{1}w=-3 -1 b = 0

这和之前手工得到的结果是一样的。

最后,模拟每个输入的训练网络。

A = net(p) A = 0 0 1 1

输出还不等于目标,因此需要训练网络进行多次传递。尝试更多的时代。这个运行给出了两个epoch后的平均绝对误差性能为0:

net.trainParam.epochs = 1000;Net = train(Net,p,t);

因此,在第三纪元输入时,该网络已被训练完毕。(正如你从手工计算中知道的,网络收敛于第六个输入向量的表示。这发生在第二epoch的中间,但需要第三epoch来检测网络收敛。)最终的权重和偏差为

W = net。我w{1, - 1},b=网b{1}w=-2 -3 b = 1

各种输入的模拟输出和误差如下

A = net(p) A = 0 1 0 1 error = A -t error = 0 0 0 0 0

您确认培训过程成功。该网络收敛并为四个输入向量产生正确的目标输出。

用于创建网络的默认训练功能感知器trainc.(您可以通过执行net.trainFcn)。该训练函数以其纯粹的形式应用感知器学习规则,其中单个输入向量按顺序单独应用,并且在每次输入向量表示后对权重和偏差进行修正。因此,感知器训练与火车将在有限步数内收敛,除非所提出的问题不能用简单的感知器解决。

这个函数火车也可以被其他网络以各种方式使用。类型帮助培训要了解更多关于这个基本函数的信息。

您可能想要尝试各种示例程序。例如,用双输入感知器进行分类说明了一个简单感知器的分类和训练。

限制和注意事项

感知器网络应该训练适应,每次向网络呈现一个输入向量,并根据每次呈现的结果对网络进行修正。使用适应这样可以保证在有限次的训练演示中解决任何线性可分问题。

如前文所述,感知器也可以用该函数进行训练火车.通常当火车用于感知器,它将输入批量地呈现给网络,并基于所有单独修正的总和对网络进行修正。不幸的是,没有证据证明这样的训练算法收敛于感知器。在那方面的使用火车对于感知器不推荐使用。

感知器网络有几个局限性。首先,由于硬限制传递函数,感知器的输出值只能取两个值中的一个(0或1)。第二,感知器只能对线性可分的向量集进行分类。如果可以画一条直线或一个平面来将输入向量划分为正确的类别,则输入向量是线性可分的。如果向量不是线性可分的,学习将永远不会达到所有向量都被正确分类的地步。然而,已经证明,如果向量是线性可分的,自适应训练的感知器总是会在有限时间内找到一个解。你可能想试试线性不可分向量.它显示了对不可线性可分的输入向量进行分类的难度。

然而,公平地说,具有多个感知器的网络可以用来解决更困难的问题。例如,假设您有一个由四个向量组成的集合,您想将它们分为不同的组,并且可以画两条线将它们分开。可以找到一个双神经元网络,它的两个决策边界将输入分为四类。有关感知器的其他讨论和检查更复杂的感知器问题,请参见[HDB1996]。

异常值和归一化感知器规则

长时间的训练可能是由一个离群值长度远远大于或小于其他输入向量的输入向量。应用感知器学习规则涉及从当前权重和偏差中添加和减去输入向量以响应错误。因此,具有大元素的输入向量可能会导致权重和偏差的变化,而小得多的输入向量需要很长时间才能克服这些变化。你可能想试试离群输入向量看看异常值是如何影响训练的。

通过稍微改变感知器学习规则,可以使训练时间对极大或极小的异常值输入向量不敏感。

下面是更新权重的原始规则:

Δ w t α p T e p T

如上所示,输入向量越大p,其对权向量的影响越大w.因此,如果一个输入向量比其他输入向量大得多,那么较小的输入向量必须出现多次才能产生效果。

解决方案是将规则规范化,使每个输入向量对权重的影响具有相同的大小:

Δ w t α p T p e p T p

用该函数实现了规范化感知器规则learnpn,这被称为完全一样learnp.规范化感知器规则函数learnpn执行时间稍长,但如果有异常输入向量,则大大减少了epoch的数量。你可以试试归一化感知器规则看看这个规范化训练规则是如何工作的。