说在前面
终于有时间,好好学一下被提及无数次的SVM,曾经学过但那时没有机器学习的思想,学完接受很少一部分,现在决定重新温习一遍。
这是一个系列,SVM当作第一个。不想照搬照抄书上的东西,写多篇关于SVM的博客教程,真正想学好SVM,底层推导的东西还是看书比较好,更加系统。
所以,本文主要帮助顺一下整个SVM的流程和一些有意思的地方,因为总有人急于理论,被一章一章的分篇教程看蒙了,这里用一篇画个葫芦,将它的整体呈现出来。由于自己边学记录的原因,可能有些散乱。诸如SVM推导教程博客,这里就不献丑了,个人是对着视频+李航的统计机器学习推导了几遍(一遍真心记不住…理解不全面)。
谈一谈SVM
我想,支持向量机(SVM)被如此推崇的原因,很大一部分是它的数学可证明、可解性。它不像反向传播算法,依靠数据样本,根据损失函数,自己学出来整个网络的参数。SVM是解出来来的,你可以简单联想规划问题,SVM在确定目标函数和限制条件后,就是一个凸优化问题,即有全局最优解。正因为能纯粹解出来,才是它让我们这些非数学者开始头疼的原因…求解复杂。
硬间隔
SVM硬间隔的整体流程如下:
-
SVM最初本质是一个二分类问题,用一个超平面将样本分成两类的思想贯穿这个核心,我们最后想要得到一个超平面的方程,用来分割样本。
-
这样的方程有很多,为了得到鲁棒性最好的方程,根据几何间隔最大的思想,得到了目标函数,和限制条件(由于经过缩放和代换,不好言明其具体指代什么)。
-
上面的目标函数+限制条件也可以被称为凸二次规划问题,在样本少的情况下,纯粹按规划问题做就解决了,但SVM当然没这么简单。
-
SVM引入拉格郎日乘子,将原本的限制条件合并入目标函数,得到
min max F+限制条件 的规划问题((这里只是简单直观的写)),如果你简单推导一下,会发现它和原本的 min F +限制条件 是等价的(证明过程很巧秒)。
-
而引入拉格郎日的最终目的,是得到他的对偶问题,min max F 对偶问题是 max min F,对于SVM,它两个也是等价的(本人并未系统看过证明,当成定理用的)
为什么这么做,本人见到两种说法:
(1)这样容易求解
(2)自然引入核函数,即解决非线性问题。
-
求解 max min F,你可以得到 拉格郎日乘子。
-
根据 拉格郎日乘子+ KTT条件 + 求导得到的结论,可以求得超平面的
w (向量)和 b(标量)。
-
目标方程得到。
软间隔
SVM第一小步,到这里完美结束,体会上面过程,这里重新梳理一下整个SVM由特殊化到普通化的流程: 硬间隔 -> 软间隔 -> 核方法。
当你将硬间隔整体理清楚后,软间隔就是水到渠成,一模一样的步骤再来一遍。
- 只不过,这里的目标函数加了个带惩罚系数的软间隔损失项,限制条件也相应多了一项。
- 剩下步骤和上面操作一模一样。
SVM第二小步推导结束后,你会发现,我…求解超平面 w和b的式子一模一样,但这里b是不唯一的?为什么?个人将这个问题的关注点转移到了支持向量上,因为支持向量的原因,所以b不唯一了,李航书里直接以平均数得到次结果。
核方法
SVM之核心,核方法。线性可分这个问题对于实际来说太多奢侈了,更多的问题是线性不可分的,为解决这种最普通 , 不特殊的问题,SVM根据在对偶的基础上,引入核技巧。
其实形式上很简单,你可以理解为一个替换操作,将原来的点积替换成了核函数化后的点积,即 xi * xj -> K(xi, xj)。K是一个函数,输入 xi,xj ;输出o(xi)*o(xj),可以看作一个映射。
这样做的原因是什么?两个字来说,升维(只不过升维这个操作没有直接实现,而是隐含实现),拿线性不可分的异或问题来说,升到更高维度,便存在线性可分的方案。而核方法关键在 核技巧 的 “技巧”二字上,本来你要的操作是 (xi * xj ——> O(xi), O(xj) ——> O(xi) * O(xj) ,核技巧省略了中间将数据升到更高维度的这一步映射操作,而是(xi * xj ——> O(xi) * O(xj) ,直接用核函数的映射,一步到位。
(当然,李航的书上还将了很多关于正定核等概念,本人也看了,但是并未完全消化)
选择理解常用的核函数
高斯核
也叫径向基函数,这里解释为什么也叫高斯核,因为和正太分布(高斯函数)像。同样讨论参数的可视化影响。
参考[3]
以上只是单纯基于公式,这里给出高斯映射后的可视化结果:
gamma = 100
可以这样理解,每一个蓝色样本都是高斯函数的一个顶部,周围范围是其所谓的宽度,只有在这个宽度里,才是属于这个样本,如图。
但是,很明显,此图过拟合了,太多依赖样本点。
gamma = 10
gamma = 0.1
这里gamma过小,如图可见,导致欠拟合,所以gamma应理智选择。
SVM解决回归问题?
参考[3]
一个很有意思的角度…个人认为SVM做回归,有点太不正经了…真没怎么见过。当然,其思路很简单很简单,你只需要将关注点 从分类转移到拟合上就OK了,前者用超平面尽可能分离样本,后者超平面尽可能靠近样本,这就是唯一不同的本质了,两者相反。
SMO
参考:知乎系列博文 + 自己一些思考
简单了解
用最最通俗的话来讲,就是这是一个算法,用来求解 max min F问题,最后得到 拉格郎日乘子(维度等于样本的向量)。求解出它,剩下求解w和b都好说。关键就是怎么求解它?我们本身可以用纯粹求解析解的方式求解,但是因样本量大导致计算复杂的原因,所以有了一种求解更快更高效的优化算法——SMO。
这里简单说明,指明一点(上面也已经指明),帮助理解为什么说拉格郎日乘子计算量大。拉格郎日的乘子是一个向量,那它的维度是什么?——样本大小。为什么?因为目标函数的限制条件是针对每一个样本的,也就是有N个限制条件。So,样本增多,需要求更多的拉格郎日乘子,所以怎么能没有一个优化算法呢???
当然,求解它的优化算法有很多(计算速度块,内存需求小),SMO是其中一个,也是很著名的一个。
相似的坐标上升法
理解一个算法,首先要理解它的预习一下它的思想。
坐标上升算法每次通过更新多元函数中的一维,经过多次迭代直到收敛来达到优化函数的目的。简单的讲就是不断地选中一个变量做一维最优化直到函数达到局部最优点。
但是这样做是有一个前提的,各维度是独立的。
SMO
说在前面,个人表示看一遍李航的书并没有接受多少,大致理解了一遍,中间刷了几篇博客补了以下。
由于KKT条件是最优化问题的充分必要条件,因此,如果所有变量(a1,a2,…an)的解都满足此最优化问题的KKT条件,那么此最优化问题解(a1,a2,…an)便得到了。如果不呢(很显然一般情况肯定不满足),回答这个问题的便是SMO算法。
正文开始:我们需要对(a1,a2,…an)进行优化(迭代的),SMO把原始问题的求解 (a1,a2,…an)个参数的问题分解成多个二次规划问题求解,每个子问题只需要求解2个参数,节省了时间成本和内存需求,最厉害之处,这里可以用求解解析解的方式搞了,因为参数少啊。
与坐标上升算法不同的是,我们在SMO算法中我们每次需要选择一对变量 (ai , aj) , 因为在SVM中,我们的(a1,a2…an)并不是完全独立的,而是具有约束的:
一个 改变,另一个也要随之变化以满足条件,反之,不是两个,选取一个,那选的那个是定值(上面等式),所以大于一个是必须的,至于为什么两个…个人解释不了。
有了上面的认知,那SMO最关键的两个地方必须指出来了,
(1)上面说每次选取两个变量,暂时不计较个数,那每次选取哪两个变量?
(2)有了两个变量后,原问题变成了二次规划的问题,完全可以求解解析解,怎么求?
上面两个问题,就是整个SMO算法的核心。
针对(1),SMO有一个东西叫停机条件,是根据KKT推出来了(见下图)…这个条件用来检验筛选第一个变量,这也是应正上文那个必要条件;第二个变量简化情况下可以自由选择,但是为了算法高效,这里选取使|E1 — E2|最大的做为第二个,可以理解为尽可能的使得误差最大,那我选取这个就可以纠正的更多。
下面为几个关键公式:
希望可以看懂,因为这公式里包含了很多信息。
(https://zhuanlan.zhihu.com/p/65453337)
原对偶问题:
引入拉格郎日:
引入拉格郎日后式子的KKT条件:
最最关键,由上面KKT可以得出停机条件:
证明
( 参考<复制>同上:https://zhuanlan.zhihu.com/p/65453337),找了很久的证明,没证明自己看结论很难受
针对第二个问题,选变量完成后,怎样求解解析解?
个人感觉就三步(宏观上解释):
(1)不考虑约束条件,经过一系列变形代换,求解一个变量a2的值。
(2)加上约束条件,确定实际a2(简单理解为,如果在可行域内则为实际求解值,不在则为取边界值,简单来说就是剪切一下)
(3)利用a2求解a1(虽说是双变量,但是由于 a1+a2 = 常数,所以其实是一个单变量,求解一个,另一个确定,意味着其实自由变量只有一个。利用 初始(a1+a2) = 现在(a1+a2),得到其中一个便可以求解另一个)
最后一个小问题
到这里,其实就没什么了,但我还有一个疑问,(a1,a2,a3)应该怎么初始化??????
代码初始化是:全0
简单了解
特写一小节来说点自己没看到的,这么来说,你看到的大多数博客都在推导,我们来俯视一下这个过程 (一大堆公式定理)——> (结论),自己真正去用,用的是推出来的结论,但是它难在你怎么推出来这个结论。
如何求解请参考资料,这里想给出一个直观的认识,简单看个过程就好,从茫茫理论换换口味,说不定会有点启发(直接贴李航的伪代码)
KTT条件
梯度系列
理解KKT有多个角度,看过纯粹的证明,很有道理,很符合逻辑,但是,为什么?所以,遍历所有可视化或者浅显的解释,发现想要理解,就必须从理解梯度开始,当然,我这里想一棒子到底,把所有相关的都看一遍。
全微分
(https://www.matongxue.com/madocs/218.html)
全导数
(https://www.zhihu.com/question/26966355/answer/154857139)
微分和导数的关系
(https://www.matongxue.com/madocs/15.html)
理解方向导数和梯度关系
(https://www.matongxue.com/madocs/222.html)
理解KKT
理解拉格郎日法对KKT很有用,不是单纯的形式,而是为什么拉格郎日是这样?建议可以看看下面教程。
理解拉格郎日乘子法
(https://www.matongxue.com/madocs/939.html)
如何理解拉格朗日乘子法和KKT条件
(https://www.matongxue.com/madocs/987.html)
实操注意
-
SVM涉及距离,意味着输入样本需要进行标准化处理。
-
软间隔的惩罚系数C,越小,则允许错误点越多,越大,则允许越小。
-
RBF径向基函数也称高斯核函数,高斯核函数对样本映射结果是很复杂的,本质是将样本映射到无穷的空间上,称为高斯核函数的原因是和正太分布(也是高斯函数)比较像。高斯核函数对于每一个数据点都是landmark。 m × n的数据映射成了m × m的数据
-
高斯核函数开销很大,但如果初始维度比较高,样本比较少。
即 m(样本)<n(特征维度),用高斯核函数是很好的。(典例如NLP领域)。
代码
同样说明,本人代码参考某大佬开源代码(代码内指明),在看懂的基础上自己修改成了自己舒服的样子,有几点需要注意。
1. 本人数据直接用的鸢尾花数据集。
2. 核函数部分本人暂时没有在原有两个的基础上增加。
3. 本人画图程序暂时没有升级(可视化支撑向量,边界等等),只是单纯的可视化分类超平面。
4. 原代码本人有少许地方也尚未理解清楚原作者的本意,基本都有标注。
5. 感谢大佬的开源,当然,同时也不得感叹,网上搜的代码都和这个版本一样.......想从不同角度理解看不懂的都做不到...
6. 本人的改动主要是形式上的优化,包装成类,添加可视化,本来想做一个随程序动态的变化的可视化,但是由于某个不太影响的Bug暂时没有解决,暂时没有做。
学习参考
[1] 统计机器学习/李航 (个人认为李航SVM章节推导比西瓜书更好)
[2] B站大法(结合李航书的一个手推视频)
[3] sklearn 用法(+ 核函数的一些讨论)
https://www.bilibili.com/video/av36830483/?p=5
[4] SMO学习系列
知乎系列文章:
(1)https://zhuanlan.zhihu.com/p/29212107
csdn博客
(2)https://blog.csdn.net/luoshixian099/article/details/51227754 (推荐)
[5] KKT条件
- 梯度和偏导数
https://baijiahao.baidu.com/s?id=1627719346341492607&wfr=spider&for=pc
- 梯度和方向导数
https://blog.csdn.net/youhuakongzhi/article/details/80565176
https://www.matongxue.com/madocs/222.html
- 拉格朗日乘子法和KKT条件