本章涉及到的知识点清单:
1、决策面方程
2、函数间隔和几何间隔
3、不等式约束条件
4、SVM最优化模型的数学描述(凸二次规划)
5、引入拉格朗日函数
6、KKT条件的描述
7、目标函数的等高线与约束条件的最优值分析
8、分类讨论约束条件和拉格朗日乘子的组合
9、求解对偶问题
10、引入松弛变量
11、讨论拉格朗乘子的取值意义和其值域
12、SMO算法的思想
13、多元函数推导为二元函数
14、二元函数推导为一元函数
15、求解一元函数的偏导数,推导出第一个拉格朗乘子的递推关系
16、由约束条件,推导出第二个拉格朗乘子的递推关系
17、由支持向量方程,推导出偏置项的递推关系
18、 优化SMO算法—启发式规则下选择两个拉格朗乘子
19、编程实现SMO算法的步骤
20、非线性数据下的数据维度讨论分析
21、核技巧与核函数
22、几个常用的核函数
一、决策面方程
以二维空间为例,二维空间中任意一条直线方程可以写为
我们将其向量化,可以得到
设用向量w代表矩阵a1和a2,用向量x代表矩阵x1和x2,标量γ代表b,则方程可化表示为
从方程可知,一个n维空间的超平面在二维空间上的表现,可以是一条直线,或者一个曲线(二维空间中只能看到这个n维超平面穿过而无法看到其模样),超平面方程即是我们的决策面方程
二、函数间隔和几何间隔
在SVM监督学习中,我们规定标签数据为+1和-1两个值,这么做的目的,可以计算出任意一个样本点在超平面方程上的表现结果的符号,与标签符号是否一致来判断分类的正确性,为此我们可以引入函数间隔的概念
但是当我们成比例的缩放w和γ,函数间隔的值也将成比例的变化,可是超平面的位置并没有发生任何变化,所以函数间隔并不是我们想要的分类间隔,为此,我们需要引入几何间隔的概念
还是以二维空间出发,任意一点到直线的距离可以写成
我们将其拓展到n维空间,直线方程即是我们的超平面方程,则n维空间中任何一点到超平面的距离可以写成
为此,我们引入几何间隔概念,其中||w||表示向量w的二范数
从几何间隔可以看出,就算等比例缩放w和γ,由于除上了||w||使得几何间隔的值不会改变,它只随着超平面位置的变化而变化,因此,我们要寻找的分类间隔是几何间隔
三、不等式约束条件
SVM算法的目的是找到一个将分类效果达到最合理化的超平面,这个超平面即是分类器。而评估分类器的好坏的标准就是分类间隔的大小
我们定义分类间隔的距离为d,好的分类器应该让所有样本点到决策面的几何间隔都大于等于d
化简上式,不等式两边同时除以d可得
由于||w||和d都是标量,可定义
则上式可化简为
在不等式两边同时乘以yi,即将两个式子化简为一个式子(这里体现了正是因为标签数据为+1和-1,才方便将约束条件变成一个约束方程)
这个约束方程的意义即是任何样本点到超平面(分类器)的几何间隔都大于等于分类间隔
四、SVM最优化模型的数学描述
评估分类器的优劣是分类间隔的大小,且对于任意样本点都满足约束方程
由约束方程可知,当样本点落在支持向量边界上有如下关系
则分类间隔d可以表示为支持向量点到超平面的几何间隔
要让任何样本点都在d之外,即求分类间隔d的最大值,则目标函数可以写成
为了方便在后续最优化处理中对目标函数的求导,我们将目标函数做等效变化
由目标函数是二次的,而约束条件是线性的,则SVM的数学模型即是:不等式约束条件下的二次型函数优化,而求解这一类优化问题,接下来我们需要构造拉格朗乘子函数
五、引入拉格朗函数
目标函数是求解在约束条件g(x)下的二次型函数f(x)的最小值,直观上我们希望构造一个函数L(x),使得L(x)在f(x)的可行解区域内的求出的值和f(x)求出的值完全一样,而在f(x)的可行解区域外,L(x)的值又接近无穷大,这么做的目的,使得我们可以用一个函数L(x)来等效表示原问题的g(x)和f(x)
拉格朗函数的目的,就是将约束条件融合到目标函数中,构造一个新函数来表示目标函数,将有约束的优化问题转化为无约束的优化问题
下面,我们构造拉格朗函数来表示目标函数
其中αi是拉格朗日乘子,每一个约束条件对应一个拉格朗日乘子,其中αi大于等于0
则原优化问题可以转化为
讨论如下条件(1)(2):
(1) 当样本点不满足约束条件时,即说明在可行解区域外
此时将αi置为正无穷大,那么θ(w)显然也是正无穷大
(2) 当样本点满足约束条件时,即说明在可行解区域内
此时θ(w)的最小值就是原目标函数,于是综上所述,引入拉格朗乘子函数后,可以得到新的目标函数
我们用p*表示优化目标函数后的最优解,且与最初的目标函数等价
观察新的目标函数,如果直接求偏导数求解,那么一上来将面对w和b两个未知参数,而αi又是不等式约束,求解过程将非常复杂。换一个角度思考,如果将max和min的位置对调,变成如下新的目标函数
上式变化使用了拉格朗日函数的对偶性,交换后的新问题即是原目标函数的对偶问题,我们用d*来表示对偶目标函数的最优解,可见d*的求导过程比p*相对容易,且d*<=p*,而当满足下列条件时,d*= p*
(1) 优化问题是凸优化问题
(2) 最优值满足KKT条件
因为目标函数本身已经是一个凸函数,而优化问题又是求解最小值,所以目标函数的最优化问题就是凸优化问题,则接下来就要重点讨论KKT条件
六、KKT条件的描述
一个最优化模型能够表示成下列标准形式
其中f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,m和n分别是等式约束和不等式约束的数量
KKT条件即是规定f(x)的最优值必须满足以下(1)(2)(3)条件,只有满足KKT条件,目标函数的最优化问题依然可以用拉格朗日乘子法解决
条件一:目标函数(拉格朗函数)对x的导数为0(这里x代表参数向量)
条件二:h(x) = 0
条件三:∑α*g(x) = 0
很明显,我们需要优化的目标函数属于带有不等式约束函数g(x),所以条件二显然满足,下面我们来分析条件一和条件三的理论
七、目标函数的等高线与约束条件的最优值分析(条件一)
对于KKT条件一的分析,我们假设目标函数是f(x1,x2)的二元函数,它的图像在三维空间里是一个曲面,准确的来说是一个凸曲面
其中g(x1,x2)是约束方程,要求目标函数f(x1,x2)的最小值,即转化为求g(x1,x2)=c这条曲线上的一点,使得f(x1,x2)取得最小值,换个比喻,就是在山上(目标函数曲面)寻找一条山路(约束条件曲线)的最低点
我们画出目标函数的等高线,来分析目标函数最优值和约束条件的关系
对于研究目标函数z=f(x1,x2),当z取不同的值,即将曲线z投影在(x1,x2)组成的空间中(这里指的是二维空间),也就是曲面的等高线,上图中d1和d2即是两条目标函数的等高线,可以看出,当约束函数g(x1,x2)与目标函数的等高线有共同的交点,即证明这组值同时满足在目标函数的可行域中,也符合约束条件的约束关系
如果等高线与g(x1,x2)相交,则是一组目标函数的解,但是这个解一定不是最优解,因为相交意味着肯定存在其它等高线在该条等高线的内部或者外部,可能会使得新的等高线与g(x1,x2)的交点更大或者更小,这就意味着只有当等高线与g(x1,x2)相切,才可能得到最优解(切线可能多条)
所以最优解必须满足:目标函数的负梯度方向与约束函数的梯度方向一致
而上式恒成立的条件就是:拉格朗日乘子α >= 0,且这个式子就是目标函数对各个参数求偏导数的结果,即KKT的第一个条件:目标函数对各个参数的导数为0
八、分类讨论约束条件和拉格朗日乘子的组合(条件三)
对于KKT条件三,可以看出,因为所有的约束函数gi(x)<=0,所有的拉格朗日乘子αi>=0,要使得求和后结果为0,要么某个约束函数gi(x)=0,要么其对应的αi=0
从一个案例出发来分析KKT条件三的逻辑,假设目标函数和约束函数是
将不等式约束构造出拉格朗日函数,并分别对x1和x2求偏导数
而KKT的条件三要求最优解满足 ∑α*g(x) = 0,在这个案例里α和g(x)只有一个,结合条件一,可以得到
根据之前的分析,最优值满足条件三的话,要么α=0,要么g(x)=0
(i):如果α=0,则x1=1,x2=-2,代入g(x1,x2) =10-1-10*(-2)=29>0,发现这组解违背了约束函数g(x)<0,则舍弃这组解
(ii): 如果g(x1,x2)=0,则代入x1和x2的表达式到g(x)中,解出α=58/101>0,发现这组解不违背约束函数,则代入α解出x1=130/101,x2=88/101,则这组解有可能是最优解
综上(i)(ii)讨论,目标函数的最优值符合KKT条件三,也说明了满足强对偶条件的优化问题的最优值必须满足KKT条件
九、求解对偶问题
上面分析了目标函数满足凸优化和KKT条件,则问题转化为求解原问题的对偶问题(即p*=d*)
根据对偶问题描述,先要求内侧w和b关于L(w,b,α)的最小化值,即求L对w和b的偏导数
将w和b的偏导数带入拉格朗函数化简得
整理一下最终化简结果为
从上述结果可以看出,样本的x和y是已知的,此时的L(w,b,α)函数只有一个变量,即αi
我们归纳一下现在的目标函数为
现在目标函数变成了如上形式,其中αi>=0,这里隐含着一个假设,即数据100%线性可分,但是现实生活中,数据往往是不会那么规则的线性化,为此我们需要引入松弛变量
十、引入松弛变量
由于现实世界中的数据都是带有噪音的,也就是数据可能出偏离其正常的位置很远,而出现这种极端现象后往往会影响超平面的选择,也许将无法构造出将数据彻底分开的超平面出来
所以对于处理这种情况,SVM需要允许(妥协)出某些噪音很大的数据点能够偏离超平面,即允许其出现在超平面的错误的一侧,为此我们引入松弛变量C,这样我们的目标函数又变为
接下来为了研究讨论αi的取值范围,我们加上一个负号将目标函数等价转化为
十一、讨论拉格朗乘子的取值意义和其值域
回顾一下最初的约束条件为
设ui为该约束条件,可以归纳出αi关于约束函数的取值意义
上述关系可以描述为:
当αi=0时,样本点属于正常分类,即在两条边界之外或者边界上
当0<αi<C时,样本点属于支持向量,即只在两条边界上
当αi=C时,样本点在两条边界之间
αi只有满足上述3种情况,才能求出最优解,所以当αi与约束条件ui冲突的时候,需要更新这些αi,这也就是满足目标函数的第一个约束限制,即0<=αi<=C
而同时目标函数还受到第二个约束条件的限制,即
所以不能只更新一个αi因子,需要同时再次更新第二个αj因子,也就是α因子总是成对的更新(αi对总是和αj配对),一增一减,此消彼长,才能保证加权和为0的约束,同时这也就是下面提及SMO算法的思想和多元函数化简为二元函数,在从二元函数化简为一元函数的难点
根据这个约束和α因子需要成对更新,假设我们选取的两个拉格朗乘子为α1和α2,则更新之前是old,更新之后是new,且更新前后需要满足和为0的约束
两个因子同时更新显然非常困难,所以需要先求出第一个αj的解,再用αj的解去表示更新第二个αi的解,后文的SMO算法会阐述这一点。因此需要先确定αj的取值范围,假设L和H分别为它的下界和上界,结合目标函数的约束限制来综合讨论L和H的取值关系
(i):当y1和y2异号时,可以得到
移项可得a2 = a1 - A,此时α的取值范围如下图所示
所以此时α的上下界H和L为
(ii):当y1和y2同号时,可以得到
移项可得a2 = -a1 + A,此时α的取值范围如下图所示
所以此时α的上下界H和L为
综上(i)(ii)的讨论,通过y1和y2的异号或者同号,可以推导出α更新后的上下界分别为
这个公式显得非常的重要,它将α因子限制在有效的矩形范围内,在SMO算法中,当我们更新完α后,由于α可能会被更新得很大或很小,因此需要经过裁剪来保证α的在约束条件内
12、SMO算法的思想
回顾之前第九,第十,第十一步的分析,目标函数为
目标函数只包含n个变量α的多元函数,且带有两个约束条件,我们的目的是求出目标函数的最小值,即找到一组α的组合,使得目标函数取得最小值
由第十一步的分析,我们需要不断更新这n个α因子,通过迭代来逼近函数达到最小值,但是如果一次性更新n个参数,将会有n!种组合,那么时间复杂度将会非常高,为此我们首先想到坐标上升(下降)法
来通过一个例子来说明坐标上升法的思路
可知案例中要求一个三元函数的最大值,算法的思想是每次迭代时只更新一个维度,通过多次迭代直到收敛来优化函数的最值,求出三个变量的偏导数推出其关系
通过迭代即就可以求出其最值
SMO算法借鉴了坐标上升(下降)法的思想来优化α因子组合,但是由于目标函数的第二个约束条件有加权和为0的限制,导致每次迭代时候不能只更新一个因子αi,必须同时更新与之配对的另一个因子αj,此消彼长才能保证加权和为0(第十一步中已提及)
所以SMO算法思想是将原始问题中,求解n个参数的二次规划问题,分解成了多个子二次规划问题来分别求解,每一个子问题只需要求解2个参数,即将多元函数推导为二元函数,再将二元函数推导为一元函数
13、多元函数推导为二元函数
目标函数是关于α的N元函数,通过SMO的算法思想,假设每次迭代更新,选取一对α1和α2的组合,其余的乘子不变,首先需要将α1和α2从目标函数中分离出来,也就是将多元函数推导为二元函数
从N元函数中分离出α1和α2因子
由于上式推导结果过于复杂,我们定义2个表达式来表示上式常量部分,用来简化上式
又由于单独存下的常数项对以后的求导没有贡献,所以我们提出单独的常数项定义为Constant
带入vi和Constant表达式,则结果化简为
至此,我们将多元函数推导为含有α1和α2变量的二元函数,接下来将这个二元函数推导为一元函数
14、二元函数推导为一元函数
我们需要推导出α1和α2的关系,然后用α2来表示α1带入二元函数,就可以推导出关于α2的一元函数了
由目标函数的第二个约束条件
同理根据SMO算法思想,从约束条件中分离出α1和α2
将等式两边同时乘以y1,可推导出α1和α2的关系
同理,我们定义两个表达式r和s来表示上式的常量部分,用来简化上式关系
带入r和s后,α1和α2的关系推导为
下面将α1带入我们的二元函数中,可得
至此,我们将二元函数推导为只含有一个变量α2的一元函数,接下来终于可以对目标函数求导了
15、求解一元函数的偏导数,推导出第一个拉格朗乘子的递推关系
我们对一元函数求α2的偏导数为0
带入s=y1*y2和y2*y2=1,整理上式可求出α2
同理,由于上式推导结果过于复杂,我们定义2个表达式来表示上式常量部分,用来简化上式
带入vi和r的表达式
将Ei,η,vi,r的表达式带入α2表达式中继续化简,可得
整理消去同类项,可得
至此,通过繁复的化简推导,我们终于推导出第一个拉格朗乘子α2的递推公式了,也就是SMO算法更新的第一个拉格朗乘子的方式,但是,此时更新后的α2还没有经过裁剪,记得我们在第十一步讨论的关于拉格朗乘子的取值意义和其值域吧,我们需要将更新后的α2裁剪到它的值域范围内,于是有
其中H和L是α2的上下界,在第十一步中我们已经求出
因子SMO算法需要同时更新一对α因子,于是接下来需要推导出第二个拉格朗乘子的递推关系
十六、由约束条件,即可推导出第二个拉格朗乘子的递推关系
我们已知裁剪后α2因子的递推式,由之前的约束条件中α1和α2的关系式
带入未更新的α1、α2和更新裁剪后的α1、α2可以得到如下两式
由上面两式消去r表达式,带入s=y1*y2可以得到
上式即是第二个拉格朗乘子α1的递推式,可以看到其只与更新前的α1和α2,以及更新裁剪后的α2有关。
而我们的分类函数是
其中w向量我们通过拉格朗乘子α来计算出来,还剩下偏置项b,为此需要在SMO算法更新完一对α因子后重新计算更新偏置项b
17、由支持向量方程,推导出偏置项的递推关系
我们知道当样本点属于支持向量时,满足下式
而w向量的表达式是之前w对拉格朗函数的偏导数已经求出
带入w整理得
由于我们是根据SMO算法更新的α1和α2去计算偏置项b,则需要从上式中单独提出i=1和i=2的两项,我们先推导α1对应的偏置项b1的递推式
我们通过f(xi)和Ei的表达式用来化简上式
但是上式没有出现f(x)的结构,所以我们需要用加一项减一项的方法手动构造出f(x)的结构
带入f(xi)和Ei化简上式可以得到b1的递推式
同理b2的递推式为
可以从偏置项b的递推式看出b只与更新前后的α和Ei有关,考虑α的值域,我们可以归纳出更新后的b的表达式为
至此,我们通过SMO算法的思想,经过一个又一个的数学推导,推导出了在每一次迭代过程中α1、α2、偏置项b的递推更新式,通过不断的迭代这些参数来优化模型的目标函数,最后计算出目标函数的最优解参数α和b,从而求出我们的分类函数来做预测
18、优化SMO算法—启发式规则选择两个拉格朗乘子
推导完SMO算法的几个递推更新式用来优化目标函数,我们来讨论如何优化SMO算法
SMO是一个启发式算法,它将原始问题分解为多个二次规划子问题,通过求解一对拉格朗乘子(α1和α2)的解,使得目标函数的值变得更小,从而不断逼近原始问题的解,由此可见需要启发式的选取一对拉格朗乘子来做优化
由第一个因子的递推式分析可知,要使得新的因子得到足够大的变化,而yi和η是常量,则只要让
让变化足够大的α因子使得目标函数有足够大的下降,所以我们可以在编程过程中用一个列表保存每一个Ei,并且在更新完两个α因子后更新维护这个列表,整个SMO算法是一个双重循环过程
至此我们整理出了优化SMO算法的思路:
1、在外层循环中,从样本集里选择任意一个违反KKT条件的乘子,作为SMO算法需要优化的第一个αi
2、进入内层循环,在非边界乘子中寻找让|Ei - Ej|误差最大的样本其对应的乘子,作为SMO算法需要优化的第二个αj
3、如果没有找到,就在整个样本集里随机的选取一个乘子,作为SMO算法需要优化的第二个αj
4、如果更新前后的αj变化太小,则放弃这轮选择,重新进入外层循环再次重新选择第一个αi
19、编程实现SMO算法的步骤
现在,我们梳理SMO算法的编程步骤如下
1、计算误差,并维护进入误差列表
2、在外层循环中选择任意一个不满足KKT条件的样本作为第一个待更新的拉格朗乘子αi
3、在内层循环中,根据SMO的优化思想选择出第二个待更新的拉格朗乘子αj
4、计算αj的值域(上下界)
5、计算学习率η
6、由αj的递推式更新αj
7、由αj的值域裁剪αj
8、由αi的递推式更新αi
9、在误差列表中维护更新后Ei和Ej
10、根据bi和bj的递推式,更新bi和bj,从而更新原始截距参数b
下面为SMO算法的部分截图
程序运行结果
从程序的运行结果中来看,蓝色的线即是超平面,空心圈的点即是支持向量点,可以看到分类效果完全正确,错误率为0,同时也可以看到SVM本质上就是一个二分类器
但是,以上的分类实例属于数据线性可分,当数据完全不能线性可分,又该怎么去寻找其超平面完成分类呢?这也就是SVM模型最厉害也是最神奇的地方,它可以有效的处理非线性数据的分类问题
20、非线性数据下的数据维度讨论分析
当训练数据线性不可分,如果我们停留在这些非线性数据本身所处的世界上观察,显然无法存在一个超平面将数据区分开来,例如以下数据集
我们就用以上这个数据集案例说明如何面对非线性数据
设X1,X2来表示这个二维平面上的数据点,我们写出一般化的二次曲线方程(圆形是二次曲线的特殊情况)
从方程上可以看出,此时数据所处的空间是一个二维空间
如果我们替换其中的维度X1和X2,令Z1=X1,Z2=X1*X1,Z3=X2,Z4=X2*X2,Z5=X1*X2,那么我们就构造了一个新的五维空间,将原始数据拉到了这个五维空间中,那么此时二次曲线的方程在新的世界里可以写为
此时,我们就做了一个映射ϕ,将X按照一定的规则映射为Z,即将数据集映射到一个新空间里
当然,你我不可能画出五维空间,但是如果只考虑三维空间,即修改映射规则为Z1=X1*X1,Z2=X2*X2,Z3=X2,那么此时二次曲线的方程在新的世界(三维空间)里可以写为
我们画出这个三维空间
可以看出在这个世界里,数据是可以通过一个超平面来区分的,为此我们得出一个重要的推论:将非线性数据从它本身的世界映射到N维世界后,数据在新的世界里将变得线性可分
因此,我们定义映射ϕ,用来将数据映射到高维空间,则我们需要修改原分类函数的表现
带入映射ϕ,将xi和xj映射到高维空间
分析到这里可以看到当拿到一个非线性数据,我们就需要找到一个ϕ来映射数据到高维空间,然后在高维空间里做SMO算法即可,即原始问题为:低维空间里解决非线性问题,而做映射后等价于:高维空间里解决线性问题
但是,事情显然不会那么顺利,需要考虑一个问题—维度爆炸
回想一下在最初的例子里,我们将数据所在的原始空间,也就是二维空间做了空间映射,而选择出的新空间是原始空间里所有维度的组合,也就得到了新的五维空间;那么如果数据的原始空间是三维空间,我们对三维空间做空间映射后,会得到一个新的19维空间,发现每当数据的原始空间多一个维度,那么映射后的新空间其维度呈指数级增长,当遇到无穷维的情况,此时根本无法计算分类函数里的其内积
至此,我们知道不能仅仅通过引入高维映射ϕ来解决非线性问题,我们需要另外的技巧
21、核技巧与核函数
数学家们喜欢成将输入空间转换为另一个特征空间称之为从一个特征空间到另一个特征空间的映射,在一般情况下,这种映射会将低维空间映射到高维空间,而为了防止维度爆炸的问题,我们通过核技巧来实现
观察SVM的分类函数f(x),发现所有的计算结果都可以写成内积的形式,向量的内积,即是指两个向量相乘之后得到的单个标量或者单个数值,这是我们推导出SVM的分类函数非常重要也是非常神奇的一点,所谓的核技巧,就是将这个内积计算替换成核函数计算
我们从一个案例说明什么是核函数
假设我们有一个从二维空间映射到五维空间的映射ϕ,我们定义ϕ为
现在有两个二维向量a1=(x1,x2)和a2=(y1,y2)要做点积计算,那么将会有如下两种方法
(i):先映射到五维空间,在做点积运算
(ii):找到一个函数K,直接将原始二维向量带入该K,定义K=(<x1,x2> + 1)^2
综上(i)(ii)讨论来看,两个式子的计算结果完全一样,但是计算的过程区别很明显,(i)是先映射到高维,再计算内积,而(ii)是直接在原来的低维空间进行某个函数的计算,在计算出相同的结果的同时,计算量比起(i)来说小得多,显然(ii)要比(i)优秀得多
通过低维的函数计算得到了先映射再内积的高维结果,这就是核函数。
可以分析出,核函数的引入能隐式的得到相同的高维计算结果,这样可以有效的避免维度爆炸,即避免了在高维空间中做内积计算,我们定义核函数K,则SVM的分类函数可以写为
至此,我们通过核技巧替换内积计算为核函数,SVM模型就可以解决在低维空间里的非线性问题(等价于解决在高维空间里的线性问题)
22、几个常用的核函数
在输入空间转换到特征空间的过程中,对于任意一个映射,要构造出对应的核函数显得非常困难,通常在实际应用中,我们会在一些常用的核函数中进行选择,这一点往往依赖特定的某些领域,而核函数选择的有效性需要通过实验来验证
下面是一些常用的核函数
(1):多项式核函数
其对应的SVM的分类函数,是一个p次多项式,选择该核函数则完整的分类函数为
(2):高斯核函数
其对应的SVM的分类函数,是一个高斯径向基函数,选择该核函数则完整的分类函数为
其中σ是用户自定义的用于确定到达率或者说函数值跌落到0的速度参数,可以通过调控σ来达到理想的分类效果,高斯核也是应用最为广泛的核函数之一
下图是SVM应用核函数后处理非线性数据的结果
可以看到引入核函数的SVM模型也可以高效的判断出非线性数据样本的正确分类
整个SVM的代码见:SVM算法原理