SVM系列-小白都看得懂的SVM学习笔记

来源:互联网 发布:php curl 下载文件 编辑:程序博客网 时间:2024/06/03 23:53

之前学SVM的时候是在看Deformable Part Model的论文才去翻看了Bishop的经典书籍,学了个推导。学的时候是小白,只弄懂了SVM推导的过程,但是一些细节是知其然不知其所以然。所以参考了一些博客和书籍,总结一下SVM的一些知识点和经常被忽略的细节。这是自我认知的学习笔记,也希望能帮到一些和我一样的小白

在机器学习领域,无论是分类还是回归,都可以看做是一个用数据去雕刻一个模具的过程。回归模型是给定输入数据x∈Rn, 输出预测实数值y;而分类模型是给定输入数据x,输出分类预测{+1, -1}。本质上,分类和回归的思路是一样。

通常,我们有两个数据集,training set 和testing set; 我们先用training set的数据去雕刻模具(模型),再用testing set 数据去检验模型的性能。

  • training set 通常包含输入x和输出y,告诉你“这样的x我期望得到这样的y”
  • testing set 也包含多个输入x和输出y,让你“根据这个x预测y的值,并和我的y比较”
  • 通常,training set的数据量要远超过testing set

数据集的选择是影响机器学习性能的一大关键点。好的数据集能保证在训练之后,用新加入的testing数据也可以做出精准预测;而差的数据集即使在给定的testing set能有100%的预测率(无论是分类预测还是回归预测),也很难应用到开放的测试数据中。关于数据集的质量胖丁我也半知半解,有兴趣的朋友可以自己研究一下。

————————————————万恶的分割线———————————————————-
在这里,我们先写下SVM的几个特性,后面我们会慢慢说明:

  • SVM的模型只取决于training set中的少数几个点
  • 基本的SVM模型假设所有数据点线性可分,即存在一个线性方程将两个类别的点分隔在两边
  • SVM算法的一大前提是其代价函数(cost function)是凸函数(convex):
    • 在机器学习领域,凸函数通常是保证我们能得出全局最优解的前提。
    • 对于一个函数f(x),我们可以这么求证它是凸函数:如果x0我们有 f(x)0,则可以说f(x)的Hessian矩阵(二阶导矩阵)是半正定的,所以f是凸函数
    • 在凸函数领域,当原问题不方便求解时,我们可以先求解其对偶问题;在满足一定条件的情况下,其对偶问题的解等同于原问题的解。
  • 核函数是SVM的魅力所在,不同选择的核函数使得SVM的分类面更加变化多端

SVM分类器既是分类模型,也可以看作线性回归模型。以SVM使用最普遍的binary分类来说(即两个类别做分类),SVM分类器通过寻求最佳分类边缘的方式,将两个类别的点(x向量)用我们的最佳边缘分割开。对于n=2而言,就是寻找一条最完美的直线;如果n>2,则是寻找超平面。我们的任务就是要找到这个最佳边缘,使得

  • 两个类别的点分处于直线/超平面(super plane)两边
  • 直线与最近的点的(Euclidean)距离尽可能大

接下来我们来进行最复杂也是最有趣的部分—-SVM的推导。
首先,我们要定义我们对于模型的假设函数(hypothesis):
y(x)=wTϕ(x)+b
其中,x,wRn, bRϕ(x)叫做核函数,在这里为了简便,我们假设核函数为ϕ(x)=x。注意这里的wTx是dot product,即wTx=w1x1+w2x2+...+wnxn
所以我们寻找最佳边缘的任务,也就是根据训练集 D = {(x1,t1),(x2,t2),,(xm,tm)},寻找最佳的wb的任务。在这里,ti{+1,1}表示的是两个类别的标签。我们可以这么定义tiy(xi)的关系:

  • y(xi)>0 时, ti=+1
  • y(xi)<0 时, ti=1
  • (当y(xi)=0 时, xi在我们的分类面上)

因为我们假设所有的数据点线性可分,所以存在这么一个y0(x)=w0Tx+b0使得tiy0(xi)>0对于所有xi成立。我们的目标就是找到这么一个y0使得距离最近的点到y0(x)=0这个分类面的距离最大化。

接下来,我们对y里面的参数wb进行归一化:分别变成w/wb/w。(w=w21+...+w2n)归一化的处理并不会影响tiy(xi)>0这一性质,因为它并不会改变y(xi)的符号。所以归一化后我们得到:
δi=tiy(xi)w=|y(xi)|w

是不是很眼熟?这就是xi到分类面的Euclidean距离。现在我们可以来定义我们所求解的问题:

argmaxw,b{1wmini(ti(wTϕ(xi)+b))}

通俗点解释这道式子,就是我们要找到这么一对wb,使得|y(xi)|w的最小值最大,也就是最大化距离分类面最近的点xi。在这里,我们可以把1w移到min外面,因为它的值不取决于i。而这个xi,就是SVM里面的support vector,支持向量。

前面说过,我们的模型wb只取决于少数的点,就是这些支持向量。支持向量的个数至少会有两个。因为如果你只找到一个支持向量,那么你只要稍微把分类面平移远一些,一定能再找到至少一个。SVM优美的地方就在于,它在保证所有点正确分割的情况下,只关注少量的支持向量,以求出最公平的分类边界。

现在我们要来找wb了。

式子太复杂了啊!!胖丁我比较笨,所以先给支持向量们加一个条件,让式子简化一下:

ti(wTϕ(xi)+b)=1

我们知道mini(ti(wTϕ(xi)+b))得到的i就是支持向量的下标,那么因为支持向量们被胖丁限制住了,所以

mini(ti(wTϕ(xi)+b))=1

换句话说,我们的优化问题变成了

argmaxw,b{1w}

也就是

minw,b{w}

因为我们后面会将这个式子求导,所以我们稍微改变一下:

minw,b12w2

这是一个凸函数求极值。然后把限制条件也改一下:

ti(wTϕ(xi)+b)10

但是就是这样一道问题,胖丁还是解不出来~所以,只能借助先人伟大的智慧—-Lagrange 乘子法。

对于一般优化问题:

{minwf(w)s.t.gi(w)0

根据Lagrange乘子法求极值法则,我们能得到Lagrange公式:

L(w,a)=f(w)+i=1naigi(w)

其中a=(a1,,an)T为Lagrange乘子。由于我们要求解一个拥有不等式约束的优化问题,我们需要用到KKT条件:
wL(w,a)=0ai0aigi(w)=0

其中第三个条件实际上造就了SVM的高效性:当gi(w)<0时,ai=0。这使得我们只需要考虑少量的ai0而不是所有ai

这里我们省略了原Lagrange和KKT条件中的等式项,因为SVM优化的元问题中并没有等式约束项。

接下来我们简单介绍一下Lagrange+KKT的基本原理。不求面面俱到,只求通俗易懂。实际上,Lagrange本身只有一个约束条件:ai0,而KKT中的第一和第三个条件是可以推导出来的。

通过观察我们可以发现,原问题的minwf(w)其实相当于:

minwf(w)=minw(maxaL(w,a))

因为ai0而且gi(w)0,也就是说aigi(w)0。那么当我们对L(w,a)求最大值的时候,我们可以找出适合的a使得aigi(w)=0,这就是KKT中的第三个条件。所以有:

f(w)=maxaL(w,a)

那么要如何求minw(maxaL(w,a))呢?前面我们说过,

“在凸函数领域,当原问题不方便求解时,我们可以先求解其对偶问题;在满足一定条件的情况下,其对偶问题的解等同于原问题的解。”

也就是说

f(w)=minw(maxaL(w,a))=maxa(minwL(w,a))

通过观察我们发现,对偶问题中的minwL(w,a)实际上就是对L(w,a)求导并找出w使得wL(w,a)=0。这就是KKT中的第一个条件。

至此,我们得到了KKT的全部三个条件。在满足这三个条件的情况下,我们就能找到最佳的w;也就是SVM中的wb

接下来我们把Lagrange公式和KKT条件移植到我们的问题上:

L(w,b,a)=12w2i=1nai{ti(wTϕ(xi)+b)1}

由于元问题条件中的 gi(w)0变成了ti(wTϕ(xi)+b)10,也就是(ti(wTϕ(xi)+b)1)0,所以我们把Lagrange公式中间的+换成了

ti(wTϕ(xi)+b)10wL(w,b,a)=0bL(w,b,a)=0ai0ai{ti(wTϕ(xi)+b)1}=0

探究第二个条件可得:

w(12w2i=1nai{ti(wTϕ(xi)+b)1})=0

wi=1naitiϕ(xi)=0

w=i=1naitiϕ(xi)

探究第三个条件可得:

b(12w2i=1nai{ti(wTϕ(xi)+b)1})=0

i=1naiti=0

将第二个条件和第三个条件的推导代入Lagrange公式,(省略步骤)可得:

L(a)=i=1nai12i=1nj=1naiajtitjϕ(xi)Tϕ(xj)=a112aTDa

带有约束条件:

ai0i=1naiti=0

到这里,我们就可以通过找出最佳的a值,使得L(a)达到最大值,然后代入公式求出w0b0。求解a的过程是一个典型的二次规划(quadratic programming)问题。借度娘的来解释一下什么是二次规划:
典型的二次规划问题

SMO算法是解决二次规划问题的常用方法之一,特别对于线性SVM的求解有较好的表现。原算法的论文参考John C. Platt在1998年发表的《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》

以下内容参考
http://blog.csdn.net/huangynn/article/details/18553069?locationNum=11
并加以改进和完善

John C. Platt给这个QP问题的ai的范围加上了一个上限C,即原问题变成:

L(a)=i=1nai12i=1nj=1naiajtitjϕ(xi)Tϕ(xj)

s.t.
0aiCi=1naiti=0

我们知道,式子中tixi的值都是固定的,而ϕ也是固定的函数。

算法的基本思路是:使用迭代优化,先选取一个符合条件的a序列,每次对其中2个项进行迭代优化,直到得到最优解。SMO的高效性体现就体现在其每次迭代只更新2个项,而固定其他n-2个参数的值不变,减少冗余的计算量。

而之所以一次迭代2个参数而非1个,是因为限制条件中的第二个不允许只改变单一个ai的值。

下面是一次迭代的示例:

假设我们已经拥有一组序列a={a1,,an}且满足上面两个限制条件。假设我们选取a1a2作为迭代参数,并固定其他参数的值:

a1t1+a2t2=i=3naiti=Q

根据t1t2的值不同,我们要考虑两种情况:

{a1a2=Qa1+a2=Q

在这里我们分别规定两种情况的上下限,后面有用:
t1=t2
{Bupper=min(C,a2+a1)Blower=max(0,a2+a1C)

t1=t2时:
{Bupper=min(C,a2a1+C)Blower=max(0,a2a1)

a1a2的形式表示出来就是a1=(Q+a2t2)t1,或者分成两种情况:
{a1=Q+a2a1=Qa2

将其代入L(a)
L(a1,a2,,an)=L((Q+a2t2)t1,a2,,an)

由于除了a1a2之外的ai都是固定值,我们可以得到:

L((Q+a2t2)t1,a2,,an)=αa22+βa2+γ

已知αβγ是常数。要得到最大值的L,我们可以对L求导并求解二元一次方程a2L=0,然后代入a2求出a1

然而,a2的值本身还有上限和下限:

anew2=Bupperanew2Blowerif anew2>Bupper if Bloweranew2Bupper if anew2<Blower 

最后可以由a的最佳序列,算出最佳的w,进而算出b

(未完待续)

松弛变量:

由于我们假设所有在D上面的点线性可分,我们有原问题:

minw,b12w2s.t. ti(wTϕ(xi)+b)10

但是现实问题中,D通常是线性不可分的,所以我们要允许【少许】的点不满足原问题的限制条件。而这个【少许】的量,就由松弛变量ξ决定:

minw,b12w2+Ci=1nξi s.t. ti(wTϕ(xi)+b)1+ξi0

Cni=1ξi就是错误分类的惩罚项。

由于有松弛变量的加入,对偶函数的求解难度较高。可以使用hinge代替原损失函数。
(未完待续)

参考博文:
http://blog.sina.com.cn/s/blog_67ad2e480100zaue.html
http://www.wtoutiao.com/p/104xLRm.html
http://blog.csdn.net/xianlingmao/article/details/7919597
http://wenku.baidu.com/link?url=vJvmMRrRVd0_nN9_xDKi_yd8TUYRBz0oji1l_aDjQjtOc02ylR4BAfb0hgrjzTeu8Gxw79HNdtl4WUu-b4jHKft7C-RPjKP3lmz_0Hl_B8y
《Machine Learning and Pattern Recognition》 –Christ Bishop

0 0
原创粉丝点击