面试 SVM 算法不用慌,原理这次被扒的干干净净

本文详细介绍了支持向量机(SVM)的基本原理,包括最大间隔策略、支持向量的概念、对偶问题的转化以及核函数的应用。SVM通过寻找最优超平面实现分类,对线性可分、近似线性和非线性数据都有相应的解决方案。软间隔允许一定程度的误分类,以提高模型泛化能力。常用的核函数如多项式核和高斯核(RBF核)能在保持计算效率的同时处理非线性问题。此外,文章还提及了合页损失函数在软间隔SVM中的作用。
摘要由CSDN通过智能技术生成

支持向量机(SVM)是一种强大的二分类器,一般我们提起机器学习,最自然想到的算法就是SVM。它跟感知机十分类似,都是线性分类器。在学习感知机算法的时候,我们知道,最后学得的分类器不是唯一的,因为能够把正负样本点分开的超平面很可能不止一条。在SVM中,我们会改进这一点,方法就是使用最大间隔的原则来寻找最优的分割超平面。
图片

应对数据线性可分、近似线性可分、线性不可分三种不同的情形,SVM分别有硬间隔SVM、软间隔SVM和非线性SVM。

下面的内容,我们主要复习SVM基本型(线性可分SVM)的基础知识和训练方法,对于软间隔SVM以及非线性可分的,我们的介绍就会简略一些。

1. 用“间隔最大化”定义优化问题

究竟何为间隔最大化?之前在感知机中,不就是使用误分类样本的和超平面的距离之和的最大化作为损失函数吗?首先想想为何感知机的超平面可能有多个,因为当我没有误分类点的时候,感知机的损失就为0了,我就不更新了。现在SVM想做的事儿,就是即使我没有误分类点了,我还想优中选优。

那怎么选呢?我找出所有训练样本点中,离超平面最近的那一个点,让这个最小距离也尽可能地大。这样,我最终得到的超平面,即使对于最难区分的点(离超平面最近的点),我可能很有把握地分开,那说明这个平面选择的确实很好。

把最小距离最大化”,就是我们所说的“间隔最大化”,写成方程就是这样的:

下面的约束条件的意思就是说γ是所有点中的最小的距离。其实这个距离还有一个单独的名字——“几何间隔”,具体我也不赘述了,可以参见李航老师的教材。上面这个方程,可以经过一系列的简单转化,具体我用下图来展示:

图片

总之就转化成了这个方程:

这是一个凸二次规划问题,只要是凸优化,就代表很好(用现成的软件)求解。

2. 关于支持向量

前面讲了线性可分情况下SVM是如何优化的,即通过“间隔最大化”,而间隔最大化,是挑离超平面最近的那些点来优化,这些点,也有自己特殊的名字——支持向量。从优化的过程来看,支持向量对超平面的选择起决定性作用,这也是支持向量机名字的由来。

3. 转化为对偶问题

其实对于优化问题,只要我们能转化成一个凸优化问题,最难的部分就过去了,后面求解上虽然理论上也十分复杂,但是计算方法已经十分成熟,所以对于大多数人来说不是需要考虑的问题。

然而,在SVM中,一般的书上都会做进一步的讨论,把上面这个问题(这里称为原问题)继续转化成对偶问题求解,这样做的好处主要有两个:

  • 转化之后更容易求解

  • 方便后面非线性SVM中核函数的引入

转化的思路就是通过”拉格朗日之神马操作“,我整理成了下面这张图:

图片

图片

虽然图上写了,我再把转化后的对偶问题写一下:

为什么这里转化后的对偶问题会更容易求解呢(其实我觉得不一定)?首先原问题的变量个数由特征维度决定,而对偶问题只跟样本个数有关(所以当维度远远大于样本个数的时候,对偶问题明显会简单些,反之则不一定了);另外一点,这里的α,只有当样本点是支持向量时,才非零,其余都为零。当然,这里转化成对偶问题,最重要的还是为了方便后面核函数的引入。

对于这里的对偶问题怎么求解呢?由于刚刚也提到过,这个方程的求解复杂度正比于样本的数量,因此计算的开销还是很大。所以这里人们开发除了著名的SMO算法,即序列最小优化算法。这里SMO算法涉及到的内容又很多,所以这里只简述一下SMO算法的基本思想:

要想对偶问题得到最优解,就要求所有的训练样本点都满足KKT条件。SMO算法,将问题转化成一个个的二元优化问题。每次都选择最违反KKT条件的变量,以及随机确定的另一个变量,来构建两个变量的二次优化问题,每一次的求解都会使得原来的问题更加接近最优解。由于各个子问题可以直接解析求解,因此速度会快很多。

求解了这个对偶问题之后,就得到了最优的α的值,则可以接着求出w和b的值:

其中这个b是根据KKT条件中得到的,α存在一个分量大于0,从而可找到一个b的等式关系进而求出b。

得到了w和b,就可以写出最终分类模型的方程了:

4. 核函数

核函数,因其莫名其妙的名字,也是一直是一个让很多人头疼的玩意儿。时至今日,见到核函数相关的公式,我也忍不住打出一个草字头来。这里争取跳过具体的公式,谈一谈核函数到底是啥,为啥。

前面的讨论,都是假设训练样本是线性可分的。然而,事情往往,没~那么简单(能听到语音吗),即很多时候都存在线性不可分的情况,例如“异或”这个难题。

我们的数据看起来线性不可分,那就说明我们手头的那些特征不足以区分出不同类别的样本。那这个时候我们想要区分它们,能怎么办呢?

一种方法就是我们寻找更多有区分性的特征,比如,我们从”性别“、”年龄“这两个特征上很难区分一个人的收入水平,于是我们接着找到了”学历“,”工作经验“这两个特征,加上去,一看,诶!这下我们就很好区分了,用这个四个特征就可以很好地拟合一个分类模型了。

但是,我们一般都默认,特征都已经被我们努力发掘过了,很难再找到更多额外的有区分度的特征了,那怎么办呢?

这个时候,我们就可以尝试,把已有的特征进行组合,内部形成更多的特征。比方我们本来有x=(x1,x2,x3)三个特征,我们可以试着将这三个特征两两相乘,就得到x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3这,九个特征(可能有重复特征,先不管这个),特征增加了,我们就更有可能增加样本的区分度,而且特征维度增加的越多,我们就越有机会让样本线性可分。

所以,线性不可分的样本,往往在映射到高维空间中的时候就可分了。具体多少维,我也不知道,但是有一个定理:

只要原始维度是有限的,那么一定存在这个更高维的空间使样本可分。

假设我们找到了的高维映射为,则新的超平面则为:

则我们在求解对偶问题的时候,把原来的x的内积替换成映射的内积即可,十分方便:

本来我们就这样接着求解出α,w和b就完事儿了,跟之前的求解没什么区别,但是这里又有了新的困难,那就是高维映射求内积十分费劲

例如,本来我们一个样本x的特征是三维的(x1,x2,x3),现在两两相乘得到了九维,那原本是3维向量求内积,现在则是九维向量求内积,复杂度陡增。

这个时候我们才正式引入“核技巧”和“核函数”的概念:

能不能找到高维映射内积与原空间中特征的关系,从而在原特征空间中就能求出高维映射的内积?

其实是完全可以的,为了简便,我使用二维原特征空间来举例子:

可以看到,实际上,这里的就是所谓的**“核函数”**前者的计算复杂度是4,后者是2,二者是平方关系。如果映射方式不变,原特征空间维度为K的话,那么使用高维映射直接计算,复杂度是,而使用核函数,复杂度只有。这就是核的威力!

所以,关键是我们要找到高维空间内积与原空间的关系,即核函数。核函数一旦确定,我们就可以不用关心高维映射具体是怎么实现的,只用使用核函数计算出结果就行了。

但是核函数通常不是件容易事儿,首先如何找到一个好的高维映射就不容易,另外,如果我们先定义核函数,想据此找到映射方式也不容易。幸好,前人的研究给我们留下了很多的经验,我们有一些常见的效果很不错的核函数可以选择。最常用的就是两个核函数:多项式核,高斯核。

多项式核

多项式核公式为:。

将其展开之后,可以知道对应的高维映射空间的维度为,内积的计算复杂度为,而使用核函数的计算复杂度为。

高斯核

高斯核,又称为径向基函数核(RBF核),公式为:。

由于其泰勒展开是无限维,因此其高维映射空间的维度也是无限维,无限维空间我们无法描述,更无法计算内积,但是通过这个核函数,我们却可以直接求出在无限维空间中的内积!这就是高斯核的厉害之处,因此,在情况不明确的时候,我们往往都先使用高斯核来试试水,一般情况下问题都可以很好解决。

5. 软间隔与合页损失函数

前面讲的线性可分SVM,以及线性不可分但是通过核函数升维变为可分,本质上都是想让训练样本严格的线性可分,也就是硬间隔。

但是,即使线性可分了,那些离分割超平面很近的点,其置信度是很低的,如果因为这些点,而努力让平面严格地将数据分开,可能会造成过拟合;另外,数据中也经常会出现一些噪音点、异常点,如果使用硬间隔的话,会严重扰乱模型的训练。因此,为了模型的泛化能力,我们可以采用“软间隔”。

软间隔的意思就是,放松对每个样本点函数间隔的要求,所以引入一个松弛变量,把之前的不等于约束变成:

但是要求降低了是需要付出代价的,所以损失函数也要修改成:

其中C>0称为惩罚系数,这样损失函数的意义就是“让间隔最大化,同时误分类点也尽可能少”。于是优化问题就变成了:

求解方法依然是转化成对偶问题求解,此处实在不想赘述了。

在软间隔SVM中,我们还可以使用一个新的损失函数——合页损失函数(hinge loss),来从另一个角度描述这个问题

上面的软间隔下的优化问题,等价于下面这个优化问题:

对,无其他约束。

其中,就是所谓的hinge loss。

图片

hinge loss的图像如图所示,可以看出,对于误分类点,即y(wx+b)<0,自然是有损失的;但是对于正确分类的点,当置信度不是很高时(0~1的范围内),也会有损失,只有置信度很高时才为0。

因此我们可以看出,使用hinge loss,我们对模型的学习有更高的要求,这样会使得模型学习得更复杂,所以损失函数中的又可看做是一个“正则化项”,来控制模型的复杂度。

以上就是关于SVM的主要内容了,SVM这个东西还是比较复杂的,因为涉及到的数学的东西比较多。但是,里面的很多问题具有通用性,像对偶问题的转化和求解、核技巧,都是在其他问题中也是经常使用的,因此SVM还是有必要仔细学一学的。

本文参考资料:
1. 李航,《统计学习方法》
2. 周志华,《机器学习》
3. 链球选手,《我所理解的 SVM 2——核函数的应用》,https://zhuanlan.zhihu.com/p/24291579
4. 崔家华,《机器学习实战教程(八):支持向量机原理篇之手撕线性SVM》,
https://cuijiahua.com/blog/2017/11/ml_8_svm_1.html
5. 90Zeng,《简易解说拉格朗日对偶(Lagrange duality)》,
https://www.cnblogs.com/90zeng/p/Lagrange_duality.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值