1 感知器概念
- 单层感知器属于单层前向网络,即除输入层和输出层之外,只拥有一层神经元节点。前向网络的特点是,**输入数据从输入层经过隐藏层向输出层逐层传播,相邻两层的神经元之间相互连接, 同一层的神经元之间则没有连接。**感知器(perception)是由美国学者 F.Rosenblatt 提出的。
- 与人工神经网络领域中最早提出的MP模型不同, 它的神经元突触权值是可变的,因此可以通过一定规则进行学习。感知器至今仍是一种十分重要的神经网络模型,可以快速、 可靠地解决线性可分的问题。
1.1 单层感知器的结构
- 单层感知器是感知器中最简单的一种,由单个神经元组成的单层感知器只能用来解决线性可分的二分类问题。将其用于两类模式分类时,就相当于在高维样本空间中,用一个超平面将样本分开。
- 单层感知器由一个线性组合器和一个二值阈值元件组成。 输入向量的各个分量先与权值相乘,然后在线性组合器中进行叠加,得到的结果是一个标量。 线性组合器的输出是二值阈值元件的输入,得到的线性组合结果经过一个二值阙值元件由隐含层传送到输出层,实际上这一步执行了一个符号函数。二值阔值元件通常是一个上升的函数, 典型功能是将非负的输入值映射为 1,负的输入值映射为-1或0。
- 考虑一个两类模式分类问题: 输入是一个N维向量x = [x1,x2,x3,…,xn],其中的每一个分量都对应一个权值wi,隐含层的输出叠加为一个标量值:
∑ i = 1 N x i w i \sum_{i=1}^N{x_iw_i} i=1∑Nxiwi - 随后在二值阈值元件中对得到的v值进行判断,产生二值输出:
y = { 1 v ≥ 0 − 1 z < 0 y=\begin{cases} 1 & v\geq0 \\ -1 & z<0 \\ \end{cases} y={1−1v≥0z<0
-
单层感知器可以将输入数据分为两类:l1或l2。当y=1时,认为输入的xk来源于l1;当y=-1时认为输入xk属于l2。
-
除了N维向量外,还有一个外部偏置,值恒为1,权值为b,结果图如4-1所示。
-
输出y可以表示为
s g n ( ∑ i = 1 N x i w i + b ) sgn(\sum_{i=1}^N{x_iw_i+b}) sgn(i=1∑Nxiwi+b) -
单层感知器进行模式识别的超平面由下式决定:
∑ i = 1 N x i w i + b = 0 \sum_{i=1}^N{x_iw_i+b}=0 i=1∑Nxiwi+b=0 -
当维度数N=2时,输入项两科表示为平面直角坐标系中的一个点。此时分类超平面是一条直线:
w 1 x 1 + w 2 x 2 + b = 0 w_1x_1+w_2x_2+b=0 w1x1+w2x2+b=0 -
假设有三个点,分为两类,第一类包括点(3,0)和(4,-1),第二类包括点(0,2.5)。选择权值为w1=2,w2=-3,b=1,平面上坐标点的分类情况如图所示:
-
二维空间中的超平面是一条直线。在直线下方的点,输出v>0,因此y=1属于l1类;在直线上方的点,输出v<0,因此y=-1,属于l2类。
1.2 单层感知器的学习算法
-
方便起见,修改单层感知器的结构图如图4-3所示,将偏置作为固定输入。定义(N+1)*1的输入向量:
x ( n ) = [ + 1 , x 1 ( n ) , x 2 ( n ) , . . . , x N ( n ) ] T x(n)=[+1,x_1(n),x_2(n),...,x_N(n)]^T x(n)=[+1,x1(n),x2(n),...,xN(n)]T -
这里的n表示迭代次数。相应的,定义(N+1)*1权值向量:
w ( n ) = [ b ( n ) , w 1 ( n ) , w 2 ( n ) , . . . w N ( n ) ] T w(n)=[b(n),w_1(n),w_2(n),...w_N(n)]^T w(n)=[b(n),w1(n),w2(n),...wN(n)]T
-
因此线性组合器的输出为
v ( n ) = ∑ i = 0 N w i x i = w T ( n ) x ( n ) v(n)=\sum_{i=0}^Nw_ix_i=w^T(n)x(n) v(n)=i=0∑Nwixi=wT(n)x(n) -
令上式等于零,即得二分类问题的决策面。
-
学习算法步骤如下:
(1) 定义变量和参数。
- x(n) = N+1维输入向量
= [ + 1 , x 1 ( n ) , x 2 ( n ) , . . . , x N ( n ) ] T =[+1,x_1(n),x_2(n),...,x_N(n)]^T =[+1,x1(n),x2(n),...,xN(n)]T - w(n) = N+1维权值向量
= [ b ( n ) , w 1 ( n ) , w 2 ( n ) , . . . , w N ( n ) ] T =[b(n),w_1(n),w_2(n),...,w_N(n)]^T =[b(n),w1(n),w2(n),...,wN(n)]T - b(n) = 编置
- y(n) = 实际输出
- d(n) = 期望输出
- η = 学习率参数,是一个比1小的正数
(2)初始化。n=0,将权值向量w设置为随机值或者全零值。
(3)激活。输入训练样本,对每个训练样本 x ( n ) = [ + 1 , x 1 ( n ) , x 2 ( n ) , . . . , x N ( n ) ] T x(n)=[+1,x_1(n),x_2(n),...,x_N(n)]^T x(n)=[+1,x1(n),x2(n),...,xN(n)]T
(4)计算实际输出 y ( n ) = s g n ( w T ( n ) x ( n ) ) y(n) = sgn(w^T(n)x(n)) y(n)=sgn(wT(n)x(n))
(5)更新权值向量 w ( n + 1 ) = w ( n ) + η [ d ( n ) − y ( n ) ] x ( n ) w(n+1)=w(n)+η[d(n)-y(n)]x(n) w(n+1)=w(n)+η[d(n)−y(n)]x(n)
这里:
d ( n ) = { + 1 x ( n ) ⊂ l 1 − 1 x ( n ) ⊂ l 2 0 < η < 1 d(n)=\begin{cases} +1 & x(n)\subset l_1 \\ -1 & x(n)\subset l_2\\ \end{cases}\\0<η<1 d(n)={+1−1x(n)⊂l1x(n)⊂l20<η<1
(6)判断。若满足收敛条件,则算法结束;若不满足,则n自增1(n+=1),转到第3步继续执行。
那么,收敛条件是什么呢?当权值向量w已经能正确实现分类时,算法就收敛了,此时网络的误差为0.在计算时,收敛条件通常可以是: - x(n) = N+1维输入向量
-
误差小于某个预先设定的较小ε。即 ∣ ( d ( n ) − y ( n ) ) < ε ∣ \left|(d(n)-y(n))<ε\right| ∣(d(n)−y(n))<ε∣
-
两次迭代之间的权值变化已经很小,即 ∣ ( w ( n + 1 ) − w ( n ) < ε ∣ \left|(w(n+1)-w(n)<ε\right| ∣(w(n+1)−w(n)<ε∣
-
设定最大迭代次数为M,当迭代了M次后算法自动停止迭代。
-
为避免偶然收敛,可以要求多次满足收敛误差才停止迭代。
-
另一个需要通过经验事先确定的参数是学习率η。η的值决定了误差对权值的影响大小:
- η不应当过大,以便为输入向量提供一个比较稳定的权值估计。
- η不应当过小,以便使权值能够根据输入的向量x实时变化, 体现误差对权值的修正作用。
- 注意,我们在调整学习率的时候可以把学习率想象成显微镜的准焦螺旋,**如果只用粗准焦螺旋,调节效率很高,但可能永远也调整不到合适的对焦范围;如果只用细准焦螺旋,调节效率高,但调节的时间可能非常久,最好的方式是先调节粗准焦螺旋到合适的位置,再调节细准焦螺旋。(这个例子非常重要)**对于学习率,也同样是如此,先选择大步长,再选择小步长,使参数按照一定规律变化,对于迭代的收敛有非常好的帮助。
-
单层感知器并不对所有二分类问题收敛,它只对线性可分的问题收敛,即可通过学习, 调整权值, 最终找到合适的决策面, 实现正确分类。对于线性不可分的问题, 单层感知器 的学习算法是不收敛的, 无法实现正确分类, 如图4-4和图4-5所示。
1.4 单层感知器的局限
- 感知器的激活函数使用阐值函数, 使得输出只能取两个值(1/-1 或0/1),这样就限制了在分类种类上的扩展。
- 感知器网络只对线性可分的问题收敛,这是最致命的一个缺陷。根据感知器收敛定理,只要输入向量是线性可分的,感知器总能在有限的时间内收敛。若问题不可分,则感知器无能为力。
- 如果输入样本存在奇异样本, 则网络需要花费很长的时间。奇异样本就是数值上 远远偏离其他样本的数据。例如以下样本: x ( n ) = [ 1 , − 1 , 2 , − 100 ; 0 , − 1 , 0.5 , 200 ] x(n)=[1,-1,2,-100;0,-1,0.5,200] x(n)=[1,−1,2,−100;0,−1,0.5,200]
- 每列是一个输入向量。前三个样本数值上都比较小,第四个样本数据则特别大,远远偏离其他数据点,这种情况下,感知器虽然也能收敛,但需要更长的训练时间。
- 感知器的学习算法只对单层有效,因此无法直接套用其规则设计多层感知器。
1.4 单层感知器相关函数详解
MATLAB神经网络工具箱中用于单层感知器设计最重要的函数是newp、train 和sim, 分别用来设计、训练和仿真。涉及的其他函数还有init、adapt、mae、hardlim、learnp 等,本节将选择部分比较重要的函数加以介绍。
1.4.1 newp-创建一个感知器
函数语法如下:
net=newp(P,T,TF,LF)
newp函数用于生成一个感知神经网络,以解决线性可分的分类问题。后两个输入参数是可选的,如果采用默认值,可以简单地才用net=newp(P,T)的形式来调用。
- P:P是一个R*2矩阵,矩阵的行数R等于感知器网络中输入向量的维度。矩阵每一行表示输入向量每个分量的取值范围。如
P=[-1,1:0,1]
,表示输入向量是2维向量[x1,x2],且-1≤x1≤1,0≤x2≤1。因此,矩阵R的第二列数字必须大于等于第一列数字,否则系统将会报错。 - T:表示输出节点的个数,标量。
- TF:传输函数,可取值为hardlim或hardlims,默认值为hardlim。
- net:函数返回创建好的感知器网络。
newp函数创建的感知器如图4-6所示,网络拥有R个输入节点,T个输出节点。
- learnpn函数与pearnp函数区别在于,learnpn对输入量大小变化比learnp不敏感。当输入的向量在数值的幅度上变化比较大时,使用learnpn代替learnp,可以加快计算速度。
- 用newrb函数创建一个感知器,并进行训练仿真。
·>> p=[-1,1;-1,1] %输入向量有两个分量,两个分量取值范围均为-1~1
p =
-1 1
-1 1
>> t = 1; %共有一个输出节点
>> net(p,t) %创建感知器
未定义函数或变量 'net'。
>> p=[-1,1;-1,1] % 输入向量有两个分量,两个分量取值范围均为-1~1
p =
-1 1
-1 1
>> t=1; % 共有1个输出节点
net=newp(p,t); % 创建感知器
P=[0,0,1,1;0,1,0,1] % 用于训练的输入数据,每列是一个输入向量
P =
0 0 1 1
0 1 0 1
>> T=[0,1,1,1] % 输入数据的期望输出
T =
0 1 1 1
>> net=train(net,P,T); % train函数用于训练
>> newP=[0,0.9]'; % 第一个测试数据
>> newT=sim(net,newP) % 第一个测试数据的输出为0
newT =
0
>> newP=[0.9,0.9]'; % 第二个测试数据
>> newT=sim(net,newP) % 第二个测试数据的输出为1
newT =
1
>> newT=sim(net,P) % 用原训练数据做测试,实际输出等于期望输出
newT =
0 1 1 1
>>
训练结果如图所示,我们可以看到,创建的感知器网络有两个输入节点,一个输出节点。
1.4.2 train——训练感知网络 P111
用于训练创建好的感知器网络,语法如下:
[net,tr] = train(net,P,T,Pi,Ai)
样例
% example4_2.m
p=[-100,100] % 输入数据是标量,取值范围-100~100
% p =
%
% -100 100
t=1 % 网络含有一个输出节点
% t =
%
% 1
net=newp(p,t); % 创建一个感知器
P=[-5,-4,-3,-2,-1,0,1,2,3,4] % 训练输入
% P =
%
% -5 -4 -3 -2 -1 0 1 2 3 4
T=[0,0,0,0,0,1,1,1,1,1] % 训练输出,负数输出0,非负数输出1
% T =
%
% 0 0 0 0 0 1 1 1 1 1
net=train(net,P,T); % 用train’进行训练
newP=-10:.2:10; % 测试输入
newT=sim(net,newP); % 测试输入的实际输出
plot(newP,newT,'LineWidth',3);
title('判断数字符号的感知器');
训练结果
4.4.3 sim——对训练好的网络进行仿真 P113
用于仿真一个神经网络。函数的语法格式如下:
[Y,Pf,Af] = sim(net,P,Pi,Ai)
[Y,Pf,Af,E,perf] = sim(...)
4.4.4 hardlim/hardlims——感知器传输函数
- hardlim和hardlims都是感知器的传输函数,其功能类似于数学上的符号函数。
s g n ( x ) = { 1 v > 0 0 v = 0 − 1 v < 0 sgn(x)=\begin{cases} 1 & v>0 \\ 0 & v=0 \\ -1 & v<0 \end{cases} sgn(x)=⎩⎪⎨⎪⎧10−1v>0v=0v<0 -
A=hardlim(N,FP)
或A=hardlims(N,FP)
-
dA_dN=hardlim('dn',N,A,FP)
或dA_dN=hardlim('dn',N,A,FP)
1.4.5 init——神经网络初始化函数
net = init(net)
1.4.6 adapt——神经网络的自适应
[net,Y,E,Pf,Af,tr] = adapt(net,P,T,Pi,Ai)
1.4.7 mae——平均绝对误差性能函数
perf=mea(E)