网易公开课,第6,7,8课
notes,http://cs229.stanford.edu/notes/cs229-notes3.pdfhtml
SVM-支持向量机算法概述, 这篇讲的挺好,能够参考git
先继续前面对线性分类器的讨论,
经过机器学习算法找到的线性分类的线,不是惟一的,对于一个训练集通常都会有不少线能够把两类分开,这里的问题是咱们须要找到best的那条线算法
首先须要定义Margin,
直观上来说,best的那条线,应该是在能够正确分类的前提下,离全部的样本点越远越好,why?
由于越靠近分类线,表示该点越容易被分错,好比图中的C点,此时y=1,可是只要分类线略微调整一下角度,就有可能被分为y=-1
但对于A点,就能够很是confident的被分为y=1
因此分类线越远离样本点,表示咱们的分类越confident网络
那么若是定义“远”这个概念?
functional margin
图中的分类线为,wx+b=0
那么点离这条线越远,有wx+b>>0或<<0,好比A点
因此functional margin定义为,前面加上y保证距离非负 ,y取值{-1,1}
能够看出当点离线越远时,这个margin会越大,表示分类越confident
而且margin>0时,证实这个点的分类是正确的
由于好比训练集中y=1,而由线性分类器wx+b获得的结果-0.8,这样表示分错了,margin必定是<0的app
对于训练集中m的样本,有
即,总体的margin由最近的那个决定
若是要用functional margin来寻找best分类线,
那么我就须要找到使得 最大的那条线机器学习
但使用functional margin有个问题,由于你能够看到取决于w和b的值,你能够在不改变分类线的状况下,无限增长w和b的值,由于2x+1=0和4x+2=0是同一条线,但获得的functional margin却不同ide
geometric margins
再来看另一种margin,从几何角度更加直观的表示“远”
即该点到线的垂直距离,好比图中A到线的距离
如今问题是,如何能够求解出
能够看到A和分类线垂直相交于B,B是知足wx+b=0的等式的
因此咱们经过A的x和,推导出B的x,最终经过等式求出
函数
因而有,
求得,
考虑y=-1的状况,最终获得以下,
能够看到,若是||w|| = 1,那么functional margin 等于geometric margin
那么对于geometric margin,不管w,b的取值都不会改变margin的值,其实就是对functional margin作了norm化学习
The optimal margin classifier
先简单看看凸优化的概念
凸优化问题
用一个比较通俗的方式理解
为何要凸优化?
这种优化是必定能够找到全局最优的,由于不存在局部最优,只有一个最优势
因此对于梯度降低或其余的最优化算法而言,在非凸的状况下,极可能找到的只是个局部最优凸集,http://en.wikipedia.org/wiki/Convex_set
很好理解,对于二维的状况比较形象,做为例子
集合中任意两点的连线都在集合中![]()
![]()
凸函数,http://en.wikipedia.org/wiki/Convex_function
函数图上任意两点的连线都在above这个图(这个应该取决于上凸或下凸,都below也同样)
the line segment between any two points on the graph of the function lies above the graph换个说法,就是他的epigraph是个凸集,其中epigraph就是the set of points on or above the graph of the function
its epigraph (the set of points on or above the graph of the function) is a convex set
![]()
![]()
典型的凸函数,如quadratic functionand the exponential function
for any real number x
凸优化问题的定义
在凸集上寻找凸函数的全局最值的过程称为凸优化
即,目标函数(objective function)是凸函数,可行集(feasible set)为凸集
接着看这个问题,根据上面的说法,要找到最优的classifier就是要找到geometric margin最大的那个超平面
即,最大化geometric margin ,而且训练集中全部样本点的geometric margin都大于这个
(由于
)
这里假设||w||=1,因此function margin等同于geometric margin,这里用的是function margin的公式
这个优化的问题是,约束||w||=1会致使非凸集,想一想为何?
因此要去掉这个约束,获得
其实改变就是将替换成
,由于约束||w||=1就是为了保证
=
,因此替换后就能够直接去掉这个约束
但这个优化仍然有问题,目标函数 不是凸函数,由于是双曲线,明显非凸
继续,因为function margin经过w,b的缩放能够是任意值,
因此增长约束, ,这个约束是成立,由于不管
获得什么值,经过w,b都除以
,就可使
为何要加上平方,由于二次函数是典型的凸函数,因此这样就把非凸函数转换为凸函数
最终获得,
这是一个凸优化问题,能够用最优化工具去解
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)
利用拉格朗日数乘法,变成以下的极值问题
其中 称为Lagrange multipliers(拉格朗日算子)
最终,求这个方程组
解出w和拉格朗日算子β,求出f(w)的极值
再看看wiki上的例子,好理解一些
假设有函数:,要求其极值(最大值/最小值),且知足条件
看图,画出f(x,y)的等高线,和约束条件g(x,y)=c的路径,会有多处相交
但只有当等高线和约束条件线相切的时候, 才是极值点
由于若是是相交,你想象沿着g(x,y)=c继续前进,必定能够到达比如今f值更高或更低的点
那么求相切点,就是求解f和g的偏导为0的方程组
说到这里,还不够,由于你发现上面的约束条件是不等式。。。
因而继续看更通用化的拉格朗日数乘法
既有等式,也有不等式的约束,称为generalized Lagrangian
这里先引入primal optimization problem
这个啥意思?
这里注意观察,当约束条件不知足时,这个式子必定是无穷大,由于若是g>0或h不等于0,那么只须要无限增大 ,那么L的最大值必定是无限大, 而只要知足约束条件, 那么L的最大值就是f
因此,primal optimization problem就等价于最开始的minf(), 而且primal optimization problem是没有约束条件的,由于已经隐含了约束条件
min的那个必定不是无穷大,因此必定是知足约束条件的
再引入dual optimization problem
并且能够看到和prime问题不同的只是交换了min和max的顺序
而且简单能够证实,
这不是L的特殊特性,而是对于任意函数maxmin都是小于等于minmax的,能够随便找个试试呵呵
而且在特定的条件下,
这样咱们就能够解dual问题来替代prime问题
为什么这么麻烦?要引入dual问题,由于后面会看到dual问题有比较有用的特性,求解会比较简单
前面说了,只有在特定条件下,才能够用dual问题替代prime问题
那么这条件是什么?这些条件先列在这里,不理解没事
Suppose f and the gi’s are convex, and the hi’s are affine.
全部g函数为凸函数,而h函数为affine,所谓affine基本等同于linear, ,只是多了截距b
Suppose further that the constraints gi are (strictly) feasible; this means that there exists some w so that gi(w) < 0 for all i.
意思应该是,存在w可让g约束成立的,即g是严格可行的
Under our above assumptions, there must exist w∗, α∗, β∗ so that w∗ is the solution to the primal problem, α∗, β∗ are the solution to the dual problem, and moreover p∗ = d∗ = L(w∗, α∗, β∗). Moreover, w∗, α∗ and β∗ satisfy the Karush-Kuhn-Tucker (KKT) conditions, which are as follows:
知足上面的假设后,就必定存在w∗, α∗, β∗知足p∗ = d∗ = L(w∗, α∗, β∗),而且这时的w∗, α∗ and β∗ 还知足KKT条件,
而且,只要任意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 问题,因此如今继续
其中,g约束表示为,
那么何时g=0?当functional margin为1(前面描述optimal margin问题的时候,已经假设funtional margin为1)
因此只有靠近超平面最近的点的functional margin为1,即g=0,而其余训练点的functional margin都>1
该图中只有3个点知足这个条件,这些点称为support vector,只有他们会影响到分类超平面
实如今训练集中只有不多的一部分数据点是support vector,而其余的绝大部分点其实都是对分类没有影响的
前面说了半天prime问题和dual问题,就是为了能够用解dual问题来替代解prime问题
用dual问题的好处之一是,求解过程当中只须要用到inner product ,而表示直接使用x,这个对使用kernel解决高维度问题很重要
好,下面就来求解optimal margin的dual问题,
和上面讨论的广义拉格朗日相比,注意符号上的两个变化,
w变量—>w,b两个变量
只有α,而没有β,由于只有不等式约束而没有等式约束
对于dual问题,先求
这里就是对于w,b求L的min,作法就是求偏导为0的方程组
首先对w求偏导,
获得以下式子,这样咱们在解出dual问题后,能够经过α,进一步算出w
接着对b求偏导,获得下面的式子
如今把9,10,代入8,获得
因而有,第一个约束原本就有,第二个约束是对b求偏导获得的结果
You should also be able to verify that the conditions required for p∗ =d∗ and the KKT conditions (Equations 3–7) to hold are indeed satisfied in our optimization problem.
你能够verify咱们这个问题是知足KKT条件的,因此能够解出这个dual问题来代替原来的prime问题
先不谈如何求解上面的极值问题(后面会介绍具体算法),咱们先谈谈若是解出α,如何解出prime问题的w和b
w前面已经说过了,经过等式9就能够解出
那么如何解出b,
其实理解就是, 找出-1和1中靠超平面最近的点,即支持向量,用他们的b的均值做为b*
由于w定了,即超平面的方向定了,剩下的就是平移,平移到正负支持向量的中间位置为最佳
再想的多点,求出w,b后,咱们的支持向量机就已经ready了,下面能够对新的数据点进行分类
很简单其实只要代入 ,-1或1来区分不一样的类
你可能以为画蛇添足,这样每次分类都要把训练集都遍历一遍
其实不管是使用dual优化问题或是这里,都是为了不直接计算x,而是代替的计算x的内积,由于后面谈到kernel,对于高维或无限维数据直接计算x是不可行的,而咱们可使用kernel函数来近似计算x的内积,这是后话
并且其实,这里的计算量并不大,由于前面介绍了,α只有支持向量是不为0的,而支持向量是不多的一部分
Kernels
先谈谈feature mapping,
好比想根据房屋的面积来预测价格,设范围面积为x,出于便于分类的考虑可能不光简单的用x,而是用 作为3个feature
其实将低维数据映射到高维数据的主要缘由是,由于一些在低维度线性不可分的数据,到了高维度就是线性可分的了
没找到合适的图,想一想在二维上看不可分的,到3维或更高维,也许就比较容易用一个超平面划分,这是合理的
这里咱们称,"original” input value(好比x)为input attributes
称new quantities() 为input features
We will also let φ denote the feature mapping,
在将低维度的x mapping到高维度的φ(x)后,只须要把φ(x)代入以前dual problem的式子求解就ok
但问题在于,以前dual problem的<x,z>是比较容易算的,可是高维度或无限维的<φ(x), φ(z)>是很难算出的,因此这里没法直接算
因此kernel函数出场,
咱们能够经过计算kernel函数来替代计算<φ(x), φ(z)>,kernel函数是经过x,z直接算出的
因此每每都是直接使用kernel函数去替换<x,z>,将svm映射到高维,而其中具体的φ()你不用关心(由于计算φ自己就是很expensive的),你只要知道这个kernel函数确实对应于某一个φ()就能够
polynomial kernel
咱们先看一个简单的kernel函数的例子,称为polynomial kernel(多项式核)
这个kernel是能够推导出φ()的,
能够看出最终的结果是,φ将x mapping成xx,以下(假设n=3)
可见,若是这里若是直接计算 ,复杂度是
,由于x的维度为3,映射到φ就是9
而计算K函数,复杂度就只有O(n)
推广一下,加上常数项
这个推导出的φ为,n=3
再推广一下,
,将x mapping到
,虽然在
,可是计算K仍然都是O(n)的
虽然上面都找到了φ, 其实你根本不用关心φ是什么, 或者到底mapping到多高的维度
Gaussian kernel
在来看另一种kernel函数,
来想想内积的含义,当两个向量越相近的时候,内积值是越大的,而越远的时候,内积值是越小的
因此咱们能够把kernel函数,当作是用来衡量两个向量有多类似
因而给出下面的kernel函数,这个函数因为描述x,z的类似度是合理的
(This kernel is called the Gaussian kernel, and corresponds to an infinite dimensional feature mapping φ.)
这个kernel函数对于的φ是个无限维的映射,你不用关心究竟是什么
好到这里,天然有个问题?我随便找个函数就能够作kernel函数吗
若是断定一个kernel函数是否valid?即Can we tell if there is some feature mapping φ so that K(x, z) = φ(x)Tφ(z) for all x, z?
固然上面这个不太好操做,由于找到φ自己就是很困难的
下面就来证实一个断定方法,
假设,K is indeed a valid kernel corresponding to some feature mapping φ.
对于 consider some finite set of m points
咱们能够获得一个m-by-m的Kernel matrix K,其中 ,这里符号用重了,K同时表示kernel函数和kernel矩阵
因而能够证实,K是个半正定矩阵 (positive semi-definite)
(这个没有找到比较通俗易懂的解释方式,只知道定义是对于任何非0向量z,都有zTKz>=0,那么K称为半正定矩阵。谁能够通俗的解释一下)
这里只证实必要条件,即K函数是valid kernel函数,那么K矩阵必定是半正定矩阵,其实这是个充分必要条件,即Mercer kernel的定义
因此有了这个定理,就比较方便了,你不用去找是否有对应的φ,只须要断定K矩阵是否为半正定矩阵便可
下面NG讲了个很典型的使用SVM kernel的例子,
For instance, consider the digit recognition problem, in which given an image (16x16 pixels) of a handwritten digit (0-9), we have to figure out
which digit it was.
就是根据16×16的像素点,来判断是不是0~9的数字
传统的方法是,神经网络本证实是解这个问题的最好的算法
但是这里用polynomial kernel or the Gaussian kernel,SVM也获得了很好的效果,和神经网络的结果同样好
这是很让人吃惊的,由于初始输入只是256维的向量,而且没有任何prior knowledge的状况下,能够获得和精心定制的神经网络同样好的效果
NG还讲了另一个例子,即初始输入的维素不固定的状况下,例如输入字符串的长度不固定,如何产生固定的维数的输入,参考讲义吧呵呵
这里看到Kernel在SVM里面的应用已经很是清晰了,可是其实Kernel不是只是能够用于SVM
其实它是个通用的方法,只要学习算法能够只含有输入的内积,那么均可以使用kernel trick来替换它
For instance, this kernel trick can be applied with the perceptron to to derive a kernel perceptron algorithm.
Regularization and the non-separable case
讨论异常点,或离群点,好比下图,是否值得为了左上角那个点,将划分线调整成右边这样
从图上直观的看,应该不值得,右边的划分线远没有左边的合理,并且那个数据点颇有多是个异常点,能够忽略掉
we reformulate our optimization (using ℓ1 regularization) as follows:
其实就是加上修正值ξi,使得某些点的functional margin能够小于1,即容忍一些异常点
同时在目标函数上有作了相应的修正,
The parameter C controls the relative weighting between the twin goals of making the ||w||2 small (which we saw earlier makes the margin large) and of ensuring that most examples have functional margin at least 1.
列出拉格朗日,
最终获得的dual problem是,
和以前的相比,只是α的取值范围有了变化,如今还要<=C
对于这个dual problem的KKT dual-complementarity conditions变化为,
这个说的更清楚点,http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988415.html
The SMO algorithm by John Platt
前面都是给出了dual problem,但是没有说怎么解,如今就来谈如何解SVM的dual problem
Coordinate ascent (descent)
坐标上升或降低,取决于求max或min
想法很简单,求解m维的最优问题
算法,不停迭代,每次迭代都是只改变某一个维度来作最优化,其余维度保持不变
这个算法从图上看起来就像这样,
前面学过梯度降低和牛顿法,有啥区别
牛顿,收敛很快,但每次收敛的代价比较大
坐标上升,收敛比较慢,可是每次收敛的代价都很小
梯度降低,不适合高维,由于每次迭代都须要算出梯度,须要考虑全部维度
SMO (sequential minimal optimization)
咱们先再列出前面的dual优化问题,看看用坐标上升是否可解
注意到19这个约束,这个约束注定没法使用坐标上升
由于你若是只改变一个α值,就没法继续保证整个等式为0
由于在固定其余的α时,α1的值也是固定的
因此提出SMO算法,
想法也简单,既然单独改一个不行,我同时改两个α,就有可能仍然保持等式为0
The key reason that SMO is an efficient algorithm is that the update to αi, αj can be computed very efficiently.
下面就来看看SMO如何在每次迭代中高效的求的局部最优的α1和α2
上面的19能够改写成,
因为这个值是个常量,由于你要保持除α1和α2之外的都不变,因此写成
如今把α1和α2的约束用图表示出来,要保持约束就只能在这条线上移动,而且要知足<C
因此a2的取值在[L,H]
继续变换20,获得
代入目标函数,咱们先求出α2,而后根据上面的式子算出α1
Treating α3, . . . , αm as constants, you should be able to verify that this is just some quadratic function in α2.
由于a3到am都是常数,你试着代入原来的W(), 会发现必定是获得α2的二次函数
便是这样的形式,
这个求极值,你们都应该没问题,很简单
问题是这样求出的极值点不必定在[L,H]的范围内
因此有,在范围内最好,不在范围内的话,也须要clip到范围内
There’re a couple more details that are quite easy but that we’ll leave you to read about yourself in Platt’s paper: One is the choice of the heuristics used to select the next αi, αj to update; the other is how to update b as the SMO algorithm is run.