感知器算法的基本原理和步骤_感知机(Perceptron)模型的原理和算法总结

感知器算法的基本原理和步骤_感知机(Perceptron)模型的原理和算法总结_第1张图片

本文主要参考自一篇博客,其链接为

感知机原理小结 - 刘建平Pinard - 博客园​www.cnblogs.com
感知机(Perceptron)可谓是最古老的分类方法之一了,最早由Frank Rosenblatt在1957年提出。虽然今天看来其分类模型因其泛化能力不强导致很多时候不再使用,但是其原理却还是值得仔细研究一番。只有研究好了感知机模型,后期学习支持向量机(Support Vector Machine, SVM)才不会那么吃力,同时也为后面学习神经网络((Neural Network, NN)、深度学习(Deep Learnin, DL)打下扎实的基础。下面我们一起来看看吧!

1. 感知机模型

说起感知机,一开始我们可能很难让其跟分类联系起来,也会觉得太过高大上,让人不理解。对于其名称为啥叫“感知机”,我们不得而知,有兴趣的同学可以在wiki上看看它的介绍

感知器​zh.wikipedia.org

这里主要说其思想,其实特简单。打个比方,这里有一群学生,其中包括男女学生,这时感知机模型就是寻找一条直线,用以把所有男同学和女同学分隔开来。放到三维空间就是寻找一个分割面,再高维度就是寻找一个超平面,用以把所有二元类别隔离开来。当然,还有一种情况是这样的直线或超平面永远也找不到,这就意味着我们给的类别线性不可分,也就意味着这时感知机模型已经不适合你的数据的分类了。从而我们知道了使用感知机的一个前提就是数据是线性可分的。这也是制约感知机使用场景的重要原因。而反观其竞争对手们则要能的多,SVM可以通过核(Kernel)技巧来让数据在高维可分,NN可以通过选择合适的激活函数和增加隐藏层来让数据可分。

具体来说,就是如果我们有

个样本,每个样本对应有
维特征和一个二元类别输出,可表示为

我们的目标就是找出一个超平面如下

使得一类样本满足

,而另一类样本则满足
,从而可将样本线性分隔开。当然,如果数据可分,这样的超平面一般是不唯一的,也就意味着感知机模型的解可以有多个。

当然,为了简化上述超平面的写法,我们习惯上在每个样本上再增加一维特征

,这样一来,超平面可以表述为
。其向量形式为
,其中
维行向量,
维列向量,
表示向量内积。

这时我们的感知机模型可以表示为:

,其中符号函数
定义为:

2. 损失函数(Loss Function)

为了方便定义损失函数,我们将满足

的样本类别输出记为
,满足
的记为
。这样一来,正确分类的样本满足
,而错误分类的样本则满足
。损失函数的优化目标,就是使得所有误分类的样本满足到超平面的距离之和最小。

由上述可知,对每一个误分类的样本

,其到超平面的距离为:

其中

表示向量的
范数。

现在我们假设所有误分类的样本的集合为

,则所有误分类的样本到超平面的距离之和为:

这样我们就得到了初步的感知机模型的损失函数。这里为什么叫初步呢,因为这还不是最终的形式。我们仔细观察上述损失函数的形式可以发现,分子和分母都含有

,当分子中的
扩大
倍时,分母的
也将扩大
倍。也就是说,这里的分子分母有着固定的倍数关系。所以我们可以固定分子或分母为
,然后求另一个即分母的倒数或分子的最小化作为损失函数,这样一来便可以简化我们的损失函数。在感知机模型中,我们一般选择的是后者,即将分母定为
,求分子最小化,此时损失函数简化为:

By the way,如果了解过SVM的同学应该知道,SVM选择的是前者,即固定分子为

,然后求
的最大化。采用不同形式的损失函数主要与它后面的优化算法有关系。

3. 优化损失函数(更新

常用的优化方法一般是梯度下降法(Gradient Descent, GD)和拟牛顿法(Qusai-Newton, QN),常用的是GD。

GD也分为几种,在这里基于所有样本的梯度和均值的批量梯度下降法(Batch Gradient Descent, BGD)是行不通的,因为我们这里并不是针对所有样本,而只有误分类的样本才参与优化过程。而另外两种随机梯度下降( Stochastic Gradient Descent, SGD)和小批量梯度下降(Mini-Batch Gradient Descent, MBGD)。感知机模型采用的SGD。

先求出损失函数对

的偏导数为:

从而

的梯度下降迭代公式应该为:

由于我们采用的是SGD,所以每次迭代仅使用一个误分类的样本进行计算梯度。假设采用第

个样本来更新梯度,则简化后的
向量的梯度下降迭代公式为:

其中

为步长,
为样本输出值
维列向量。

3. 算法

算法输入为

个样本,每个样本对应有
为特征和一个二元类别输出
,如下:

输出为超平面的系数向量

算法步骤:

  1. 定义所有样本的
    。选择向量
    和步长
    的初值。这里值得注意的是,两者初值的选取不同会导致最终得到的
    也不一样。
  2. 在所有样本中找到一个误分类的样本
    ,用向量表示即为
    ,这个样本满足:
  3. 进行一次SGD迭代:
  4. 检查所有样本中是否还有误分类的样本,如有,则回到第
    步,否则算法结束,此时得到的
    即为最终输出结果。

其MATLAB代码为:

clear

运行结果为:

感知器算法的基本原理和步骤_感知机(Perceptron)模型的原理和算法总结_第2张图片
样本及所得分界线(图中红色直线)

此时的得到的

2241d60ff85cc6c4d865fb08d74d34f5.png
w的值

4. 算法对偶形式

前面讲述的感知机模型算法一般称为感知机模型的算法原始形式。本节所要讲的对偶形式是对算法执行速度的优化。

从算法原始形式的核心步骤,及向量

的迭代公式:
可以看出,每次迭代都是选择一个样本来更新
,最终经过若干次迭代得到最终结果。这其中对于从来都没有误分类过的样本,其被选择参与迭代的次数为
,对于被多次误分类而参与更新的样本
,它参与迭代的次数我们设置为
。如果令向量
的初值设置为
,这样向量
的表达式就可以写为:

其中

为样本
在SGD到当前这一步之前因误分类而参与更新的次数。

我们将每一个样本

初始值设为
,每当此样本在某次因误分类参与更新时,
的值加

由于步长

为常量,可以令
,这样向量
则可表示为:

在每一步判断分类条件的地方,我们不再用原始形式中的

来判断,而采取
。注意到这个判断分类的式子的里面是计算两个样本
的内积,而且我们还发现这个结果我们可以在以后的迭代中继续使用。所以,如果我们事先就把所有样本的内积计算好,那么在算法执行时,仅一次的内积计算比多次的循环计算要节省时间。这也是对偶形式比原始形式更优化的原因所在。

提示一下,这里所有样本的内积矩阵称为Gram矩阵,它是一个对称阵。

对偶形式算法具体内容为:

算法输入输出与原始形式一致,此处不再赘述。

算法步骤:

  1. 与原始形式一致。
  2. 计算所有样本的内积矩阵即Gram矩阵G。
  3. 在所有样本中选择一个误分类的样本
    ,这个点应该满足:
    ,这里可以通过查询Gram矩阵的元素
    的值来快速判断。
  4. 对向量
    的第
    个分量进行更新:
  5. 检查所有样本中是否还有误分类的样本,如有,则继续第
    步,否则算法结束,此时得到的向量
    为:

其MATLAB代码为:

clear

运行结果为:

感知器算法的基本原理和步骤_感知机(Perceptron)模型的原理和算法总结_第3张图片
算法对偶形式运行结果

5. 总结

感知机算法整个过程比较简单,理解起来并不困难,编程实现也还算简单。但是它作为SVM、NN和DL的鼻祖,其原理还是值得好好研究一番。而其对偶形式为啥比原始形式高效,也值得大家好好体会。

你可能感兴趣的:(感知器算法的基本原理和步骤)