上一篇文章中,掌柜分别介绍了什么是支持向量机以及如何通过sklearn来完成整个SVM的建模过程;然后还介绍了什么是线性不可分与核函数。在接下来的这节内容中,掌柜将继续介绍SVM中的软间隔与sklearn相关SVM模型的实现,以及SVM中的软间隔与对偶问题。

1 SVM中的软间隔

1.1 软间隔定义

上一篇文章中,掌柜分别介绍了以下两种情况的分类任务:①原始样本接线性可分;②原始样本线性不可分,但通过ϕ(x)映射到高维空间之后“线性可分”。为什么后面这个“线性可分”要加上引号呢?这是因为在上一节中其实有一件事没有和各位读者交代,即虽然通过将原始样本映射到高维空间的方法能够很大程度上使得原先线性不可分的样本点线性可分,但是这也并不能够完全保证每个样本点都是线性可分 。或者是保守点说,即使完全线性可分了,但也极大可能会出现过拟合的现象。这可能是因为超平面对于异常点过于敏感,或者数据本身的属性所造成,如图1所示。

图 1. SVM软间隔与硬间隔图

在图1中 ,实线为相应的决策面,黑色方块和黑色圆点分别为两个类别的样本。在图(a)中,通过SVM建模得到的决策面已经完美的将两种类别的样本点进行了区分。但是,如果此时训练样本中加入一个异常点,并且继续用SVM建模求解,那么将会得到图(b)中所示的分类决策面。可以发现,虽然此时决策面也成功的区分开了每一个样本点,但是相较于(a)中的决策面却发生了剧烈的摆动,决策面到支持向量的距离也变得十分狭窄。 在SVM中,将图(a)和(b)中决策面到支持向量的间隔称之为硬间隔(Hard Margin),即不允许任何样本出现错分的情况,即使可能导致过拟合。当然,理想情况下期望的应该是图(c)中的这种情况,容许少量样本被错分从而得到一个次优解,而这个容忍的程度则通过目标函数来调节。或者再极端一点就是根本找不到一个超平面能够将样本无误的分开,必须得错分一些样本点。此时图(c)中决策面到支持向量的间隔就被称之为软间隔(Soft Margin)。

1.2 最大化软间隔

从上面的介绍可知,如数据集中出现了异常点那么必将导致该异常点的函数间隔小于1。所以,可以为每一个样本引入一个松弛变量(ξi0)来使得函数间隔加上松弛变量大于等于1。

y(i)(wTx(i)+b)1ξi(1)

那么此时的目标函数可以重新改写为如下形式

minw,b,ξ12||w||2+Ci=1mξis.t.  y(i)(wTx(i)+b)1ξi,  ξi0, i=1,2,...m(2)

其中C>0称为惩罚系数,C越大时对误分类样本的惩罚就越大,其作用等同于正则化中的参数λ 。可以发现,只要错分一个样本点,目标函数都将付出Cξi的代价,并且为了使得目标函数尽可能小,那么就需要整个惩罚项相对要小。因此,如果使用较大的惩罚系数,那么将会得到较窄的分类间隔,即惩罚力度大允许错分的样本数就会减少;如果使用较小的惩罚系数,则会得到相应较宽的分类间隔,即惩罚力度小允许多的错分样本。

1.3 SVM软间隔示例代码

在1.1节内容中,掌柜大致列出了SVM分类器中常见的几个重要参数,如下所示:

在上述代码中,其中C就表示式(2)中的惩罚系数,它的作用是用来控制容忍决策面错分样本的程度,越大则模型越偏向于过拟合。如图2所示为C在不同取值下决策面(分类间隔较大时C=1,分类间隔较小时C=1000)。参数kernel表示选择哪种核函数,当kernel='poly'时可以用参数degree来选择多项式的 次数。但是通常情况下都会选择效果更好的高斯核(kernel=’rbf’)来作为核函数,因此该参数用得比较少。参数gamma为核函数系数,使用默认值即可;coef0为多项式核和sigmoid核中的常数r

图 2. SVM不同惩罚系数下的决策平面

下面掌柜将采用网格搜索来选择一个最佳的SVM分类器对数据集iris进行分类。从上面对sklearn中SVM的API的介绍可知,SVC中需要用到的超参数有5个,其取值这里分别设为:'C': np.arange(1, 10, 5)'kernel': ['rbf', 'linear', 'poly']'degree': np.arange(1, 10, 2)'gamma':[ 'scale', 'auto'],'coef0': np.arange(-10, 10, 5)。由此便有2×3×5×2×4=240个备选模型。同时,这里以3折交叉验证进行训练,则一共需要拟合720次模型。完整示例代码参见Book/Chapter09/02_soft_margin_svm.py文件。

  • 模型选择

首先,需要根据列举出的超参数在数据集上根据交叉验证搜索得到最优超参数组合,代码如下:

在完成超参数搜索后,便能够得到一组最优的参数组合,如下所示:

从上面的结果可以看出,当惩罚系数 C=6,以及选取高斯核函数时对应的模型效果最好,准确率为0.986。并且由于最后选取的是高斯核,所以此时coef0degree这两个参数无效。

  • 训练与预测

在通过网格搜索找到对应的最优模型后,可以再次以完整的训练集对该模型进行训练,代码如下:

可以看出,此时模型在测试集上的准确率为0.985左右。当然,如果有需要的话还可以将训练好模型进行保存以便于后期复用,具体方法将在第7章中进行介绍。

1.4 小结

在本节中,掌柜首先介绍了什么是软间隔及其原理;然后以iris分类数据集为例,再次介绍了在 sklearn中如何用网格搜索来寻找最佳的模型参数。到此,掌柜就介绍完了SVM算法第一阶段的主要内容,可以发现内容不少并且也有相应的难度。在接下来的几节内容中,掌柜将首先和读者朋友们一起回顾一下好久不见的拉格朗日乘数法;然后再介绍求解模型参数需要用到的对偶问题;最后便是SVM的整个优化求解过程。

2 拉格朗日乘数法

在正式介绍SVM算法的求解过程之前,掌柜先来带着各位读者回顾一下拉格朗日乘数法,因为这同时也是第10章中用来对聚类算法求解的工具。可能对于一部分读者来说,使用拉格朗日乘数法已经是很多年前的事情了,其中的细节也自然是慢慢模糊了起来。但是对于拉格朗日乘数法的作用几乎是大家都不会忘记的,那就是用来求解条件极值。既然大多数读者的记忆都停留在这个地方,那么掌柜下面就从条件极值开始来简单的介绍一下拉格朗日乘数法。

这里首先以一个例题来重温条件极值的求解过程。求解目标函数z=xy在约束条件下x+y=1的条件极值。

首先作拉格朗日函数

F(x,y,λ)=xy+λ(x+y1)(3)

由式(3)可得函数F的驻点为

Fx=y+λ=0Fy=x+λ=0Fλ=x+y1=0(4)

求解方程组(4)便可求得x,y,λ分别为

x=12;y=12;λ=12(5)

由此便可以知道,目标函数z=xy在约束条件下x+y=1的条件极值为z=0.5×0.5=0.25。不过为什么可以通过这样的方法来求得条件极值呢?

2.1 条件极值

在数学优化问题中,拉格朗日乘数法(Lagrange multipliers )是一种用于求解等式约束条件下局部最小(最大)值的策略。它的基本思想是通过将含约束条件的优化问题转化为无约束条件下的优化问题,以便于得到各个未知变量的梯度,进而求得极值点[1]。因此,一句话总结就是拉格朗日乘数法是一种用来求解条件极值的工具。那么什么又是条件极值呢? 所谓条件极值是指,在一定约束条件下(通常为方程)目标函数的极值就称为条件极值。

如图3所示,目标函数z=f(x,y)在其定义域上的极大值(也是最大值)为z=f(x1,y1),但如果此时对其施加一个约束条件φ(x,y)=0,那这就等价的告诉函数z=f(x,y)取得极值点同时还要满足约束条件[2]。因此,z=f(x,y)在约束条件φ(x,y)=0下的极值点只能在(x0,y0)处获得(因为此时的φ(x0,y0)=0,而φ(x1,y1)0即不满足约束条件)。

图 3. 条件极值图

现在,相信各位读者朋友对条件极值已经有了一个直观上的理解,那么接下来要探究的就是怎么才能求得这个极值。

2.2 求解条件极值

通常来说,对于包含有等式约束条件目标函数的条件极值可以通过拉格朗日乘数法(Lagrange Multipliers)来进行求解。因此,对于多元函数Z=f(x,y,z,...)在多个约束条件φ(x,y,...)=0,ϕ(x,y,...)=0,...下的条件极值,利用拉格朗日乘数法求解的步骤可以总结为[2]:

1) 作拉格朗日函数

F(x,y,z,...,λ,μ,...)=f(x,y,z,...)+λφ(x,y,...)+μϕ(x,y,...)+...(6)

其中λ,μ称为拉格朗日乘子。

2) 求多元函数F(x,y,z,...,λ,μ,...)的驻点

解如下方程组求得驻点(x0,y0,z0,...,λ0,μ0,...)

{Fx=0Fy=0Fλ=0(7)

那么此时f(x0,y0,z0,...,)便是可能的条件极值。

2.3 小结

在本节中,掌柜首先介绍通过一个引例介绍了如何通过拉格朗日乘数法来求解条件极值;然后总结了如何用拉格朗日乘数法来求解多元函数的条件极值。对于拉格朗日乘数法,我们在后续介绍聚类算法的求解过程中同样也会用到,因此有必要知道其具体求解步骤。

3 对偶性与KKT条件

在上一节内容中,掌柜介绍了什么是拉格朗日乘数法以及它的作用。同时掌柜还特意说到,拉格朗日乘数法只能用来求解等式约束条件下的极值。但是当约束条件为不等式的时候又该如何进行求解呢?

3.1 广义拉格朗日乘数法

由拉格朗日乘数法可知,对于如下等式条件的约束问题

minw  f(w)s.t.   hi(w)=0,i=1,,l.(8)

其中w是一个n维向量。

从式(8)可以很明显看出这是一个含有等式约束条件下的条件极值问题,因此用拉格朗日乘数法就能解决。进一步可构造如下拉格朗日函数

L(w,β)=f(w)+i=1lβihi(w)(9)

其中βi是拉格朗日乘子。最后,通过对式子中所有的参数求偏导,令其为0便可求解得到所有未知变量。

此时,我们接着看如下优化问题

minw f(w)s.t.   gi(w)0,i=1,,k.       hi(w)=0,i=1,,l.(10)

从式(10)可以看出,与式(8)明显不同的就是在式(10)中多了不等式约束条件。因此,为了解决这类问题需要定义如下所示的广义拉格朗日乘数法(Generalized Lagrangian)[3] :

L(w,α,β)=f(w)+i=1kαigi(w)+i=1lβihi(w)(11)

其中αiβi都是拉格朗日乘子,但接下来的求解过程与之前就大相径庭了。

3.2 原始优化问题

根据式(10)(11)考虑如下定义:

θP(w)=maxα,β:αi0L(w,α,β)(12)

(12)表示的含义是求得最大化L(w,α,β)α,β的取值,即α,β作为自变量与w无关,最终求得的结果θP是关于w的函数。 因此,如果原约束条件gi(w)0hi(w)=0均成立,那么式(12)即等价为

maxα,β:αi0[i=1kαigi(w)+i=1lβihi(w)](13)

则此时有θP(w)=f(w)+0

同时,我们现在来做这样一个假设,如果存在gihi使得原约束条件不成立,即gi(w)>0 或者 hi(w)0,那在这样的条件下θP会发生什么变化呢?如果gi(w)>0,为了最大化L,只需要取αi为无穷大,则此时L为无穷大,但这样没有意义;同样,如果hi(w)0,取β为无穷大(hiβ同号),则最后结果同样会无穷大。于是在这种情况下便能得到θP(w)=

进一步,结合上述两种情况就能得到下面这个式子:

θP(w)={f(w),if w satisfies primal constraints,otherwise(14)

再进一步,在满足约束条件的情况下最小化θP(w)就等同于式(10)中所要求解的问题。于是便能得到如下定义

p=minwθP(w)=minwmaxα,β:αi0L(w,α,β)(15)

同时,将式(15)其称为原始优化问题(Primal Optimization Problem)。

3.3 对偶优化问题

接下来继续定义

θD(α,β)=minwL(w,α,β)(16)

(16)表示的含义是求得最小化L(w,α,β)w的取值,即w作为自变量(与α,β无关),最终求得的结果θD是关于α,β的函数。 此时便能定义出原问题的对偶问题

d=maxα,β:αi0θD(α,β)=maxα,β:αi0minwL(w,α,β)(17)

并将(17)称为对偶优化问题(Dual Optimization Problem)。 可以发现,式(15)和式(17)的唯一区别就是求解顺序发生了变化,前者是先最大化再最小化;而后者是先最小化然后再最大化。

那么原始问题和对偶问题有什么关系呢? 为什么又要用对偶问题? 通常情况下两者满足以下关系

d=maxα,β:αi0minwL(w,α,β)minwmaxα,β:αi0L(w,α,β)=p(18)

证明 由式(12)(16)可知,对于任意的w,α,β

θD(α,β)=minwL(w,α,β)L(w,α,β)maxα,β:αi0L(w,α,β)=θP(w)(19)

所以有

θD(α,β)θP(w)(20)

进一步根据式(20)

maxα,β:αi0θD(α,β)minwθP(w)(21)

由此便得到了式(18)中的不等式。 在上述过程中,之所以要用对偶问题是因为直接对原始问题进行求解异常困难,所以一般会通过将其转转换为对偶问题进行求解。但就目前来看,两者并不完全等同,其解也就必然不会相同。所以下面就需要进一步介绍KKT条件。

3.4 KKT条件

在3.3节中掌柜介绍到,要想用对偶问题的解来代替原始问题的解,就必须使得两者等价。对于原始问题和对偶问题,假设函数f(w)gi(w)是凸函数,hi(w)是仿射函数,且存在一个w,使得不等式gi(w)严格可行(即对于所有的i都有gi(w)<0),则wα,β同时是原始问题和对偶问题解的充分必要条件是w,α,β满足 (Karush-Kuhn-Tucker, KKT)条件[3]:

wiL(w,α,β)=0, i=1,,n(22)
βiL(w,α,β)=0, i=1,,l(23)
αigi(w)=0,i=1,,k(24)
gi(w)0, i=1,,k(25)
αi0, i=1,,k(26)

其中式(24)称为KKT的对偶互补条件(Dual Complementarity Condition)。由此可以得到,如果αi>0,则必有gi(w)=0,而这一点也将用来说明SVM仅仅只有少数的“支持向量”。同时,需要注意的是KKT条件中计算的是目标函数L(w,α,β)中的未知数以及所有等式约束条件拉格朗日乘子的偏导数。

因此,若存在w,α,β满足上述KKT条件,那么w,α,β既是对偶问题的解同样也是原始问题的解。

3.5 计算示例

在介绍完对偶问题的相关求解原理后,下面再通过一个示例来进行说明。试求解以下优化问题:

minxf(x)=x12+x22s.t.h(x)=x1x23=0 g(x)=(x13)2+x2220(27)

由于式(27)中的优化问题相对简单,所以可以先通过作图来直观的理解一下,如图4所示。

图 4.对偶问题计算示例图

如图4所示,黑色虚线圆环为目标函数f(x)在水平面上的等高线;黑色直线为等式约束条件h(x)的函数图像;整个灰色圆为不等式约束条件g(x)的函数图像。从图示中可以看出,由于目标函数f(x)需要约束条件h(x),这就意味着最终求得的最优解必须位于直线h(x)上;同时,由于f(x)还要满足约束条件g(x),所以解必定会在h(x)g(x)相交的线段上。最后,由于是求解f(x)在约束条件下的最小值,所以最优解就是图4中的黑色圆点。 进一步,针对这一问题可以得到如下广义拉格朗日函数

L(x,α,β)=(x12+x22)+α[(x13)2+x222]+β(x1x23)(28)

根据式(15)可知,式(28)对应的原始问题为

p=minxmaxα,β:α0L(x,α,β)(29)

进一步,式(29)对应的对偶问题为

d=maxα,β:α0minxL(x,α,β)(30)

因此,接下来便可以通过(30)中的顺序来进行求解。

1) 最小化L(x,α,β)

此时将α,β视为常数,那么这时L(x,α,β) 就只是x的函数。因此可以通过令偏导数为零的方式来求得L(x,α,β)的最小值。故,此时有

{Lx1=2x1+α(2x16)+β=0Lx2=2x2+2αx2β=0