(写在前面:机器学习入行快2年了,多多少少用过一些算法,但由于敲公式太过浪费时间,所以一直搁置了开一个机器学习系列的博客。但是现在毕竟是电子化的时代,也不可能每时每刻都带着自己的记事本。如果可以掏出手机或iPad登陆网站就可以看到自己的一些笔记,才更有助于知识的巩固。借此机会,重新整理各大算法,希望自己能有更深的认识,如果有可能,也大言不惭的说希望能够帮助到需要帮助的朋友~)
(本篇博客内容来自台大林轩田老师Coursera Machine Learning Technology视频及周志华老师Machine Learning西瓜书,转载请标明出处)
一。SVM之起源(Support Vector Machine)
对于一个线性可分的数据集,使用感知器模型(PLA)可以得到一个线性的分类器:linear classifier: h(x) = sign(wTx)
但是PLA生成分类器的过程(如下图所示)是:
随机(Randomness)选取一个错误分类的数据点,更新分类器的参数。
但是这样的选择非常具有随机性,也就是说对于同一份数据集,每次用PLA算法训练的分类器可能都不一样,因此得到的分类器
可能如下图所示:
上图中的分类器都可能有PLA算法训练出来,但哪个是最好的呢?明眼人一看可能会说:第三个 !没错。为什么这样说呢?
因为,我们的数据集并不能总是保证是严格线性可分的,里面可能会有一些噪声,如果选择第一个或者第二个分类器的话,
随便一丢丢噪声分类器将会识别不出来!
所以说,如果距离分类超平面(hyperlane)最近的数据点的距离(margin)越大,该分类器的噪声容忍度就越大,也就是越robust。
于是,我们的目标就变为了:在保证所有训练数据分类正确的前提下,最大化距离分类超平面最小距离。
形式化的表示为:
二。SVM的标准形式之产生
有了上面的分析,下面我们就要来求任一点到分类超平面的距离,然后使最小距离最大化。
(1.)点到超平面的距离
假设超平面的方程为:wTx' + b = 0, 假设平面上的任意两点:x' 和 x'' ,则两点都满足 wTx' = -b; wTx'' = -b;
w为超平面的法向量, 则有 wT (x'' - x') = 0
那么,空间中的任意一点x到超平面的距离为x到超平面的一个向量到该超平面的单位法向量的投影,即:
所以,如果一个数据点与超平面的法向量同向,则乘积大于0;
如果一个数据点与超平面的法向量反向,则乘积小于0.
即: yn (wTxn+b) > 0.
所以SVM问题可以表示为:
(2.)缩放(下面关于问题的缩放解释,将使用周老师西瓜书中的解释,个人感觉更加直观一些。)
将 yn (wTxn+b) > 0 扩大一点,变为下图的形式(原谅我发射暖黄(?)光线的小台灯)
这样,margin = 2/||w||,而且只由边界上的点确定,这些点酒称为Support Vector.(这是个重要的结论,要牢记!!)
(3.)取倒数,将最大化问题变为最小化,得到如下SVM的标准形式:
三。使用QP解标准的SVM问题
通过以上的分析,我们得到了SVM的标准形式。那么,应该如何求解出参数w的最优解呢?
(1.)Gradient Decent?NoNoNo。因为这里是有s.t.条件的,无法找到一个下降的最优方向;
(2.)幸运的是,我们可以证明这个问题是convex凸函数
(3.)这类问题可以使用凸二次规划 quadratic programming(QP)的方法来求解。
求解方法如下:
QP的求解需要4个参数:Q(二次项系数), p(一次项系数), A(条件中的系数), c(条件中的常数)
将SVM的表达形式与之一一对应就可以了。得出四个系数之后,使用现在以后的计算包就可以轻而易举的解决SVM问题。
如果原始的数据资料集不是线性可分的怎么办?用Kernel Function将原始数据映射到线性空间中:zn = Φ(xn);
(4.)与Regularization的对比:
对于正则化来说,目标是最小化Ein,但是担心会overfitting,因此给出一定的限制条件;
对于SVM来说,目标是最小化wTw,但是限制是Ein = 0(或者稍微放松一下).
(两者的限制和目标刚好相反)
四。Dual SVM
动机:对于一般的SVM来说,如果我们的初始数据集不是线性可分的,这时我们会需要核函数将数据相高维度映射一下。
(一般的核函数变换都是低维度-》高维度)那么如果对于一个映射之后的数据,如果它的维度非常大,将会对我们的SVM的QP求解造成很大的困难。因此我们的目标
是希望将SVM的形式转化一下,在问题性质不变的前提小,使问题的求解仍然在原来的数据维度中。
(1.)Lagrange Multiplier(拉格朗日乘子法)
拉格朗日乘子法的思想是:将带限制条件的优化问题用拉格朗日乘子整合到一起,然后将新加入的乘子也作为未知参数
然后将问题分别求偏导。
所以,用Lagrange Multiplier表示General SVM就是如下形式:
可能会有疑问,为什么可以将General SVM表示成拉格朗日乘子法呢?
这里给出一点直观上的分析:
- 目标是求w, b.
- 如果通过Lagrange Multiplier求得的w, b不满足左边General SVM的条件,则1-yn(wTzn+b)>0, 而αn>=0,所以最大化L函数将会导致α趋向无穷;
- 如果通过Lagrange Multiplier求得的w, b不满足左边General SVM的条件,则1-yn(wTzn+b)<0,而αn>=0,所以最大化L函数将会导致α趋向0.
- 两者的目标是一致的!
对于L(b,w,α) = 1/2wTw + Σαn(1 - yn(wTzn+b)) 整体是一个二次函数,所以求一定条件下的最大值会非常麻烦,最好的办法是转化为求min。
下面的问题缩放的过程:
对上面图片的解释是:任意给出一个固定的α,则一堆α中最大的一定大于等于任意取出来的一个;
而对于取出的最好的一个α,所有的最大的中一定大于等于取出的这个最好的,所以,我们相当于将max, min换了一下位置。
将L(b, w, α)代入缩放后的式子:
对于上式,分别对b 和 wi 求偏导得:
然后将两个等式带回缩放后的式子,就得到了需要满足KKT condition(Karush-Kuhn-Tucker的Dual SVM:
然后像求解General SVM问题一样,用QP凸二次规划解Dual SVM问题,因此将系数对应过去就可以求的我们新加入的αn.(过程与General SVM的QP求解过程一致,这里不再赘述)
然后根据KKT条件的第三,第四个条件就可以求出w 与 b。
这里需要说明的一点:
- 第四个条件:αn(1 - yn(wTzn+b)) = 0 中 要么αn = 0; 要么1 - yn(wTzn+b) = 0;
- 再啰嗦一句:为什么会有这个条件呢?
- 回到Lagrange Multiplier最初使用的地方:如果是不好的w, b,那么我们的式子会趋于无穷大;
- 如果是好的w, b,那么我们的式子会趋于0,所有就得到了第四个条件的形式;
- 这个条件是primal-inner optimal,是SVM本身就需要满足的一个条件,也称为complementary slackness条件。
- 如果αn > 0,则我们才有办法求出b,而这时有1 - yn(wTzn+b) = 0 !!
- 1 - yn(wTzn+b) = 0(αn > 0)意味着我们使用的这些点刚刚好在边界上(如那张黄黄的照片所示),就是support vector啊!
- 再啰嗦一句:为什么会有这个条件呢?
- 满足αn > 0 的那些点在boundary上,称为support vector
- w = Σαn yn zn 所以,只有support vector才会用来计算w;
- b = yn - wTzn 所以,只有support vector才会用来计算b.
综上,SVM可以看作是这样一个问题:找出所有的support vector,然后用它们算出margin,其他的数据点一点都不重要。
五。Kernel Support Vector Machine
对于一个线性不可分的资料,我们如果使用SVM作为分类器,则必须要使用Kernel function,将原来低维线性不可分的数据转换为高维线性可分的数据,所以直接使用SVM的QP求解方法将不可避免
的使用转换后的空间zn,如果zn维度特别高则会导致我们的计算非常复杂,因此想到使用Dual SVM来解决使用核函数的SVM来避免这种情况的发生。
那么,Dual SVM是如何避免在zn空间做计算的呢?
(1.)对于上面第四部分我们求出的QP求解的Dual SVM是如下形式:
可以看到,在求Q矩阵的时候需要zn与zn的内积,我们是否有比较简单的方法可以将它简化一下呢?
(2.)假设我们使用二次转换(多项式转换)将原来的数据集的各种表示形式列出来:
如图中红框内所示,只要我们需要求zn与zn的内积,我们都可以转化为在原来的数据空间中计算,所以对于二次转换来说,
相当于将O(d2)的时间计算复杂度降为了O(d)。
(3.)下面我们来看一下w与b的计算过程是否一样可以简化呢?
所以,但凡需要求zn与zn的内积,我们都将转换到x空间中计算!!!
综上,Dual SVM确实可以简化含有核函数的QP计算过程。
下面开始导出Polynomial Kernel。
上面我们使用了Φ2 = (1, x1, x2, ...., x12, ....., xd2), 如果在一次项或者二次项前面加入一些系数,就得到了Polynomial Kernel。
Φ2 = (1, √2r x1, √2r x2, ...., r x12, ....., r xd2)
更一般的形式写为:
K2 (x, x') = 1 + 2r xTx' + r2(xTx')2 = (1 + rxTx')2
则General Polynomial Kernel SVM为:
- 需要注意的是,在Polynomial Kernel中有3个参数:ζ , γ 和 Q,其中Q来控制SVM的复杂度。
- 与之前模型不同的是,在SVM世界中做10次的多项式会简单很多,确定ζ , γ就可以轻而易举的计算;
- 但大家也会担心,太复杂的模型会不会overfitting?
- 可能啊!但是SVM中有large margin的保证,会帮助我们稍微降低一下复杂度。
**************************我是分界线*****************************
通过Dual SVM的分析,我们可以巧妙的将问题转化一下,使之可以不用直接在高维度的z空间内做计算而是直接在原来的x空间内计算。
那么,我们不需要care x空间转换后的z空间的维度是多少。可不可以将它转换到一个无限维度的空间里呢?Of course!
假设对于只有一个维度的数据集x,我们使用高斯变换:
在第三步我们使用指数函数在0处的泰勒展开式,就把数据集映射到了无限维度里面,然后导出了我们需要的kernel的形式。
所以对于一般形式的Gaussian Kernel,我们加入一个γ作为控制高斯核SVM的参数,得到如下形式:
然后将Kernel代入SVM做决策的函数里面,就得到了:
所以,Gaussian Kernel相当于将所有的Support Vector做高斯变换后的线性组合,
由于有这个性质,所以Gaussian Kernel也称为Radial Basis Function(RBF) Kernel.
但是使用Gaussian SVM特别需要注意γ的使用,因为大的γ会导致SVM更复杂,也就更容易overfitting,所以一定要慎用!
**************************我是分界线*****************************
比较Linear Kernel, Polynomial Kernel, Gaussian Kernel
- Linear Kernel:K(x, x') = xTx'
- 优点是:
- safe(一般不太会overfitting,所以线性的永远是我们的首选方案);
- fast,可以直接使用General SVM的QP方法来求解,比较迅速;
- explainable,可解释性较好,我们可以直接得到w, b,它们直接对应每个feature的权重。
- 缺点是:
- restrict:如果是线性不可分的资料就不太适用了!
- 优点是:
- Polynomial Kernel: K(x, x') = (ζ + γxTx')Q
- 优点是:
- 我们可以通过控制Q的大小任意改变模型的复杂度,一定程度上解决线性不可分的问题;
- 缺点是:
- 含有三个参数,太多啦!
- 优点是:
- Gaussian Kernel:K(x, x') = exp(-γ ||x - x'||2)
- 优点是:
- powerful:比线性的kernel更powerful;
- bounded:比多项式核更好计算一点;
- one parameter only:只有一个参数
- 缺点是:
- mysterious:与线性核相反的是,可解释性比较差(先将原始数据映射到一个无限维度中,然后找一个胖胖的边界,将所有的数据点分隔开?)
- too powerful!如果选择了太大的γ,SVM希望将所有的数据都分开,将会导致产生太过复杂的模型而overfitting。
- 优点是:
所以在实际应用中,一般是先使用线性的kernel,如果效果不好再使用gaussian kernel(小的γ)和多项式kernel(小的Q)。
**************************我是分界线*****************************
如何自己来定义kernel呢?kernel应该满足什么样的条件呢?
首先回到kernel的意义上。
- kernel具有什么含义呢?
- 实际是内积,表示的是两个数据点 x 和 x' 转换到z空间后的相似性
- 所以,什么样的是valid kernel呢?需要满足Mercer's consition:
- symmetric
- 核矩阵满足半正定性(positive semi-definite)
- 核矩阵是指:
所以,满足了以上条件就可以定义自己的kernel function了~
六。Soft Margin Support Vector Machine
* 当训练数据线性可分时,通过硬间隔最大化(hard margin maximization),学习一个线性的分类器,即线性可分支持向量机,又称为硬间隔支持向量机;
* 当训练数据近似线性可分时,通过软间隔最大化(soft margin maximization),学习一个线性的分类器,即线性支持向量机,有称为软间隔支持向量机;
* 当训练数据不可分时,通过使用kernel trick及软间隔最大化,学习非线性支持向量机。
线性不可分
线性不可分意味着某些样本点$(x_{i}, y_{i})$不能满足函数间隔大于等于1的约束条件 -- $y_{i}(w^{T}x_{i}+b) \ge 1$. 所以对每个样本点,引入一个松弛变量$\xi_{i} \ge 0$, 使函数间隔加上松弛变量大于等于1,这样约束条件变为:
$y_{i}(w^{T}x_{i}+b) \ge 1 - \xi_{i}$,
同时,对于每个松弛变量$\xi_{i}$,要付出一个代价,目标函数由原来的$\frac{1}{2}\lVert w \rVert^{2}$变为:
$\frac{1}{2}\lVert w \rVert^{2} + C\sum_{i=1}^{N}\xi_{i}$
其中,C>0为惩罚参数。C越大表示对错误分类的惩罚力度越大,越小则表示惩罚力度越小。
目标函数表达的含义有:使$\frac{1}{2}\lVert w \rVert^{2}$尽量小即间隔尽量大,同时使误分类点的个数尽量小。
Soft Margin SVM的标准形式
$min_{w, b, \xi}\frac{1}{2}\lVert w \rVert^{2} + C\sum_{i=1}^{N}\xi_{i}$
$s.t. y_{i}(w^{T}x_{i} + b) \ge 1 - \xi_{i}, i = 1,2,3...,N$
$s.t. \xi_{i} \ge 0$
(未完待续)