这篇博客的主要讲的是SVM对于非线性分类情况的办法和有噪声时的处理办法,最后介绍了拉格朗日对偶问题的求解算法,主要的标题有:
1. 核函数(SVM非线性分类的解决办法)
2. 松弛变量处理 outliers 方法
3. 坐标上升算法
4. 序列最小优化算法(Sequential minimal optimization, SMO)
我们之前总是假设训练集是线性可分的,但是实际中不总是这样的。核函数(Kernal)是一个解决的办法,它的思想是:将地位的特征转换成高纬,然后利用我们之前学些的解决线性的方法去求解(也许有一天你可以发现自己的方法)。其中核函数就主要是用于低维向量向高纬向量转换,后面你会发现他的神奇。我特别喜欢外国的讲课方式:上来不是理论,而是例子,有例子得到理论,整个过程好像是我们自己在发现。所以大致理解核函数的基本思想之后,我们就从例子出发:
假如现在有这么一个训练集,要你找到一条线将他们区分开来。直线显然是不行的,只能是曲线了。虽然我们这里说的是直线,曲线,其实都应该正确理解,他们都是超平面。如果用 X1,X2 分别表示横纵轴,那么分隔训练集的曲线就可以表示成下面的样子:
然后如果我们就去构造一个五维空间,就可以将这个非线性的分类问题转换成线性分类问题: Z1=X1,Z2=X21,Z3=X2,Z4=X22,Z5=X1X2 ,那么上面的这个式子既可以表示成:
不急我们先来看看我们之前的分类函数:
如果你看了我的上一篇博客,在求解最大间隔分类器的对偶问题的时候,有一重要的中间结果。
将上面的这个中间结果带入到分类函数中就可以得到如下的结果:
然后我们就用 ϕ(.) 表示将低维映射成高纬,比如前面的那个 z=(Z1,Z2,Z3,Z4,Z5) 就是我们这个函数的一个映射结果。之后我们就可以利用线性分类的解法求解了,即就是:
其中的 α 是通过求解如下对偶问题得到的:
再利用我们的中间结果,就可以得到 ω 和 b 的值,最终得到分类函数和超平面。问题倒是可以解决,但是是在高纬空间中,这有时候不是很方便,甚至是不可解的,比如上万维的空间等等。那怎么解决?我们再来举一个例子,设两个向量: x1=(η1,η2)T,x2=(ξ1,ξ2)T ,利用 ϕ 函数映射为高纬空间向量后再做内积:
我们有注意到这样一个式子:
后面的这个式子是我们自己找的,但是发现他和上面那个做内积的式子特别像。假如我们再做定义这样一个映射: φ(x1)=(2√η1,η21,2√η2,η22,2√η1η2,1) 。就会得到这样的结果:
那么 ⟨ϕ(x1),ϕ(x2)⟩ 和 ⟨φ(x1),φ(x2)⟩ 的区别到底是什么?
1. 前者是将低维空间映射成高纬空间后在进行内积。容易造成维度爆照(上面的例子中低维是二维的,高纬就是五维的)
2. 而后者是在低维空间中内积,然后进行平方。不需要显示映射成为高纬空间。
我们就将后者,这种隐式转换的内积函数称之为核函数(Kernel Function)。也就是说核函数是不唯一的,需要根据具体的情况而定。在这个例子中我们的核函数就是:
然后分类函数就表示成这样:
之中的 α ,是又对偶问题求得的:
最终我们就避免的直接在高纬空间中计算,而是通过一种隐式的方式达到了与显式一样的效果。你可能要问我:你后面的这个内积函数和我上面的那个内积函数不一样,至少多加了一个一。原因是这样的,回头看看我们带有核函数的分类函数,和对偶问题的目标函数。他们都对应的变成了我定义的这个核函数,那么求解 α 只与这个对偶问题有关,得到之后就可以和之前一样得到其他的参数,我们就可以用这个带有核函数的分类函数去分类了。我们这里主要强调的是效果,而不是具体的计算值。想想,我们就算的目的不就是为了分类吗?再来看看一个整体的对比:
前面我们在给出核函数的时候说过,核函数不唯一,你可能通过上面的这个过程发现了。下面就让我们来看一些典型的核函数:
1. 多项式核函数 k(x1,x2)=(⟨x1,x2⟩+R)d ,我们上面的那个核函数就是多想核函数的特例,其中 R=1,d=2
2. 高斯核函数 k(x1,x2)=exp(−||x1−x2||22σ2) ,其中 σ 是参数。
3. 线性核函数 k(x1,x2)=⟨x1,x2⟩
既然核函数这么多,你也可以自己构造核函数,那么怎么判断你构造的核函数就是有效的核函数?也就是说,你自己构造了一个核函数,通过计算得到分类函数的分类效果和没有使用你自己的核函数的效果一样吗?有人就建立了理论来解决这个问题,首先我们先要构造一个核矩阵 K ,他的具体构造方式为:假如训练集一共有 m 个验本 {x(1),x(2)...,x(m)} , Kij=k(x(i),x(j)) 。那么就有如下的定理:
若给定核矩阵 K ,如果 K 是一个有效的核矩阵,当且仅当对于任意的 {x(1),x(2)...,x(m)},(m<∞) , Kij=k(x(i),x(j)) ,都有 K 是对称半正定阵。
总结一下,在实际当中我们总会遇到非线性分类的情况,有一种现象就是将低维转换成高位之后就变成了线性分类了,但是我们将低维映射成高纬后进行计算,问题是高纬太高难以计算。那么核函数就是解决这问题的,他通过在低维计算得到了和高纬一样的效果,也可以理解成隐式转换。这样我们就可以处理更多的非线性分类问题。
在实际当中并不是所有的线性分类问题都和我们的例子一样可以用一个超平面完美的分开,总是存在着噪声。比如:
观察上面右边的那幅图,由于上面那个噪声点的出现使得分隔平面发生了很大的旋转。但是,通过人眼观察,其实那个噪声点是可以忽略或者减少他的影响,使得分隔平面不动或者发生很少的旋转。有人就提出了添加松弛变量的思路:
原来的约束是这样的:
给约束条件加入松弛变量后:
其中 ξi 就是松弛变量(slack variable),他的意义在于允许偏离支持向量所在的那条线多远。如果 ξi 无穷大,那么所有的超平面的都满足。所以还要对它进行限制:
这样的话, ξi 就不可能太大。其中 C 是一个参数。那么完整的表示样子就是:
下面我们采用和之前一样的思路求解他,先构造拉格朗日函数,在得到对偶问题,最终得到 α 的值,进而得到分类函数中的参数。首先是拉格朗日函数:
在对拉格朗日函数求导(非拉格朗日乘子):
再将 ω 带回拉格朗日函数,即使得拉格朗日函数值最小:
由于 C−αi−ri=0 , ri>0 ,所以 α≤C ,最终对偶问题就是:
然后求解上面这个式子,就可以最终得到分类函数。到了这一步我们就基本建立了处理线性,非线性和有噪声的分类问题的模型。
现在开始我们就要想办法去解决上面那个求 α 的那个优化问题,但是我们先来看看这个比较简单的坐标上升算法,因为他是我们后面介绍的解决这个优化问题算法就是坐标上升算法的升级版。坐标上升算法解决的是这样一个无约束问题:
算法的实现就是:保留一个坐标可动(或者使得目标函数值增大,或者减小),其他坐标固定不变,自变量不断迭代,直到收敛。描述如下:
我们用一个简单的例子来理解这个算法:
上图中横纵坐标分别为 α1,α2 ,椭圆圈表示二次曲面的登高线,我们假设中心位置的值最大。从右下角的那个蓝色点开始执行坐标上升法,先保持 α2 不变,变化 α1 使得函数值最大,记录此时的 α1 ,再保持 α1 ,变化 α2 使得函数值最大,记录此时的 α2 ,如此交替的进行指导收敛点。收敛点你可以用最优值的必要条件去判断。
下面我们再来看看坐标上升算法的升级版。所谓的升级版的意思是:序列最小优化算法基本思想也是坐标上升,只不过是一次性上升两个坐标。首先我们再来回顾一下我们要解决的目标问题:
在这里的这个 W(α) 和坐标上升算法中的 W 函数表达意义是一样的,这个问题中就是有两个约束条件,我们下来就是考虑这两个约束条件。
首先我们根据
我们在这里只是为了说明算法的原理,就直接选择迭代 α1,α2 ,所以可以将他们表示成:
再结合 α 的约束条件可以得到下图:
下来我们就要去变动 α2 ,所以用 α2 来表示 α1
再将上式带入 W(α) 中:
上面这个式子最终可以化简成一个元二次函数:、
其中 a,b,c 是化简产生的相应参数,在 α2 没有约束的情况下,一元二次函数的极值点是比较简单可以求解出来的。这就使得SMO算法最内层的循环执行的速度会比较快。最后再加上约束,就可以将其表示成:
其中 αnew,unclipped2 是无约束情况下一元二次函数的极值点。进而也就可以得到 α1 ,SMO算法就是这样一次迭代两个自变量,最终求解出目标函数的极值点。知道了 α ,就相当于知道了 ω 。那么怎么更新 b ,我们利用的对偶问题的KKT条件:
你可能想问,为什么选择 α1,α2 ,而不是其他的 α ? 的确上面的这个过程只是为了我们理解这个算法,在算法真正执行过程中是利用一个启发函数来选择到底要迭代哪两个 α 。启发函数的主要思想就是:每次选择 α 时优先选择 0<αi<C 的 αi ,因为边界上的 αi 一般不会再改变了。
[1] Andrew Ng老师的斯坦福公开课
[2] 支持向量机通俗导论(理解SVM的三层境界)
[3] 支持向量机(五)SMO算法
end