支持向量机SVM
SVM能做什么
支持向量机(Support Vector Machines)简称SVM,是一种既可用于回归又可用于分类的监督学习的模型。此文章重点讨论分类。
我们设计一个超平面,将两类数据区分开来,从而达到分类的效果。
SVM关心的点就是怎样找到一个最优秀的超平面:或者说,我们怎么拿到这个w和b。
相关必要概念
开始解决这个问题之前,我们穿插一些必要的概念:
- 决策超平面(Decision Hyperplane):也称作分类超平面,它将不同类别分开的超平面,就是我们要确定的超平面。
- 正超平面(Positive Hyperplane):与决策超平面平行,位于决策超平面一侧的超平面,它在样本空间中划分了属于正类的数据。
- 负超平面(Negative Hyperplane):与决策超平面平行,位于决策超平面一侧的超平面,它在样本空间中划分了输入负类的数据。
- 间隔(Margin):决策超平面与正超平面(或负超平面)之间的距离,或者说一类数据到决策超平面的最小距离。
- 支持向量:位于正负超平面上面的样本。
实现SVM分类器的问题转换
正负超平面之间的距离就是两类数据之间的距离,也就是两倍的间距。这个距离越大就说明两类数据之间差异越大,也就说明分类的效果好。要分类,那么我们就要最大化间距。
公式推导
谈到距离,不防用高中数学中的点到直线距离过度一下。
如此,点到超平面的距离也就不难理解了。
相较于点到直线,多的仅仅是维度罢了。
公式当中的绝对值的作用显而易见,毕竟是距离,断然不该有负的概念。为了替换掉这个绝对值,我们引入y,当本身为正时,我们乘上y(y=1);当本身为负时,我们乘上y(y=-1)。y要么为1要么为-1,就只有两种状态,正符合我们的二分类,我们可以把y视作分类的两种结果。
距离公式也就变成了
那么:
那么我们的目标最大化间隔就等价于:
这个式子就是我们的原始目标函数。
整体的函数就是一个分式,分母为||w||,分子为(wx+b)y(正数),很明显,在保证整体式子大小不变的情况下,我们调整分母的大小能够达到调整分子大小的效果。
在原始的目标函数的基础上,将||w||提到前面来,我们得到:
再将min替换掉,就得到:
别忘了我们能够将min替换掉是有一个前提的:
所以完整来说,我们的目标函数变成了:
等价于:
也等价于:
难免会好奇为什么将||w||加一个二分之一并且平方,这是一个好问题。
我们先回过头来想想,||w||是什么?
||w||是二范式。
不难想到,对二范式平方能避免根号的麻烦。至于前面的二分之一,就是为了求导和平方而得的2进行综合,系数又变成了1,省去许多计算麻烦。
到这里,我们的目标函数就变成了:
这样一系列推导下来,我们要解决的问题就是一个带有不等式约束的最小化问题。
公式推导(二)
推导过程也可以换一个思路来理解:
(这里我们假设是一个二维问题,超平面就是一条直线。)
我们将超平面的方程设出来
我们可以同除以一个c,使得常数变为正负1。 方程式子就变成了这样:
对我们而言,想求的是自变量x前面的系数以及一个常数。所以w\c和w都是一样的,都只是代表一个未知量而已。所以我们将式子写成:
为什么要除以一个c? c可以随便缩放,那么这样的直线是有无数条的。 除以一个c,函数本质上其实是没有改变的,但是间距得到了改变。也就是说,我们通过除以c将超平面之间的偏差归一化为1。
我们从超平面方程跳到样本数据的方程。
位于正超平面的样本代入会有:
正超平面即以上的样本代入会有(即正类数据):
同理:负类数据满足:
将y=1或-1引入,我们的数据满足的方程(也就是约束方程)就是:
现在,我们做一些数学推导,需要提醒的是: 我们根据高中知识可以知道系数组成的向量就是法向量。所以w就是决策线的法线。
这里通过一个投影,我们将L引入,L就是正负超平面之间的距离,可以结合上面可视化进行理解。
通过推导我们得到了
再带上正负数据方程的约束,我们最大化间距问题为:
就是我们明确的目标函数:
拉格朗日乘子法&&KKT条件
通过两个方向的解释,我们分类 问题变成了带有不等式约束的最小化问题。为了解决这个问题我们就不得不提拉格朗日乘子法和KKT了。
最之前,我们提一下二者之间的关系:
拉格朗日乘子法,解决的是等式约束下的最优化。而KKT是拉格朗日乘子法的扩展,能够解决含不等式约束的最优化问题。
拉格朗日乘子法
要理解拉格朗日乘子法,就避不开一个概念:梯度
梯度是函数对每个变量的偏导数组成的向量。 梯度指向函数值增长最快的方向。 梯度总与函数等高线垂直,沿着与梯度成锐角的方向走,函数值增加;沿着与梯度成钝角的方向走一,函数值减小;沿着与梯度成直角方向走,函数值不变。
我们要找到我们目标函数的最小值。 在某点上,我们求得目标函数的梯度以及约束函数的梯度。(图中以黄色向量和蓝色向量表示)
如果这个点是极值点
- 对于目标函数而言,它不再能减小(或是增大),就是它的值不再能改变。函数值不变,也就说明我们要沿着与目标函数的梯度成直角的方向走。
- 对于约束函数而言,它要满足约束条件,不能变大也不能减小,所以自然也就是沿着于约束函数的梯度成直角的方向走。 综合下来,我们要走的方向既与目标函数梯度垂直又与约束函数梯度垂直。就能够推到: 在极值点上,目标函数的梯度共线于约束函数的梯度,也就是:
理解这个共线非常重要,可能我的表述有些不清楚,推荐观看哔站up主轩兔的视频理解【拉格朗日乘数法】:有等号约束的最优化
极值点应当满足两个式子:
第一个式子表达了我们刚才推导的共线,第二个式子表达了要满足约束条件。
简单来说的话就是:关于等式约束的最优化问题,我们代入上述两个式子,就能求得在约束条件下的极值。
我们构造一个函数:
我们将我们构造的这个函数称作拉格朗日函数,引入的一个常数叫做拉格朗日乘数。其中f(x)是目标函数,c(x)是约束函数。
令拉格朗日函数的梯度为0,我们就能拿到上面的两个关系式(共线以及满足约束)
实际上这里因为约束函数c(x)=0,所以拉格朗日函数其实就是目标函数f(x)。
这里的将目标函数最小化,其实就是将拉格朗日最小化。
求拉格朗日函数的极小值,令其梯度为零,代入两个式子可以求得条件。
我们总结来说:要求等式约束下的极值,我们就构造拉格朗日函数,求拉格朗日函数的梯度,令其等于0,从而解得极值。
这里我们可以举一个例子作为结语。
KKT
定然,不是所有的约束都是等式约束。
不等式约束最优化问题我们可以分为两部分来看,先是小于约束(大于可转化为小于),再是等于约束。
提醒:下图中的g(x)是约束函数,x*是最优解。
- 约束函数小于0的情况是左图表现的情况,最小值在约束条件之内。此时,不考虑约束条件求得目标函数的极值也是在x*处,所以约束函数没有起到任何的作用,它不会影响到最小值的取值点。
- 约束函数等于0的情况,这个时候最值的取值肯定在约束边界上,其实就是上面拉格朗日乘子法解决的情况。
总结一下两种情况,我们也就得到了KKT条件:
对于约束为不等式,我们就代入四个不等式,最后也就能求取答案。
对偶
我们有必要提一提对偶:
什么是对偶函数?
对偶函数(Dual function)是在约束优化问题中与原问题(也称为原始问题)相关的一个概念,它是通过拉格朗日乘子法引入的,旨在提供一个下界(对于最小化问题)或上界(对于最大化问题),并且通常比原始问题更易求解。
看这个定义是比较抽象的,我们通过拉格朗日函数来进行理解。
拉格朗日函数是这样的,通过拉格朗日乘子将约束函数引入。
提示:这里的h(x)是不等式约束,g(x)是等式约束。其中等式约束对应的拉格朗日乘子不做要求,而不等式约束对应的拉格朗日乘子必须要大于等于零。
因为加上的等式约束为0,不等式约束小于0。
所以我们所构造的拉格朗日函数一定是小于等于原函数f(x)的。也就是说,拉格朗日函数是原函数的下界,原函数是拉格朗日函数的上界。我们将拉格朗日函数称为原函数的对偶函数。可以通过求取对偶函数的上界(最大值)来求取原函数的下界(最小值)。
我们做出结论: 最小化问题当中,对偶问题的最优值一定是小于等于原始问题的最优值的。 对偶问题的上界就是原问题的下界。
为什么要求对偶问题?为什么要绕一个圈来解决原问题而不是直接解决?
- 约束减少了。原问题中不等式约束有m个,等式约束有p个。而转化为对偶问题之后,原本的约束函数都变成了拉格朗日函数的乘子,我们就只要求不等式约束对应的拉格朗日乘子要大于等于零,只有m个约束。
- 对偶问题一定是凸优化问题。凸优化相较于非凸优化而言,优势在于凸优化的局部最优一定是全局最优。可以结合图形理解:
在拉格朗日对偶中,如何理解:无论原函数凸还是非凸,对偶函数一定是凸函数呢?
我们通过拉格朗日乘子将约束函数引入,对于拉格朗日函数而言,自变量已经变成了拉格朗日乘子而非原始的x,所以我们可以将拉格朗日函数看做关于λ和v的线性函数。线性函数就是凸函数的一种特殊形式。
对偶问题点到即止了,简单来说就是,我们将原始问题求最小值转化为对偶问题拉格朗日函数求最大值。之后我们可以用凸优化来解决,可以用梯度法来处理。
实现SVM基础小结
到此,我们已经能够实现最基础的SVM了,我们进行小结:
要实现分类,就要使得两类数据之间差距尽量大,所以我们目标最大化间隔。
写出公式进行推导,我们要做的就是:
我们要解决这个带不等式约束的最优化问题,我们引入拉格朗日对偶,将原函数对偶为拉格朗日函数,再利用KKT条件,进行求解。
如何使SVM分类更好
在实际问题当中,并非都是理想的数据,少不了噪声。
总会有异常值:
我们需不需要为了这个异常值牺牲掉我们的间隔距离呢?
我们进行分析,如果我们考虑这个异常值,决策超平面就是上图中的实线,如果我们忽略这个异常点,决策超平面就是上图中的虚线。显然虚线的间隔大于实线的间隔,虚线分类的效果要好于实线。这样看来,我们应当牺牲到这个异常值。
但是,有更多的异常值的时候怎么办呢?不能全都不考虑吧?或者,数据本身就线性不可分呢?
显然,上图是找不到一个完美的直线将两类数据全部分开,此时我们怎么办呢?
软间隔
我们提出软间隔来解决这个问题。
硬间隔是指支持向量机在训练过程中要求数据必须完全线性可分,并且找到一个超平面,使得两类样本点与该超平面之间的距离(即间隔)最大。
软间隔是为了处理线性不可分的情况而引入的概念。在软间隔中,允许一些点位于错误的边界一侧,即允许出现少量的分类错误。
理解软间隔,我们可以将其类比为做生意。
间隔类比为收入,异常值造成的错误类比为成本,我们同时考虑收入和成本,将我们的利益最大化。这个最优解下形成的间隔我们称为软间隔,有一定的容错率,目的是在间隔距离和错误大小间找到一个平衡。
软间隔允许某些数据点位于分割超平面的错误一侧(即存在一定程度上的误分类)。但是,对于误分类的点,会给予一定程度的惩罚,这避免让这些错误对模型的整体性能影响过大。
怎样去量化我们的成本呢?下图是一个形象
的解释。
软间隔通过引入一个松弛变量来度量每个点偏离间隔的程度,也就是通过松弛变量来量化了误差。
我们就是要在考虑最小化这个误差:
并且使得间距最大:
整合为:
在这个基础上,我们再引入惩罚参数C,表达我们对误分类的容忍度。
其中需要提醒:C>=0,ξ=max(0,1-y*(wx+b))。
对于ξ,若正确分类则ξ=0,若错误分类则ξ=1-y*(wx+b)
这样,我们调节C就能够调节模型对误分类的容忍程度。
C越大,惩罚越大,容忍程度越小,越不容易误分类,这样的话间距就较小,极端情况下就等于硬间隔。
C越小,惩罚越小,容忍程度越大,越容易误分类,这样的话间距就较大。
对于不同大小惩罚参数C的设置,下面这张图能有一个直观的体现:
这个惩罚参数C对软间隔非常重要,选择合适的C,效果是完全不一样的。
维度转换
加入了软间隔,SVM的线性分隔已经能分得不错了,但是只能线性。而实际问题当中,肯定不完全是线性的分类。对于非线性的数据,我们应当怎么办呢?
就比如下面这个例子
这组数据感觉上是没办法用线性来分类的,需要一个曲线。
但是我们将这个二维数据放到三维来看,令人惊讶的是,这个看似不能线性分类的数据竟然在三维当中非常容易地能够被线性超平面完美的分开!
受此启发,我们在面对线性不可分的情况,完全可以提高维度来看这个问题。
我们可以通过合适的维度转化函数,将低纬数据进行升维。在高纬度下求解SVM模型,找到对应的分割超平面。
当有新数据需要进行分析预测时,可以对其先做升维转换操作,在根据高纬度下的决策边界超平面进行判断。
我们要实现这个提升维度逻辑,我们需要明确的维度转换函数,以及更多的数据存储,计算需求。这是一个十分麻烦的事,尤其是数据存储,困难非常大。
核技巧
有什么办法能够避免将数据送入高纬度进行计算,却又能获得同样的分类效果呢? 我们就需要运用核技巧(Kernel Trick)
回想我们的目标:
我们可以将它转化为拉格朗日对偶问题:
我们分别求偏导:
我们将w和b代入原始的代入原始的拉格朗日函数,消去变量,我们就拿到对偶问题:最大化拉格朗日函数
四个约束条件可以简化为两个:
又将最大化转化为最小化,原始问题的对偶问题就变成了:
仔细观察这个式子,当中有
我们升维之后:
那我们需要的其实就是:
我们就将这个东西称作核函数:
选取合适的核函数,我们就能够不同知晓具体的维度转化函数而直接获取点积,运用到式子当中。其实核函数起到的作用就是测量高维向量相似度,直接获得数据的高维差异度,以此为依据来进行分类判断。
核函数
我们讨论两种核函数: 多项式核函数和高斯核函数。
多项式核函数
多项式核函数中的常数项参数c非常重要,因为c存在,最终点积结果的表达式中才包含了从低次项到高次项的数据组合,体现出维度的多样性。缺少常数项的话,表达式中只会包含包括高次项。但是对于无常数项参数c的多项式核函数来说,我们也可以将多个不同次的多项式核函数相加组合,使其结果同时具有高低次项,以此丰富维度的多样性。
高斯核函数(RBF)
对这个函数进行数学转化
其中使用泰勒展开,最后这个式子代表,不带常数项c的多项式核函数从低次到无穷高次依次排列,根据不同阶乘系数调整后再相加。
结合上面的多项式核函数,我们知道这样的式子能够体现出无限维度数据高低次项组合无限多样性的特点。我们就实现了在不实质性踏入无限维度的情况下,得到了无限维度下的向量相似度的结果。
总结来说,高斯核函数隐式地将数据点映射到一个 无限维 的空间,计算样本点之间的相似度。通过 RBF 核,我们能够隐式地计算高维空间中的内积,它的值反应了两向量的相似度大小。
在高斯核函数当中,γ是一个大于0的值,当γ值确定,两点距离越大,其相似度越向0靠近,距离越小,相似度越向1靠近;γ值越小,图像越扁平,繁殖越尖锐。扁平和尖窄,决定了高斯核函数相对相似度的判断标准。
这个γ值是我们自己决定的,是一个可控的重要参数。我们放到分类问题当中来
- 小γ值的情况下,数据点间的相似度被放大了,就很容易认为两个数据点是一类。
- 大γ值的情况下,除了距离非常近的数据点以外,其余数据点均与其他店缺乏相似性。也就是说判定两个数据点是一类的更严苛。值越大,条件越严苛,严苛的条件往往会导致过拟合问题。我们放张图来理解:
两种核函数的比较
多数情况下,高斯核函数的效果要优于多项式核函数。
核函数和核技巧
通过 核函数 我们能够计算高维点积,而不需要显式地知道映射到高维空间的特征函数。这个过程被称为 核技巧(Kernel Trick)
SMO简述(序列最小最优化算法)
核函数那里,我们从
推到了
我们的变量变成了α,一个α对应了一个(x,y)。那我们变量的总数等于训练样本的总数。这个优化涉及到大量的变量,特别是在处理大规模数据时,直接求解会非常耗时。
我们提一提坐标上升法
坐标上升法每次只优化一个变量(坐标),而不是同时更新所有变量(梯度下降)。在每一步中,固定其他所有变量,只更新一个变量,直到收敛或达到预定的停止条件。
通过上图来理解,单独优化α1,α2……αn,一步一步地走到函数的极值。
对于我们的SVM能够使用这个方法吗?
别忘了我们有一个限制条件
我们要是选择一个α进行优化而将其他α当做常数的话,意味着有一个α不断改变其他α不变。这样是肯定做不到和为0的,也就不满足我们的限制条件。
SMO怎么做的呢?SMO选择两个α进行优化,来保持平衡,使得和为0。
而两个参数的变化也能够通过下面的推导变成一个参数的变化。
剩下的就是一步又一步的循环了。
序列最小优化算法的核心优势在于:相较于同时处理大规模变量,更新两个变量十分高效(虽然需要重复很多次)
SMO是一个非常有趣的算法,还有许多令人兴奋的精妙点,在此不做详细介绍。
总结来说:SMO通过分解变量众多的问题,将其转化为一个较小规模的额二次规划问题,进而逐步解决。
回首
我们推论了这么久,一步一步解决了我们遇到的问题,还记得我们最开始的目标吗?我们要找的是一个优秀的超平面:
我们令
f(x)大于0我们将其归为正类,f(x)小于0我们将其归为负类。我们想要的一直是w和b,搞半天搞出好多α。我有优化那么多α使得我们目标函数最小,最后完成了我们只拿到了许多α。拿到那么多对跟我拿到w有什么好处呢?
我们不防目光回到核技巧下面求偏导部分:
这里不就将α和w联系起来了吗。
所以决策函数可以写成:
b只是一个偏置项,真正对决策超平面有影响的是w,我们来仔细瞧瞧这个等式
n代表样本量,显然有多少个样本就有多少个αyx。
支持向量机?靠什么确定决策超平面的?支撑向量!就是位于正负超平面上面的
向量。也就是说只有支撑向量会对w起作用其他向量不会。w是一个求和,所有向量(支撑向量+其他)的αyx的和,而只有支撑向量会起作用,我们不难想到其他向量对应的αyx应当为0。当α>0的时候,说明样本是支持向量。如果αi较大就意味着该样本对构建决策边界起着非常重要的作用,如果αi较小该样本对构建决策边界起的作用较小。
w我们拿到了,b怎么求呢? b=y-wx 我们选择一个α>0的样本(支撑向量)进行一个带入就能够求得b了。
w和b皆得,问题完美解决。
结语
SVM曾经何等风光,如今在深度学习的浪潮之下,也有了SVM过时的声音。私以为,学习这件事,可以任性些,觉得有意思就学。少些功利,快乐自会降临。
lc留言:lu加油
感谢这些视频和文章对我的指导:
www.bilibili.com/video/BV16T…
www.bilibili.com/video/BV13r…
www.bilibili.com/video/BV1Nb…
www.bilibili.com/video/BV1AS…
www.bilibili.com/video/BV1xB…
www.bilibili.com/video/BV1kJ…
www.bilibili.com/video/BV1kJ…
www.bilibili.com/video/BV15T…
www.bilibili.com/video/BV1rS…
www.bilibili.com/video/BV1kf…
www.cnblogs.com/xinchen1111…
统计学习方法(第二版)第7章支持向量机 ——李航
动手学机器学习11.2最小序列优化 ——张伟楠,赵寒烨,俞勇