说明
感知机是SVM(support vector machine,支持向量机)的基础,更是机器学习的基础。本文的目的在于把感知机的相关概念捋清楚,并基于感知机做最基本的线性可分的二分类实践。
有关机器学习的一些基础概念,读者可以参考本专栏的第一篇博文[4]:机器学习系列篇章0 --- 人工智能&机器学习相关概念梳理-CSDN博客 (同样地,第一篇博文的相关概念其实也可以结合本文的内容进行理解)
Blog
2024.10.6 博文第一次撰写
目录
说明
目录
一、概述
二、感知机模型
三、感知机损失函数
四、感知机学习算法
4.1 原始形式及其实践
4.1.1 原始形式说明
4.1.2 原始形式下的算法描述
4.1.3 原始形式下的实践
4.2 对偶形式及其实践
4.2.1 对偶形式说明
4.2.2 对偶形式下的算法描述
4.2.3 对偶形式下的实践
五、总结
六、拓展:非线性可分&多类判别的思考
七、参考资料
八、数据和代码参考
一、概述
感知机(perceptron)是一种可用于二分类的线性分类模型,属于监督学习算法。我在之前的博文[3]中讨论过聚类问题,聚类和分类有诸多相同的地方,也有显著差异:这两种方法的目的都是将多类目标分开,但聚类是一种无监督学习算法,它事先不知道数据类别,而是根据样本的相似性来进行分组,聚类算法更多的是探索性的;分类算法则是需要根据已知类别的数据来训练模型,是预测性的,更侧重于根据已知标签来预测新样本的标签。
感知机是最简单的二分类模型,它旨在求出一个将输入空间中的实例划分为两类的分离超平面。如果训练数据集是线性可分的,则感知机一定能求得分离超平面(这个超平面不一定是泛化能力/鲁棒性最好的,SVM得到的才是最优的,关于这两者的差异,我会在后续关于SVM的系列文章中做更详细说明),如果是非线性可分的数据,则无法获得超平面。 感知机具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习到的感知机模型对新的实例进行预测。感知机是神经网络和支持向量机的基础。
二、感知机模型
假设训练数据集为:
(2-1)
其中,xi ∈X ⊆Rn, xi不是指单个数据,而是一个n维(n≥1)的向量,比如当n=3时,则对应数据在三维空间上,此时我们可以用一个平面去分开空间中的两组数据。yi ∈Y ⊆{+1, -1},对应两种可能的类别。典型的感知机模型为:
(2-2)
其中,w和b称为感知机模型参数,w为权值,其维度等于x的维度,b为偏置。sign函数是符号函数:
(2-3)
感知机模型的其中一个超平面(在上述模型下,一个显而易见的超平面)是:
w·x + b = 0 (2-4)
其中,w是超平面的法向量(类比平面方程中各变量的系数可以构成该平面的法向量),b是超平面的截距。这个超平面将样本点分为正负两类。即对所有yi = +1 的样本,都有w*xi + b ≥ 0; 对所有yi = -1 的样本,都有w*xi + b < 0。
三、感知机损失函数
为求得超平面,感知机引入了基于误分类的损失函数,利用梯度下降法对损失函数进行优化求解,并进而得到超平面。(相关的概念我在[4]中有过介绍)
假设训练数据集是线性可分的,为了找出一个能够将训练数据集正实例点和负实例点完全正确分开的超平面,即确定感知机模型参数w、b,需要确定一个学习策略:定义(经验)损失函数,并将损失函数极小化。
损失函数的选择,容易想到的是误分点的总数,但是这样的函数不是连续可导的,不易优化。因此感知机采用的损失函数是误分类点到超平面的总距离。
对于三维空间中的点(x0,y0,z0)到平面(Ax+By+Cz+D=0)的距离,我们有公式:
(3-1)
相似地,如果假设超平面是h = w·x + b ,则样本点x’到超平面的距离为:
(3-2)
式中的||w||是w的L2范数(L2范数是指向量中各值的平方和后开根号)。对于数据点(xi,yi),如果分类正确,按照第二章中对感知机模型的描述,w∙xi+b>0 对应yi = +1,那么 必然是大于0的,如果分类不正确则乘积小于0:
(3-3)
该误分类点到超平面的距离为:
(3-4)
假设超平面S的误分类点集合为M,那么所有误分类点到超平面S的总距离为:
(3-5)
不考虑,我们就可以得到感知机学习的损失函数:
(3-6)
这个损失函数就是感知机学习的经验风险函数,我们需要想办法使其越小越好,直到所有误分类点到超平面S的总距离为0:也即没有误分类的点 。
四、感知机学习算法
4.1 原始形式及其实践
我们得到感知机损失函数后,感知机学习问题就转化为了求解损失函数的最优化问题。 由于感知机学习算法是误分类驱动的,可以基于随机梯度下降法进行优化求解:任意选取一个超平面(w0,b0),然后用梯度下降法不断地极小化损失函数,极小化过程中不是一次使M中的所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降,直到不存在误分类点。
4.1.1 原始形式说明
损失函数L(w,b)的梯度(分别对w和b求导)为:
(4-1)
(4-2)
于是,如果我们随机选取一个误分类点(xi, yi),则对w和b进行更新的公式为(逆梯度方向):
(4-3)
(4-4)
(上式中,w的维度和xi的维度一样,xi不是一个值,而是一个向量)
4.1.2 原始形式下的算法描述
假设输入训练数据集: ,其中,, ,
,学习率η 为(0<η<1)。 算法流程图如下:
图4.1 感知机原始形式下的学习算法流程图
其中初始值可以随机化设置,上面的流程中,每次迭代是随机选取训练集中的某个数据,当被正确分类的点增多时,可能每次随机选取的都是被正确分类的点,此时循环其实在“空转”,如何快速找到没有被正确分类的数据?这里面是有一些小的细节需要把握的,具体可参考后续的代码。
上面给出的流程是比较典型的处理方法,在某些情况下如果我们想限制学习的时长(即便此时训练数据集还没有被完全正确分类),此时也可以设置特定的迭代次数、或者设置特定的正确分类率,当到达迭代次数或者特定的正确分类率时,即刻停止学习,退出循环。文章[2]给的代码就是这样通过限制迭代次数来终止循环的,这两种迭代终止条件下的算法流程如下述两图所示:
图4.2 预设训练次数下的感知机学习算法流程图
这种方法下其实是有风险的:因为在迭代的过程中,如果出现了未被正确分类的数据,我们会更新权值和偏置,更新这两个值后,是有可能存在:之前被正确分类的点在权值和偏置更新后反而被错误分类了!对应到上图的算法流程,也就可能存在:在第N次训练时,其中某个没有被正确分类的数据点导致的权值和偏置的更新,使我们得到的感知机模型分类效果更差了! 训练次数阈值N的选择可能需要多次试验,直到找到某个合适的值。 此外,上面的算法流程中,我们在每次训练时对每个数据都做了一次遍历,这和图4.1算法流程中通过随机选取有些出入。
预设训练集正确分类率的算法流程图如下:
图4.3 预设训练集分类正确率阈值下的感知机学习算法流程图
通过预设训练集正确分类率来停止训练的方法是我临时想到的,这种方法和图4.2的不同在于:可以保证训练集的正确分类率。本方法可以说是图4.1经典方法的一种”简化”版本,通过调整正确分类率阈值,从某种程度上,我们可以兼顾正确率和训练时间。
注:在后文的实践部分,我只给出图4.1算法流程图指导下的仿真实践,相关的代码读者可以参考本文第八章的链接,图4.2和图4.3算法流程对应的代码实现只需在4.1的基础上做一点改动即可,读者可以自行完成。
4.1.3 原始形式下的实践
首先生成可用于二分类的数据集,我直接沿用了之前聚类博文[3]中的代码,在二维平面上生成数据,结果如下:
图4.4 随机生成的可线性二分类的数据集
随后基于图4.1中的流程以及前述理论公式,从生成的数据集中选取了一部分作为模型训练的训练集,剩余的作为模型测试的测试集,权值、偏置、学习率都是在(0 1)区间内随机生成。得到的训练以及测试结果如下:
图4.5 原始形式下的感知机学习和分类结果
图中直线对应训练得到的分类超平面,实心圆圈对应训练集,空心圆圈对应测试集,从图中可以看到,训练以及分类的结果符合预期:没有误分类的点。算法迭代了860次,每次迭代下的分类超平面如下图所示:
图4.6 各次迭代下的分类超平面
4.2 对偶形式及其实践
对偶形式是对算法执行速度的优化。
4.2.1 对偶形式说明
从前述原始形式我们看到:每次梯度的迭代都是选择一个样本来更新w和b,最终经过若干次迭代后得到最终的结果。在迭代过程中,对于从来没有被误分过的样本,它被选择参与w和b迭代修改的次数为0,对于被多次误分类的样本,我们假设其参与对w和b迭代的次数为ni。那么对于该参与ni次迭代的样本(xi,yi),它单独参与的对w和b贡献的量为:
(对w的贡献) (4-5)
(对b的贡献) (4-6)
如果我们假设w和b的初始值都为0,将前述公式推广至全部对迭代有贡献的数据点,则迭代完成后w和b的公式为:
(4-7)
(4-8)
有了上式后,我们可以得到对偶形式下的感知机模型:
(4-9)
在判断误分类时,对于任意点(xi, yi),我们可以用下式来判断其是否为误分类点(注意这里以及后续的i和j之间所表示意思的区别):
(4-10)
这个判断误分类的形式里面是计算两个样本xi和xj的内积,而且这个内积计算的结果在下面的迭代次数中可以重用。如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时,仅仅一次的矩阵内积运算比多次的循环计算省时。计算量最大的判断误分类这儿就省下了很多的时间,这也是对偶形式的感知机模型比原始形式优的原因。
对偶形式中训练实例仅以内积的形式出现,为了减少计算量,我们可以预先将训练集样本间的内积计算出来,也就是Gram矩阵:
(4-11)
4.2.2 对偶形式下的算法描述
令,(它是一个大小为1*m的数组,m为数据量的大小,在得到最终的结果之前,我们需要为训练集中的每个数据分配一个α),假设输入训练数据集: ,其中,xi ϵ X ⊆ Rn, yi ϵ Y={+1,-1},学习率η 为(0<η<1)。 算法流程如下:
1. 初始化α = zeros(1,m),η可以随机设置;
2. 在训练集中任意选取数据(xi,yi);
3. 如果 ,则认为该点是误分点,进行参数更新:(在求解时,我们就可以用到Gram矩阵)
4. 转至2),直至训练集中没有误分类点。
5. 输出α向量,并得到训练好的感知机模型:
4.2.3 对偶形式下的实践
对偶形式下所用的数据集与4.1.3节一样,权值以及学习率也是随机生成的。得到的学习和分类结果如下:
图4.7 对偶形式下的感知机学习和分类结果
也没有误分类的点,结果符合预期。对偶形势下一共迭代了600次,各次下的超平面如下图所示:
图4.8 各次迭代下的分类超平面
备注:关于两种形式的选择
- 如果特征数过高,计算内积非常耗时,应选择对偶形式算法加速。
- 如果样本数过多,每次计算累计和就没有必要,应选择原始算法。
此外,需要注意的是:从前述对感知机的理论分析来看,只要训练集中没有了误分类的点,迭代便会停止,感知机这套理论主要关注得到超平面,不考虑超平面是不是最优的,超平面只是严格地对训练集负责,其泛化性不高。所以在分类测试时,像前述两个实践下分类准确率为100%的情况其实并不会多见。关于如何得到更优的、泛化性更好的超平面,是SVM要解决的问题,读者可以关注我后续的博文。
五、总结
本文围绕机器学习中基础的感知机模型展开,首先对其基本概念进行了介绍,随后给出了感知机的数学模型以及模型的求解方法(引入了损失函数,通过优化该函数来求得感知机的二分类模型),最后分别对其原始形式和对偶形式做了说明,并分别进行了仿真实践,实践的结果验证了理论以及所编代码的正确性。本文的工作很基础,不过为后续更复杂的多分类、SVM模型以及众多机器学习算法的认识和理解打了点基础。
六、拓展:非线性可分&多类判别的思考
前文讨论的都是针对最基本的、线性可分的二分类情况(事实上,这种情况在实际应用中是很少见的),如果待分类的目标是线性不可分的?或者类型不止两种呢?如下面两图所示:
图6.1 线性不可分的情况示例
图6.2 多类别的情况示例
有关这两种情况下的分类方法,我在后续的SVM系列博文中会进行探讨。
七、参考资料
[1] 【机器学习】感知机原理详解_感知机算法原理-CSDN博客
[2] 感知机介绍及MATLAB实现_感知机对100个数据分类matlab-CSDN博客
[3] (毫米波雷达数据处理中的)聚类算法(1) --- 概述-CSDN博客
[4] 机器学习系列篇章0 --- 人工智能&机器学习相关概念梳理-CSDN博客
八、数据和代码参考
感知机及其实践博文相对应的代码资源-CSDN文库