单层感知机模型及其学习算法

目录

 一、什么是感知机?

二、单层感知机模型

三、感知机的学习策略

四、感知机的学习算法


 一、什么是感知机?

        1958年,美国心理学家Frank Rosenblatt提出一种具有单层计算单元的神经网络,称为感知机(Perceptron)。感知机模拟人的视觉接受环境的信息,并利用神经元之间的连接进行信息传递。在感知机的研究中首次提出自组织、自学习的思想,而且对所能解决的问题存在着收敛算法,即在数学上能严格证明有效,因而对神经网络的研究起了重要的推动作用。

        由于单层感知机的结构和功能都非常的简单,以至于目前在解决实际问题时很少被采用,但是由于它在神经网络研究中具有重要的意义,是研究其他深度网络的基础,所以理解单层感知机的原理是必要的。

二、单层感知机模型

单个人工神经元模型(M-P模型):

 多输出节点的单层感知机:

        单层感知机只有一层处理单元,结构如上图所示。

        图中左侧为输入层,也称为感知层,有n个神经元节点,这些节点只负责引入外部信息,自身不进行信息的处理。每个神经元节点接受一个输入信号x_ii=1,2,3…n),n个输入信号构成输入列向量X:

X = (x_1,x_2,\cdots,x_j,\cdots,x_n)^T

        图中右侧为输出层,也称为处理层,有m个神经元节点。每个节点均具有信息处理能力,m个节点向外输出处理过的信息构成输出列向量O

O = (o_1,o_2,\cdots,o_i,\cdots,o_m)^T

        对于输出层来讲,用W_i表示输出层i个神经元的权值列向量,其中i = 1,2,\cdots,m

W_i = (w_i_1,w_i_2,w_i_j,\cdots,w_i_n)^T

        m个权值列向量又构成了感知机的权值矩阵W_i_j 

W_i_j = \begin{matrix} w_1_1 & w_1_2 & \cdots & w_1_n \\ w_2_1 & w_2_2 & \cdots & w_2_n \\ \vdots &\vdots &\vdots &\vdots \\ w_m_1 & w_m_2 & \cdots & w_m_n \end{}

        其中元素为w_i_j,表示输入层第j个神经元到输出层第i的神经元的权值。

        (i表示下一层即输出层的第i个神经元,j表示上一层即输入层的第j个神经元。)

        由M-P模型可知,对于输出层的任意一神经元节点i,其输入u_i = \sum_{j=1}^nw_i_jx_jb_i为神经元i的阈值,净输入为u_i-b_i,激励函数为符号函数f(x)=sgn(x)=\left\{ \begin{aligned} +1,x\ge0 \\ -1,x<0 \end{aligned} \right.。则输出神经元i的输出o_i表示为:

o_i=sgn(u_i-b_i)=sgn(\sum_{j=1}^nw_i_jx_j-b_i)=sgn(W^{T}_iX-b_i)=\left\{ \begin{aligned} +1,W^{T}_iX-b_i\ge0 \\ -1,W^{T}_iX-b_i<0 \end{aligned} \right.

        在计算神经元i的输出时,实际为一个M-P模型,其中输入向量X = (x_1,x_2,\cdots,x_j,\cdots,x_n)^T,权值向量W_i = (w_i_1,w_i_2,w_i_j,\cdots,w_i_n)^T,则W^{T}_iX-b_i=0展开写成标量形式为:

w_i_1x_1+w_i_2x_2+\cdots+w_i_nx_n-b_i = 0

 这在几何意义上实则为一个n维超平面的一般方程,W^{T}_i为超平面的法向量,b_i为超平面的截距。此n维超平面可以将n维空间分为两个部分,也即可以将输入的样本分为两类。


        关于以上几何意义说法的简要证明:

        因为过空间一点可以作而且只能作一平面垂直于一已知直线,所以当平面\prod上一点M_0(x_0,y_0,z_0)和它的一个法线向量\bold n = (A,B,C)为已知时,平面\prod的位置就完全确定了。由此我们可以建立平面\prod的方程:

        设M(x,y,z)是平面\prod上的任意一点,M_0(x_0,y_0,z_0)为平面上已知一点,则向量\overrightarrow{MM_0}必然与平面的法线向量\bold n垂直,即数量积等于零:

\bold n \cdot \overrightarrow{MM_0}=0

因为\bold n = (A,B,C)\overrightarrow{MM_0}=(x-x_0,y-y_0,z-z_0),所以有:

A(x-x_0)+B(y-y_0)+C(z-z_0)=0

此方程是由平面上已知一点M_0(x_0,y_0,z_0)和该平面的法线向量\bold n = (A,B,C)确定的,所以该方程叫做平面的点法式方程。

        由上可知,平面的点法式方程是x,y,z的一次方程,而任意一平面都可以用它上面的一点及法线向量来确定,所以任一平面都可以用三元一次方程来表示。设有一般三元一次方程:

Ax+By+Cz+D=0\qquad(1)

任取满足该方程的一组数x_0,y_0,z_0,即

Ax_0+By_0+Cz_0+D=0\qquad(2)

上述两式相减,得

A(x-x_0)+B(y-y_0)+C(z-z_0)=0\qquad(3)

方程(3)和上面的点法式方程作比较,可知方程(3)即为点法式方程,而方程(3)又和方程(1)经过加减已知的(2)可以互相得到,所以方程(1)(3)是同解方程。由此可知,任一三元一次方程的图形总是一个平面,而其中x,y,z的系数就是该平面的法线向量\bold n,即\bold n = (A,B,C)

        上述的证明限制在三维空间中,可以用三元一次方程表示。而在上述列向量X所确定的n维空间中,亦可以用x_1,x_2,\cdots,x_j,\cdots,x_n的n元一次方程确定一个n维超平面:

w_i_1x_1+w_i_2x_2+\cdots+w_i_nx_n-b_i = 0

同理,变量的系数就是该超平面的法向量W^{T}_i=(w_i_1,w_i_2,w_i_j,\cdots,w_i_n)


        上述的证明可以更好的从几何的意义上理解单层感知机具有分类能力,且只能解决线性的二分类问题。

三、感知机的学习策略

        假设训练数据集是线性可分的,感知机的学习目标就是确定一个能够将训练集正实例点和负实例点完全分离的超平面,也就是将训练集的输入W^{T}_iX-b_i正确地分类到+1和-1两个类别中。

o_i=sgn(\sum_{j=1}^nw_i_jx_j-b_i)=sgn(W^{T}_iX-b_i)=\left\{ \begin{aligned} +1,W^{T}_iX-b_i\ge0 \\ -1,W^{T}_iX-b_i<0 \end{aligned} \right.

所以需要确定感知机的参数:权值向量W_i = (w_i_1,w_i_2,w_i_j,\cdots,w_i_n)^T和阈值b_i(几何意义上的超平面截距)和定义一个损失函数(loss function)并将损失函数极小化。

        分类问题损失函数的确定的一个自然想法是:误分类点的个数。使误分类点的个数达到最少即完成了感知机的分类目标。但是这样的损失函数是离散的,并不是参数W_ib_i的连续可导函数,所以不易进行优化求取极小值。

        另一个损失函数选择是:误分类点到超平面的总距离。(因为可能有多个被误分类的点,所以这里的“总”指的是它们的距离之和。)误分类点到超平面的总距离越小,即代表被误分类的点越少。这是感知机所采用的损失函数。

        在三维空间中,点M_0(x_0,y_0,z_0)到平面Ax+By+Cz+D=0的距离表示为:

d = \frac{\mid Ax_0+By_0+Cz_0+D \mid}{\sqrt{A^2+B^2+C^2}}

这里不再给出点到平面的距离公式证明。同理,将此距离公式推广到n维空间,则n维空间中样本点X(x_1,x_2,\cdots,x_n)到超平面w_i_1x_1+w_i_2x_2+\cdots+w_i_nx_n-b_i = 0的距离为:

\frac{\mid w_i_1x_1+w_i_2x_2+\cdots+w_i_nx_n-b_i \mid}{\sqrt{w_i_1^2+w_i_1^2+\cdots+w_i_n^2}}=\frac{1}{\mid\mid W^{T}_i \mid\mid}\mid W^{T}_iX-b_i \mid

这里的X就等价于模型的输入向量。其中\mid\mid W^{T}_i \mid\mid为权值向量W^{T}_iL_2范数,即向量的模长。

对于模型的输入W^{T}_iX-b_i,输出为:

sgn(W^{T}_iX-b_i)=\left\{ \begin{aligned} +1,W^{T}_iX-b_i\ge0 \\ -1,W^{T}_iX-b_i<0 \end{aligned} \right.

激励函数(即符号函数)会将输入映射为两类输出标签,即输出

y_i=\left\{ \begin{aligned} +1,W^{T}_iX-b_i\ge0 \\ -1,W^{T}_iX-b_i<0 \end{aligned} \right.

对于误分类数据来说,输入W^{T}_iX-b_i \geq0结果被分到-1标签,即y_i=-1;输入W^{T}_iX-b_i <0,结果却被分到+1标签,即y_i = +1。那么有以下式子恒成立:

-y_i(W_i^TX-b_i)>0

那么根据以上分析,误分类的样本点到超平面的距离是:

-\frac{1}{\mid\mid W^{T}_i \mid\mid}y_i\mid W^{T}_iX-b_i \mid

设误分类样本点集合为M,且不考虑\frac{1}{\mid\mid W^{T}_i \mid\mid},就得到了感知机的损失函数

\bold {L(W_i^T,b_i)=-\sum_{X\in M}y_i(W_i^TX-b_i)}

显然,损失函数是非负的。没有误分类点是损失函数是零。有误分类点时,误分类点越少,误分类点离超平面越近,损失函数的值就越小。

四、感知机的学习算法

        感知机的学习问题就是求解损失函数的最优化问题,方法是随机梯度下降法。首先求出损失函数L(W_i^T,b_i)的梯度:

\nabla_w L(W_i^T,b_i) = -\sum_{X\in M}y_iX

\nabla_b L(W_i^T,b_i) = \sum_{X\in M}y_i

再随机选取一个误分类点(X_i,y_i),用t表示迭代次数,\eta表示学习率,对W_i^Tb_i进行迭代更新:

\bold{W_i^T(t+1) = W_i^T(t)+\eta y_iX_i}

\bold{b_i(t+1) = b_i(t)-\eta y_i}

        这种学习算法几何上的直观解释为:当一个样本点被误分类时,即位于超平面的错误一侧时,则根据上式迭代调整W_i^Tb_i,使超平面向该误分类点的一侧移动,以减少误分类点和超平面的距离,直至迭代到合适的W_i^Tb_i使得超平面越过该误分类点使其被正确分类。


        例题:有某数据集,其正实例点为X_1=(3,3)^TX_2=(4,3)^T,负实例点为X_3=(1,1)^T,学习率\eta=1,求感知机模型f(X)=sgn(W^{T}_iX-b_i)

        解:(1)首先随机选取初值:W^{T}_i(0)=(0,0)b_i(0)=0

               (2)判断实例点是否被正确分类:

        对X_1=(3,3)^TW^{T}_i(0)X_1-b_i(0)=0,未被正确分类,迭代W^{T}_i,b_i

        W^{T}_i(1)=W^{T}_i(0)+y_1X_1=(3,3),b_i(1)=b_i(0)-y_1=-1

               (3)对于新的W^{T}_i(1)b_i(1)确定的新的超平面,再次判断实例点是否被正确分类:

        对X_1=(3,3)^Tf(X_1)=sgn[W^{T}_i(1)X_1-b_i(1)]=+1,被正确分类;

        对X_2=(4,3)^Tf(X_2)=sgn[W^{T}_i(1)X_2-b_i(1)]=+1,被正确分类;

        对X_3=(1,1)^Tf(X_3)=sgn[W^{T}_i(1)X_3-b_i(1)]=+1,未被正确分类,迭代W^{T}_i,b_i

                                W^{T}_i(2)=W^{T}_i(1)+y_3X_3=(2,2),b_i(2)=b_i(1)-y_3=0

\bold{\vdots}

        重复(2)(3)过程,直至三个实例点都被正确分类,得到最终迭代结果:

    W^{T}_i(7)=(1,1),    b_i(7)=3

        即最终所确定的感知机模型为:f(X)=sgn[(1,1)(x_1,x_2)^T-3]=sgn(x_1+x_2-3)

        分离超平面为:x_1+x_2-3=0

例题代码: 

import numpy as np
import matplotlib.pyplot as plt

train = [((3,3),1),((4,3),1),((1,1),-1)]
feature = []
label = []
xpoints=[]
ypoints=[]

for data in train:
    feature.append(data[0])
    label.append(data[1])   #提取特征和标签数据
    xpoints.append(data[0][0])
    ypoints.append(data[0][1])  #提取x,y坐标用于后面的画图

feature = np.array(feature)
label = np.array(label) #将特征和标签数据转化为numpy数组

w = np.array([0,0])
b=0
eta = 1 #初始化w,b,eta学习率设为1

flag = True #设置标记用于结束迭代
num = 0 #记录迭代次数
while flag:
    count = len(feature)  
    for i in range(len(feature)):
        if -label[i]*( np.dot(w,feature[i].T) + b) >= 0:  #如果数据被误分类
            w = w + eta*label[i]*feature[i].T
            b = b + eta*label[i]    
            num = num + 1
            print("第{}次迭代:w={},b={}".format(num,w,b))   #迭代并输出迭代后的w和b
        else:
            count = count - 1   #conut循环减1,减到0时表示所有数据都分类成功
        
        if count == 0:
            flag = False   #如果所有数据都分类成功。停止循环迭代
print("共迭代{}次,最终迭代结果:w={},b={}".format(num,w,b)) #输出最终结果

x = np.linspace(-5,+5,50)
y = -(w[0]*x + b)/w[1]
plt.plot(x,y)
plt.plot(xpoints,ypoints,'o',)
plt.show()  #画出示意图

 输出结果:

 


注:不同的参考书中,对于输入可能写成W^{T}_iX-b_iW^{T}_iX+b_i。对于-b_i还是+b_i的问题,由于本文章输入是由M-P模型(单个神经元模型)引入的,所以这里采取前者的写法。采取后者写法甚至更优,会使迭代公式有统一的形式,即:

        \bold{W_i^T(t+1) = W_i^T(t)+\eta y_iX_i}

\bold{b_i(t+1) = b_i(t)+\eta y_i}

而前者写法的迭代公式为:

\bold{W_i^T(t+1) = W_i^T(t)+\eta y_iX_i}

\bold{b_i(t+1) = b_i(t)-\eta y_i}

两种写法并无本质的不同,所得最终结果也是一样的,后者写法虽然更优,但不再做更改,需要读者尤其注意正负号的问题。


参考

[1]刘若辰,慕彩虹,焦李成,刘芳,陈璞花.人工智能导论[M].北京:清华大学出版社,2021.8:195-200.

[2]李航.统计学习方法[M].北京:清华大学出版社,2019.5:35-41.

[3]同济大学数学系.高等数学[M].北京:高等教育出版社,2014.7:23-27.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morefree_AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值