Andrew Ng机器学习公开课笔记 -- 支持向量机

先继续前面对线性分类器的讨论,
通过机器学习算法找到的线性分类的线,不是唯一的,对于一个训练集一般都会有很多线可以把两类分开,这里的问题是我们需要找到best的那条线

  首先需要定义Margin,直观上来讲,best的那条线,应该是在可以正确分类的前提下,离所有的样本点越远越好,why?
  因为越靠近分类线,表示该点越容易被分错,比如图中的C点,此时y=1,但是只要分类线略微调整一下角度,就有可能被分为y=-1
  但对于A点,就可以非常confident的被分为y=1 。所以分类线越远离样本点,表示我们的分类越confident

    image

  那么如果定义“远”这个概念?
functional margin
  图中的分类线为,wx+b=0 。那么点离这条线越远,有wx+b>>0或<<0,比如A点
  前面加上y保证距离非负,所以functional margin定义为 :
    image ,y取值{-1,1}
  可以看出当点离线越远时,这个margin会越大,表示分类越confident
  并且margin>0时,证明这个点的分类是正确的。因为比如训练集中y=1,而由线性分类器wx+b得到的结果-0.8,这样表示分错了,margin一定是<0的。

  对于训练集中m的样本,有
    image  ,即,整体的margin由最近的那个决定
  如果要用functional margin来寻找best分类线,那么我就需要找到使得 image 最大的那条线。

  但使用functional margin有个问题,因为你可以看到image取决于w和b的值,你可以在不改变分类线的情况下,无限增加w和b的值,因为2x+1=0和4x+2=0是同一条线,但得到的functional margin却不一样。

geometric margins
  再来看另外一种margin,从几何角度更加直观的表示“远” 。即该点到线的垂直距离,比如图中A到线的距离image
          image 
  现在问题是,如何可以求解出image
  可以看到A和分类线垂直相交于B,B是满足wx+b=0的等式的。所以我们通过A的x和image,推导出B的x,最终通过等式求出image

  如果A的x为 image ,AB间距离为image 

  那么B的x为 image,于是有:image 
  求得:
    image 
  考虑y=-1的情况,最终得到如下:
    image 
  可以看到,如果||w|| = 1,那么functional margin 等于geometric margin
  那么对于geometric margin,无论w,b的取值都不会改变margin的值,其实就是对functional margin做了标准化。

 

The optimal margin classifier

  先简单看看凸优化的概念

凸优化问题

用一个比较通俗的方式理解
为什么要凸优化?
这种优化是一定可以找到全局最优的,因为不存在局部最优,只有一个最优点。
所以对于梯度下降或其他的最优化算法而言,在非凸的情况下,很可能找到的只是个局部最优。

凸集,http://en.wikipedia.org/wiki/Convex_set

很好理解,对于二维的情况比较形象(作为例子)集合中任意两点的连线都在集合中:
imageimage

凸函数,http://en.wikipedia.org/wiki/Convex_function

函数图上任意两点的连线都在above这个图中(这个应该取决于上凸或下凸,都below也一样)

换个说法,就是他的epigraph是个凸集,其中epigraph就是在这个函数上或以上区域所表示的点集。

image image
典型的凸函数,如quadratic function f(x)=x^2 and the exponential function f(x)=e^x for any real number x

凸优化问题的定义

在凸集上寻找凸函数的全局最值的过程称为凸优化。即,目标函数(objective function)是凸函数,可行集(feasible set)为凸集。

为何目标函数需要是凸函数?
这个比较容易理解,不是凸函数会有多个局部最优,如下图,不一定可以找到全局最优
image

为何可行集需要为凸集?
稍微难理解一些,看下图
虽然目标函数为凸函数,但是如果可行集非凸集,一样无法找到全局最优:
 image

 

  接着看这个问题,根据上面的说法,要找到最优的classifier就是要找到geometric margin最大的那个超平面。

  即,最大化geometric margin image ,并且训练集中所有样本点的geometric margin都大于这个image (因为image)
  这里假设||w||=1,所以function margin等同于geometric margin,这里用的是function margin的公式

      image 

  这个优化的问题是:约束||w||=1会导致非凸集!  (想想为什么?)

  所以要去掉这个约束,得到

      image

  但这个优化仍然有问题,目标函数image 不是凸函数,因为是双曲线,明显非凸!

  继续,由于function margin通过w,b的缩放可以是任意值,所以增加约束 image ,这个约束是成立,因为无论image得到什么值,通过w,b都除以image,就可以使image

  于是就有:
  image ,使这个最大化,即最小化image  (为什么要加上平方?因为二次函数是典型的凸函数,所以这样就把非凸函数转换为凸函数)

  最终得到,

  image

  这是一个凸优化问题,可以用最优化工具去解

 

Lagrange duality

  先偏下题,说下拉格朗日乘数法,为什么要说这个?
  因为我们在上面看到这种极值问题是带约束条件的,这种极值问题如何解?好像有些困难。

  拉格朗日乘数法就是用来解决这种极值问题的,将一个有n 个变量与k 个约束条件的最优化问题转换为一个有n + k个变量的方程组的极值问题
  参考http://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E6%95%B0

 

  定义, 对于如下的极值问题,求最小化的f(w),同时需要满足i个约束条件h(w)

    image

  利用拉格朗日数乘法,变成如下的极值问题

    image   ,其中image 称为Lagrange multipliers(拉格朗日算子)

  最终,求下面这个方程组,解出w和拉格朗日算子β,求出f(w)的极值。
    image 

  再看看wiki上的例子,好理解一些:

  假设有函数:f(x, y),要求其极值(最大值/最小值),且满足条件g\left( x,y \right) = c,

            image

  看图,画出f(x,y)的等高线,和约束条件g(x,y)=c的路径,会有多处相交。只有当等高线和约束条件线相切的时候,才是极值点
  因为如果是相交,你想象沿着g(x,y)=c继续前进,一定可以到达比现在f值更高或更低的点;那么求相切点,就是求解f和g的偏导为0的方程组。

 

  说到这里,还不够,因为你发现上面的约束条件是不等式。。。
  于是继续看更通用化的拉格朗日数乘法

    image

  既有等式,也有不等式的约束,称为generalized Lagrangian

    image  ,其中,image

这里先引入primal optimization problem

  image

  这个啥意思?

  这里注意观察,当约束条件不满足时,这个式子一定是无穷大,因为如果g>0或h不等于0,那么只需要无限增大image ,那么L的最大值一定是无限大, 而只要满足约束条件, 那么L的最大值就是f。

  即,
  image

  所以,primal optimization problem就等价于最开始的minf(), 并且primal optimization problem是没有约束条件的,因为已经隐含了约束条件。
min的那个一定不是无穷大,所以一定是满足约束条件的。

  image

 

再引入dual optimization problem

  image

  和prime问题不一样,这里以image 为变量,而非w

  image

  而且可以看到和prime问题不一样的只是交换了min和max的顺序,并且简单可以证明:

  image

  这不是L的特殊特性,而是对于任意函数maxmin都是小于等于minmax的,可以随便找个试试呵呵

  并且在特定的条件下

  image

  这样我们就可以解dual问题来替代prime问题。

  为何这么麻烦?要引入dual问题,因为后面会看到dual问题有比较有用的特性,求解会比较简单。

 

  前面说了,只有在特定条件下,才可以用dual问题替代prime问题
  那么这条件是什么?这些条件先列在这里,不理解没事
  所有g函数为凸函数,而h函数为affine,所谓affine基本等同于linear,image ,只是多了截距b
  假设存在w可以让gi(w)<0对所有i 都成立的,即约束gi 是严格可行的。
  满足上面的假设后,就一定存在w∗, α∗, β∗满足p∗ = d∗ = L(w∗, α∗, β∗),并且这时的w∗, α∗ and β∗ 还满足KKT条件,

    image

  并且,只要任意w∗, α∗ and β∗满足KKT条件,那么它们就是prime和dual问题的解
  注意其中的(5), 称为KKT dual complementarity condition ,要满足这个条件,α和g至少有一个为0,当α>0时,g=0,这时称“gi(w) ≤ 0” constraint is active,因为此时g约束由不等式变为等式。
  在后面可以看到这意味着什么?g=0时是约束的边界,对于svm就是那些support vector。

 

Optimal margin classifiers – Continuing

  谈论了那么多晦涩的东西,不要忘了目的,我们的目的是要求解optimal margin 问题,所以现在继续

  前面说了optimal margin问题描述为 :
  image

  其中,g约束表示为 :
  image 
  那么什么时候g=0?当functional margin为1(前面描述optimal margin问题的时候,已经假设funtional margin为1),所以只有靠近超平面最近的点的functional margin为1,即g=0,而其他训练点的functional margin都>1 。
  该图中只有3个点满足这个条件,这些点称为support vector,只有他们会影响到分类超平面。
  实现在训练集中只有很少的一部分数据点是support vector,而其他的绝大部分点其实都是对分类没有影响的。

            image

  前面说了半天prime问题和dual问题,就是为了可以用解dual问题来替代解prime问题。用dual问题的好处之一是,求解过程中只需要用到inner productimage ,而表示直接使用x,这个对使用kernel解决高维度问题很重要。

  好,下面就来求解optimal margin的dual问题 :
    image 

  和上面讨论的广义拉格朗日相比,注意符号上的两个变化:
  1) w变量—>w,b两个变量
  2) 只有α,而没有β,因为只有不等式约束而没有等式约束

  对于dual问题,先求

  image   ( 这里就是对于w,b求L的min,做法就是求偏导为0的方程组 )
  首先对w求偏导 :
    image 
    得到如下式子,这样我们在解出dual问题后,可以通过α,进一步算出w
    image

  接着对b求偏导 :

    image

  现在把9,10,代入8,得到

  image

  这就是image, 下一步就是继续求极值 :image

  于是有,第一个约束本来就有,第二个约束是对b求偏导得到的结果 :

    image
  ( 你可以验证我们这个问题是满足KKT条件的,所以可以解出这个dual问题来代替原来的prime问题。)
  先不谈如何求解上面的极值问题(后面会介绍具体算法),我们先谈谈如果解出α,如何解出prime问题的w和b

  w前面已经说过了,通过等式9就可以解出
  那么如何解出b ?

  image

  其实理解就是, 找出-1和1中靠超平面最近的点,即支持向量,用他们的b的均值作为b* 。因为w定了,即超平面的方向定了,剩下的就是平移,平移到正负支持向量的中间位置为最佳。

  求出w,b后,我们的支持向量机就已经准备好了,下面可以对新的数据点进行分类。很简单其实只要代入image ,-1或1来区分不同的类。

  这里也把9代入,
    image

  你可能觉得多此一举,这样每次分类都要把训练集都遍历一遍。其实无论是使用dual优化问题或是这里,都是为了避免直接计算x,而是代替的计算x的内积,因为后面谈到kernel,对于高维或无限维数据直接计算x是不可行的,而我们可以使用kernel函数来近似计算x的内积

  而且其实,这里的计算量并不大,因为前面介绍了,α只有支持向量是不为0的,而支持向量是很少的一部分。

 

 

Kernels

  先谈谈feature mapping,

  比如想根据房屋的面积来预测价格,设范围面积为x,出于便于分类的考虑可能不光简单的用x,而是用image 做为3个feature
  其实将低维数据映射到高维数据的主要原因是,因为一些在低维度线性不可分的数据,到了高维度就是线性可分的了。

  这里我们称,"original” input value(比如x)为输入属性(input attributes )
  称new quantities(image) 为输入特征(input features)

  我们用 φ 表示特征映射( feature mapping)
    image

  在将低维度的x mapping到高维度的φ(x)后,只需要把φ(x)代入之前dual problem的式子求解就ok。

  但问题在于,之前dual problem的<x,z>是比较容易算的,但是高维度或无限维的<φ(x), φ(z)>是很难算出的,所以这里无法直接算。

  所以kernel函数出场 :

    image

  我们可以通过计算kernel函数来替代计算<φ(x), φ(z)>,kernel函数是通过x,z直接算出的。
  所以往往都是直接使用kernel函数去替换<x,z>,将svm映射到高维,而其中具体的φ()你不用关心(因为计算φ本身就是很expensive的),你只要知道这个kernel函数确实对应于某一个φ()就可以。

 

polynomial kernel

  我们先看一个简单的kernel函数的例子,称为polynomial kernel(多项式核)

      image

  这个kernel是可以推导出φ()的,
      image 
  可以看出最终的结果是,φ将x mapping成xx,如下(假设n=3)

      image

  可见,如果这里如果直接计算image ,复杂度是image ,因为x的维度为3,映射到φ就是9 ;而计算K函数,复杂度就只有O(n)

  推广一下,加上常数项 :

    image

  这个推导出的φ为,n=3

      image

  再推广一下,

  image ,将x mapping到image ,虽然在image ,但是计算K仍然都是O(n)的
  虽然上面都找到了φ, 其实你根本不用关心φ是什么, 或者到底mapping到多高的维度。

 

Gaussian kernel

  在来看另外一种kernel函数(高斯核)
  来想一想内积的含义,当两个向量越相近的时候,内积值是越大的,而越远的时候,内积值是越小的
  所以我们可以把kernel函数,看成是用来衡量两个向量有多相似

  于是给出下面的kernel函数,这个函数由于描述x,z的相似度是合理的

    image   ( 这个kernel函数对于的φ是个无限维的映射,你不用关心到底是什么)


  如何判定一个kernel函数是否是有效的?
  下面就来证明一个判定方法 :

  假设,K 对于特征映射φ是一个有效的kernel 函数,对于有限集m{x(1),...,x(m)},我们可以得到一个m-by-m的Kernel matrix K,其中
  Kij = K(x(i),x(j)) = Φ(x(i))TΦ(x(j)) = Φ(x(j))TΦ(x(i)) = K(x(j),x(i)) = Kji,这里符号用重了,K同时表示kernel函数和kernel矩阵。

  于是可以证明,K是个半正定矩阵 (positive semi-definite)  ( 对于任何非0向量z,都有zTKz>=0,那么K称为半正定矩阵 )
        image

  即K函数是valid kernel函数,那么K矩阵一定是半正定矩阵,(其实满足这是个充分必要条件的是Mercer kernel的定义)

  所以有了这个定理,就比较方便了,你不用去找是否有对应的φ,只需要判定K矩阵是否为半正定矩阵即可。

 

-----------------------------------------------------------------------------------------

下面NG讲了个很典型的使用SVM kernel的例子,

例:一个识别问题,就是根据16×16的像素点,来判断是否是0~9的数字
传统的方法是,神经网络,认为是解这个问题的最好的算法。
可是这里用polynomial kernel or the Gaussian kernel,SVM也得到了很好的效果,和神经网络的结果一样好。
这是很让人吃惊的,因为初始输入只是256维的向量,并且没有任何prior knowledge的情况下,可以得到和精心定制的神经网络一样好的效果!

NG还讲了另外一个例子,即初始输入的维数不固定的情况下,例如输入字符串的长度不固定,如何产生固定的维数的输入,参考讲义吧呵呵

这里看到Kernel在SVM里面的应用已经非常清晰了,但是其实Kernel不是只是可以用于SVM
其实它是个通用的方法,只要学习算法可以只含有输入的内积,那么都可以使用kernel trick来替换它(例如,这个核技巧可以用于感知器来获取核感知算法)

 

Regularization and the non-separable case(规则化和非可分离情况)

  讨论异常点,或离群点

  当样本线性不可分时,我们可以尝试使用核函数来将特征映射到高维,这样很可能就可分了。然而,映射后我们也不能100%保证可分。那怎么办?我们需要将模型进行调整,以保证在不可分的情况下也能尽可能地找出分隔超平面。
  比如下图,是否值得为了左上角那个点,将划分线调整成右边这样?很明显那个是离群点(可能是噪声),而且造成超平面的移动,间隔缩小,可见以前的模型对噪声非常敏感。再有甚者,如果离群点在另外一个类中,那么这时候就是线性不可分了。   

                            clip_image001

  这时候我们应该允许一些点游离并在模型中违背限制条件(函数间隔大于1),重新优化函数如下(也称软间隔) :    

                         clip_image002

  其实就是加上修正值ξi(称为松弛变量),使得某些点的functional margin可以小于1,即容忍一些异常点。

  同时需要对目标函数重新调整,以对离群点进行处罚,参数C为权重,C越大表明离群点对目标函数影响越大,也就越不希望看到离群点。目标函数后面加上的clip_image006 就表示离群点越多,目标函数值越大,而要求是最小化目标函数。

  修改后的拉格朗日公式 :

    image

  最终得到的dual problem是 :

    clip_image013

  此时,我们发现没有了参数ξi ,与之前模型唯一的不同在于αi 又多了αi ≤ C 的限制条件。b的求值公式也发生了改变,改变结果在SMO算法里面介绍。

  对于这个dual problem的KKT 条件变化为 :

        clip_image016

  第一个式子表明在两条间隔线外的样本点前面的系数为 0 ,离群样本点前面的系数为C,支持向量的样本点前面的系数在(0, C)上。通过KKT条件可知,某些在最大间隔线上的样本点也不是支持向量,相反也有可能是离群点。  

 

The SMO algorithm by John Platt

  前面都是给出了dual problem,可是没有说怎么解,现在就来谈如何解SVM的dual problem

Coordinate ascent (descent) (坐标上升法)

  在讨论W(α)的求解之前,我们先看看坐标上升法的基本原理。假设要求解下面的优化问题 :

                        clip_image019

  这里W是α向量的函数。有两种求最优解的方法:一种是梯度下降法,另一种是牛顿法。现在再讲一种坐标上升法(求解最小值问题时,称作坐标下降法,原理一样)

  算法,不停迭代,每次迭代都是只改变某一个维度来做最优化,其他维度保持不变 :

    clip_image022

  最里面语言的意思是固定除αi 之外的所有αj(j≠i),这时W可看作只是关于αi 的函数,那么直接对αi 求导优化即可。这里我们进行最大化求导的顺序 i 是从1到m,可以通过更改优化顺序来使W能够更快地增加并收敛。如果W在内循环中能够很快地达到最优,那么坐标上升法会是一个很高效的求极值方法。  

  这个算法从图上看起来就像这样:

    clip_image025

  椭圆代表了二次函数的各个等高线,变量数为2,起始坐标是(2, -2)。图中的直线式迭代优化的路径,可以看到每一步都会向最优值前进一步,而且前进路线是平行于坐标轴的,因为每一步只优化一个变量。

 

  前面学过梯度下降和牛顿法,有啥区别?
  牛顿,收敛很快,但每次收敛的代价比较大;坐标上升,收敛比较慢,但是每次收敛的代价都很小。
  梯度下降,不适合高维,因为每次迭代都需要算出梯度,需要考虑所有维度。

 

SMO (sequential minimal optimization)( 序列优化算法 )

  SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规划优化算法,特别对线性SVM和数据稀疏时,性能更优。

  首先回到我们前面一直悬而未解的问题,对偶函数最后的优化问题 :

                    clip_image001

  要解决的是在参数{α12 ,...,αn} 上求最大值W的问题,至于x(i) 和y(i) 都是已知数。C由我们预先设定,也是已知数。

  按照坐标上升的思路,我们首先固定除α1 外的所有参数,然后在α1 上求极值。但是,这个思路有问题!因为如果固定α1 以外的所有参数,那么α1 将不再是一个变量(可以由其他值推出),因为问题中规定了:

           clip_image010

  因此需要一次选取两个参数做优化,比如α1 和α2 ,此时α2 可以由α1 和其他参数表示出来。这样回带到W中,W就只是关于α1 的函数了,可解。

  这样,SMO的主要步骤如下:

    clip_image013

  意思是:第一步选取一对αi 和αj ,选取方法使用启发式方法。第二步固定除αi 和αj 之外的其他参数,确定W极值条件下的αi ,αj 由αi 表示。

  SMO之所以高效,是因为在固定其他参数后,对一个参数优化过程很高效。

  下面讨论具体方法 :假设我们选取了初始值{α12,...,αn}满足了问题中的约束条件。接下来,我们固定{α34,...,αn},这样W就是α1和α2的函数。            并且α1和α2 满足条件:

    clip_image020
  由于{α34,...,αn}都是已知固定值,因此为了方便,可将等式右边标记成实数值ζ :

   clip_image023

  当y(1)和y(2)异号时,(一个为1,一个为-1),它们可以表示成一条直线,斜率为1.如下图:

    image

  横轴是α1,纵轴是α2,α1和α2既要在矩形方框内,也要在直线上,因此

      clip_image044clip_image046

  同理,当y(1)和y(2)同号时,

     clip_image048clip_image050

  然后我们打算将α1用α2表示 :

  clip_image051

  然后反代入W中,得 :

     clip_image052

  展开后W可表示成 aα22+bα2+c 。其中a,b,c是固定值。这样,通过对W进行求导可以得到α2,然后要保证α2满足L≤α2≤H,使用α2new,unclipped表示求导求出来的α2,然而最后的α2要根据下面情况得到 :

  clip_image059

  这样得到α2new后,可以得到α1的新值α1new

 

 

转自:http://www.cnblogs.com/fxjwind/p/3685760.html

posted on 2014-10-22 10:53  djmjsj  阅读(298)  评论(0)    收藏  举报

导航