前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习算法复习手册——SVM

机器学习算法复习手册——SVM

作者头像
beyondGuo
发布2019-12-27 18:37:42
4870
发布2019-12-27 18:37:42
举报
文章被收录于专栏:SimpleAISimpleAI

本手册整理自机器学习各相关书籍、网络资料、个人的理解与实践。总体编写宗旨: ①一看就懂; ②用20%的文字,涵盖80%的内容。 至于剩下的20%,一般属于比较偏、难的部分,建议自行查询相关书籍资料学习。而只用20%的文字,则代表手册里面几乎没有废话,也只有极少数必要的例子。

手册往期文章: 机器学习算法复习手册——决策树 机器学习算法Code Show——决策树

下面进入正题,今天的主题是支持向量机(SVM)。


支持向量机

支持向量机(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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SimpleAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 支持向量机
    • 1. 用“间隔最大化”定义优化问题
      • 2. 关于支持向量
        • 3. 转化为对偶问题
          • 4. 核函数
            • 5. 软间隔与合页损失函数
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档