- 主要参考资料为《小象学院-机器学习IV》 李航的统计学习方法 台湾大学李宏毅老师的机器学习视频(BiliBili有免费资源)
- 所有内容,都是基于自己的理解,看官老爷们如果觉得哪里不对,那可能就是不对。
1.逻辑回归的缺点
在上一篇博客中,我详细介绍了逻辑回归,在面试中,经常会被问到这样一个问题,逻辑回归与SVM有什么区别?所以,在写完逻辑回归之后,我打算梳理一下SVM。那这篇博客,就从回答这个面试题开始吧。
虽然逻辑回归(Logistic Regression,LR)理论很简单,但它被广泛用于各种现实任务,特别是在电商公司。在数据挖掘领域,流传着这样一句话,一个逻辑回归打天下,这是LR的优点。
LR的缺点是,在小样本上,泛化能力较弱。怎么解释呢?简单来说,逻辑回归的目标是找到一条直线(或者曲线,或者超平面,为了简单,下文只用直线举例)将样本分为两类,但是这条直线也就仅仅考虑将样本分为两类,却忽略了怎么分能得到更好的泛化性能,如图1.1。在图1.1中,有红色,蓝色两类样本,使用LR分类的话,可能会得到L1或者L2作为分类直线。在训练集上,这两条直线都能表现得很好,但是,一旦出现比较极端的样本,例如点a、b,就会被分错,这种情况在训练样本较少的情况下,会愈发严重。
图1.1 | 图1.2 |
2. SVM的基本思想:切在最中间
能够一刀切在两类样本的最中间,如图1.2,那么就能最大程度的避免图1.1中a,b样本被分错的情况。当时刚学SVM的时候,我就被Vapnik这个天才的想法所震惊了,心想,这得是什么样的脑子才能够想到这么漂亮的idea。但是随着涉猎的东西越来越多,我才知道原来间距理论在SVM之前早就有了,间距理论的提出是为了解释为什么adaboost不容易过拟合,或许,Vapnik是从这里获得了灵感吧。所以真的非常的赞,某天半夜无意间刷到这个视频,看完已经是两点半,却毫无睡意,意犹未尽。周志华不愧为大牛中的大牛,集成学习一代宗师,儒雅,风趣,深入浅出的介绍了Boosting的前世今生,不好意思,貌似跑题了。
言归正传,“切在最中间”这个想法很容易让人理解,但是想要进一步求解问题依然太模糊了,怎么样才算切在最中间呢?切在最中间等价于分类直线到两类样本的最近“距离”达到最大。注意,这里距离是带引号的,不是普通的点到直线的距离,而是能反应分类置信度以及分类是否正确的距离,称为几何间距。具体而言,一个样本点到分类直线的远近可以表示为分类预测的确信程度,我们早就学过,点到直线的距离为:
在分类直线确定的情况下,能够表示样本点距离分类直线的远近,而的符号与类标记的符号是否一致能够表示分类是否正确。所以,用来表示分类的正确性及置信度,这就是几何间距。
在定义几何间距之后,我们就可以将“切在最中间”转化为数学表达式。怎么转化呢?在上文中说到切在最中间等价于分类直线到两类样本的最近的几何间距达到最大,分类直线到两类样本最近的几何间距为:
第二步:寻找一组,使得几何间距最大:
虽然式(2.2)依然不容易求解,但通过式(2.2),可以得出一个结论,那就是直线切在最中间的时候,正样本和负样本到分类直线的几何间距相等。这就好比一块重量为10,但是密度不均匀的的蛋糕,需要切成重量相等的两部分,这个问题就可以写成类似于式(2.2)的形式,即式(2.3):
很显然,式(2.3)的最优解,就是左右两边重量都为5的时候。因为,就算切成4.999和5.001的话,那么,依然可以继续优化,只有当左右两边重量都为5时,再也没有优化的空间了,所以是最优解。
有了上面的结论,我们可以推导出SVM最终的优化形式。假设,当前切在最中间的分类直线就是,由于正样本和负样本到分类直线的几何间距相等,将分别向上和向下移动,正好与离它们最近的样本相碰,得到和,和,也被称为支撑直线(平面),在支撑平面上的样本点,被称为支撑向量,这也是SVM名字的由来,详见图2。
在很多学习资料中,都是直接给出两个支撑平面为: ,作为杠精的我,自然要问,凭什么可以直接等于。这个问题我在研一算法导论课上问了我们班实力最强的东哥,以下就是东哥的推导:
两个式子同时除以,得到
把系数重新记为,得到
看到这里,如果同样也是杠精的你,是不是舒服多了。接下来,我们将图2所包含的思想用数学语言彻底描述出来。
1.希望和之间的距离最大,即。
2.希望在最大化的同时,所有样本都在和之外(或之上),即。
第一条是优化目标,第二条是最优解的约束条件,因此,得到式:
为了更容易优化,将式稍稍做一些改动,对优化来说,依然是等价的,得到式:
OK,式就是“切在最中间”最终的数学描述,竟然如此简洁,不等不感叹数学的神奇与伟大。文本之后所有内容,就是求解式(2.11)。
3.拉格朗日的几何解释
是一个带约束的优化问题,想要求解式,需要用到广义的拉格朗日乘子法(不等式约束)。在高数课上,我们都学过狭义的拉格朗日乘子法(等式约束),但老师基本上只教了碰到等式约束问题该怎么做,却不讲为什么要这么做,至少我的高数老师是这样的。在60分万岁的时候,傻瓜式地记住拉格朗日乘子法的几个步骤就OK了,但是想要彻底理解SVM,要求我们必须理解拉格朗日乘子法。问题重述,假如,我们优化目标是,是凸函数,等式约束条件为。拉格朗日乘子法的解题步骤是:
第一步:构造拉格朗日函数
第二步:分别求出关于的偏导并等于0:
第三步:将上面三个等式联立方程组,求出。
那么,上面这三步花里胡哨的到底干了一件什么事呢?为什么必须是凸函数(PS.直线也是凸函数)呢?接下来,我们从几何的去彻底理解拉格朗日乘子法。
拉格朗日乘子法可以用图3来描述:
图3
在图(3)中,表示损失函数,是一个凸函数,是约束条件,点是的最优解,以为圆心的同心圆表示在平面p上的投影,即损失等高线。假如没有约束,就是最优解,求解方式也很简单,直接对求偏导,然后偏导等于0就可以了。
加了约束条件之后,事情就稍微麻烦了一点。约束条件的作用就是说,最优解必须要在直线上。从图中可以明显的看出,在加了约束条件之后,最优解就是同心圆与刚好相切的点。相切是一个非常重要的信息,这说明,直线的法向量与的梯度在同一条直线上。分析到这里,把上述分析写成数学语言。直线的法向量为:,的梯度为:,在同一条直线上说明:
这样是否行了 呢??显然不行,上面的式子最多只能拆出两个等式,但是变量有三个,方程无解。更深层次的来说,我们可以说线的法向量是,但是我们并不能说,就是的法向量,因为直线平移之后,法向量是不会变的。因此,还需要增加一个条件来说明是的法向量。我们就地取材,就是现成的条件。
拉格朗日乘子法和上述的几何推导有什么关系呢。把式(3.1),(3.2)写成向量形式,就是
式(3.3)就是,这两者是不是一样的呢。无非就是和的区别。
3.KKT条件
,而是不等式,那怎么办呢?
我们把不等式约束拆成两部分,和。我还是用上图来说明KKT条件,但是为了说明的更加方便,只保留损失函数等高线和约束条件。
第一种情况,约束区域包含了的最优解,如图4。既然这样的话,约束条件就相当于不存在了。的最优解就是优化问题的最优解。所以,
图4
的最优解在约束区域的外面,如图5。优化问题的最优解在约束区域的边界上,这时,不等式约束等价于等式约束。关键点在于,的符号,在第二种情况中,。为什么呢?是在点B处的梯度,另 ,则是在点B处的梯度。与方向恰恰相反,所以想要让式(3.6)成立,必须。
图5
整合上述两种情况,优化问题的最优解必须满足以下条件,也就是KKT条件:
4.求解SVM优化问题
在解释完拉格朗日乘子法和KKT条件之后,就可以对式(2.11)求解了,套用拉格朗日乘子法可以得到:
其中,是一个向量,维度等于样本的个数,
分别对求偏导,并等于0得:
联立上面的n+2个等式求解,并保证就可以了。
如果只有四五个样本,这样简单粗暴的方式还是可行的,如果手工求解嫌麻烦,可以交给Lingo或者MatLab去做。但是,在实际任务中,数据量动不动就是几十万甚至几百万,求解这么大的方程组,内存早就炸掉了。此外,用这种方式得到的结果,就算你计算没有错,结果也很有可能是错的。为什么这么说呢?我们做一题《统计学习方法》上的练习题,你就知道了。
图6
根据题意,得到优化问题为:
拉格朗日函数为:
分别对并等于0,得:
联立式(4.9)、(4.10)、(4.11),可以得,再将结果带入到式(4.6)、(4.7)、(4.8),解出。但是,上面的解是错误的,因为约束条件要求所有的,但是我们求解的却是负数。那为什么,我们规规矩矩的求解下来,也没有算错,结果怎么就错了呢?那是因为,我们用了不该用的条件,那就是式(4.10)。式(4.10)是由样本2得来的,从图6中可以发现,样本2在边界外边,没有起到约束作用,所以,再构造拉格朗日函数的时候,直接取,把样本2对应的约束条件过滤掉。
找到错误的原因之后,我们重新求解,联立式(4.9)、(4.11),得和。将结果,带入式(4.7),将式(4.8)带入式(4.6)与式(4.7),再因为,最后可以得到方程组:
解得,综合所有,得。
这道例题,之所以能找到错误的原因,是因为样本是2维的,我们开了上帝视角。如果样本是4维及以上,并且数据非常大,绝大多数的样本都是不具有约束的,在海量数据中,找到具有约束的样本,简直是天方夜谭。此外,这种求解方式,也不利用引入核函数。
5.拉格朗日对偶性
本文的第4部分介绍了求解SVM的最基本的方法,我通过一道例题,也说明了这种方式的弊端十分明显。那么,有没有更好的优化方式呢?接下来让我们进入重头戏——拉格朗日对偶。以下内容,摘自“耳东陈”老师的一篇知乎文章,不是我有心想抄,只是这篇乎文写的太精彩了,与其高仿,不如让大家看原汁原味的,我顺便做一些辅助性的解释。
很多资料都是上来就开始介绍“对偶问题”的概念,这实际上是一种“先知式”的教学方式,对于研究问题的思路开拓有害无益。所以,在介绍这个知识点之前,我们先要从宏观的视野上了解一下拉格朗日对偶问题出现的原因和背景。按照前面等式约束条件下的优化问题的求解思路,构造拉格朗日方程的目的是将约束条件放到目标函数中,从而将有约束优化问题转换为无约束优化问题。我们仍然秉承这一思路去解决不等式约束条件下的优化问题,那么如何针对不等式约束条件下的优化问题构建拉格朗日函数呢?
因为我们要求解的是最小化问题,所以一个直观的想法是如果我能够构造一个函数,使得该函数在可行解区域内与原目标函数完全一致,而在可行解区域外的数值非常大,甚至是无穷大,那么这个没有约束条件的新目标函数的优化问题就与原来有约束条件的原始目标函数的优化是等价的问题。
拉格朗日对偶问题其实就是沿着这一思路往下走的过程中,为了方便求解而使用的一种技巧。于是在这里出现了三个问题:1)有约束的原始目标函数优化问题;2)新构造的拉格朗日目标函数优化问题;3)拉格朗日对偶函数的优化问题。我们希望的是这三个问题具有完全相同的最优解,而在数学技巧上通常第三个问题——拉格朗日对偶优化问题——最好解决。所以拉格朗日对偶不是必须的,只是一条捷径。
1)原始目标函数(有约束条件)
为了接下来的讨论,更具有一般性,我们把等式约束条件也放进来,进而有约束的原始目标函数优化问题重新给出统一的描述:
公式(5.1)表示m个等式约束条件和n个不等式约束条件下的目标函数的最小化问题。
2)新构造的目标函数(没有约束条件)
接下来我们构造一个基于广义拉格朗日函数的新目标函数,记为:
其为广义拉格朗日函数,定义为:
这里,,是我们在构造新目标函数时加入的系数变量,同时也是公式(5.2)中最大化问题的自变量。将公式(5.3)带入公式(5.2)有:
我们对比公式(5.1)中的约束条件,将论域范围分为可行解区域和可行解区域外两个部分对公式(5.4)的取值进行分析,将可行解区域记为,当时有:
可行解区域内:由于, 且系数, 所以有:
可行解区域外:代表公式(5.1)中至少有一组约束条件没有得到满足。如果,则调整系数就可以使 ;如果,调整系数就可以使 。这意味着,此时有
把公式(5.4),(5.5)和(5.6)结合在一起就得到我们新构造的目标函数的取值分布情况:
此时我们回想最初构造新目标函数的初衷,就是为了建立一个在可行解区域内与原目标函数相同,在可行解区域外函数值趋近于无穷大的新函数。看看公式(5.7),yeah,我们做到了。
现在约束条件已经没了,接下来我们就可以求解公式(5.8)的问题
3)对偶问题
尽管公式(5.8)描述的无约束优化问题看起来很美好,但一旦你尝试着手处理这个问题,就会发现一个麻烦。什么麻烦呢?我们很难直接从公式(3.8)里面把这两组参数拿掉,这样我们就没法通过令的方法求解出最优解。
4)对偶问题同解的条件
介绍完对偶问题之后,还有一个非常重要的话题,那就是对偶问题和原始问题到底有没有相同的最优解呢?或者说,什么满足什么条件时,两者有相同的解?我只是摘抄了《统计学习方法》相关定理,但是不做证明(没必要,建议看官们没有太强的理论求知欲就别去看了)。
定理1:如果原始(primary)问题和对偶(dual)问题都有最优值,则:
其中,是原始问题的最优解,是对偶问题的最优解,定理1交代了对偶问题的解不可能优于原始问题的解,顶多一样。当然原始问题非常非常复杂时,我们可以退而求其次,去求对偶问题的最优解,但代价就是可能得不到原始问题的最优解。于是,更核心的问题就是,什么时候这两者的解是等价的,请看定理2。
定理2:对于原始问题和对偶问题,假设函数和不等式约束条件为凸函数(直线,平面,超平面也是凸函数),等式约束条件中的为仿射函数(即由一阶多项式构成的函数,;并且至少存在一个使所有不等式约束条件严格成立,即(很显然,在SVM中,这个条件肯定是成立的。为什么?SVM的优化问题可以用图5来描述,相切时,正好等号成立,只要把等高线圈圈再往外扩一点,就能取到让不等式严格成立。),则存在使得是原始问题的最优解,是对偶问题的最优解且有:,并其充分必要条件如下:
再次强调一下,公式(5.9)是使为原始问题的最优解,为对偶问题的最优解,且的充分必要条件。公式(5.9)中的(1)~(3),是为了求解最优化要求目标函数相对于三个变量的梯度为0;(4),(6)为KKT条件(见式3.7),这也是我们为什么要在上文中先介绍KKT条件的原因;(7)为等式约束条件。
6.利用对偶性继续求解。
的优化问题。
转化为。
但是可以发现,求解需要先接,再解,这样依然很不方便。于是,再利用刚才介绍过的拉格朗日对偶性,把优化顺序调换一下,先解,再解,即式(6.2)最巧的是,这两者顺序得到的解是等价的,但是后者的难度却比前者小很多。
先求消去w,b,但是不是真的完全消去,更确切的说,把w,b转化为了另外一种约束。
对,求偏导等于0,
于是,我们就得到了
把上面的式(6.5)、(6.6),代入式(6.2)得到式(6.7)可以发现未知变量只剩下了了。
到这一步,极小值已经求完了,所以问题就变成了 ,即式(6.8)。好了,就剩下求极大值了,解决这个,SVM就解完了。
一般在机器学习中,把最后的问题转化为最小化问题,因此,把上式也写为最小化的形势(把负号去掉,max变min就OK了)
接下来的问题,就是如何求解,求解的方法有很多,最广为人知的就是SMO算法了,但是这是我在这里就不详细解释SMO了,我个人感觉SMO算法像是被神话了一般,其实这也不过众多求解的一种而已,其实梯度下降法也是可以求解的。
7.软间隔。
8. 核函数的使用
9.更一般化的问题(Hinge损失)。