之前学SVM的时候是在看Deformable Part Model的论文才去翻看了Bishop的经典书籍,学了个推导。学的时候是小白,只弄懂了SVM推导的过程,但是一些细节是知其然不知其所以然。所以参考了一些博客和书籍,总结一下SVM的一些知识点和经常被忽略的细节。这是自我认知的学习笔记,也希望能帮到一些和我一样的小白
在机器学习领域,无论是分类还是回归,都可以看做是一个用数据去雕刻一个模具的过程。回归模型是给定输入数据x∈ Rn , 输出预测实数值y;而分类模型是给定输入数据x,输出分类预测{+1, -1}。本质上,分类和回归的思路是一样。
通常,我们有两个数据集,training set 和testing set; 我们先用training set的数据去雕刻模具(模型),再用testing set 数据去检验模型的性能。
- training set 通常包含输入x和输出y,告诉你“这样的x我期望得到这样的y”
- testing set 也包含多个输入x和输出y,让你“根据这个x预测y的值,并和我的y比较”
- 通常,training set的数据量要远超过testing set
数据集的选择是影响机器学习性能的一大关键点。好的数据集能保证在训练之后,用新加入的testing数据也可以做出精准预测;而差的数据集即使在给定的testing set能有100%的预测率(无论是分类预测还是回归预测),也很难应用到开放的测试数据中。关于数据集的质量胖丁我也半知半解,有兴趣的朋友可以自己研究一下。
————————————————万恶的分割线———————————————————-
在这里,我们先写下SVM的几个特性,后面我们会慢慢说明:
- SVM的模型只取决于training set中的少数几个点
- 基本的SVM模型假设所有数据点线性可分,即存在一个线性方程将两个类别的点分隔在两边
- SVM算法的一大前提是其代价函数(cost function)是凸函数(convex):
- 在机器学习领域,凸函数通常是保证我们能得出全局最优解的前提。
- 对于一个函数 f(x) ,我们可以这么求证它是凸函数:如果 ∀x≠0 我们有 f(x)≥0 ,则可以说 f(x) 的Hessian矩阵(二阶导矩阵)是半正定的,所以f是凸函数
- 在凸函数领域,当原问题不方便求解时,我们可以先求解其对偶问题;在满足一定条件的情况下,其对偶问题的解等同于原问题的解。
- 核函数是SVM的魅力所在,不同选择的核函数使得SVM的分类面更加变化多端
SVM分类器既是分类模型,也可以看作线性回归模型。以SVM使用最普遍的binary分类来说(即两个类别做分类),SVM分类器通过寻求最佳分类边缘的方式,将两个类别的点(x向量)用我们的最佳边缘分割开。对于n=2而言,就是寻找一条最完美的直线;如果n>2,则是寻找超平面。我们的任务就是要找到这个最佳边缘,使得
- 两个类别的点分处于直线/超平面(super plane)两边
- 直线与最近的点的(Euclidean)距离尽可能大
接下来我们来进行最复杂也是最有趣的部分—-SVM的推导。
首先,我们要定义我们对于模型的假设函数(hypothesis):
y(x)=wTϕ(x)+b
其中,
x,w∈Rn
,
b∈R
。
ϕ(x)
叫做核函数,在这里为了简便,我们假设核函数为
ϕ(x)=x
。注意这里的
wTx
是dot product,即
wTx=w1∗x1+w2∗x2+...+wn∗xn
。
所以我们寻找最佳边缘的任务,也就是根据训练集 D =
{(x1,t1),(x2,t2),…,(xm,tm)}
,寻找最佳的
w
和
b
的任务。在这里,
- 当 y(xi)>0 时, ti=+1
- 当 y(xi)<0 时, ti=−1
- (当 y(xi)=0 时, xi 在我们的分类面上)
因为我们假设所有的数据点线性可分,所以存在这么一个 y0(x)=w0Tx+b0 使得 tiy0(xi)>0 对于所有 xi 成立。我们的目标就是找到这么一个 y0 使得距离最近的点到 y0(x)=0 这个分类面的距离最大化。
接下来,我们对y里面的参数
w
和
b
进行归一化:分别变成
δi=tiy(xi)∥w∥=|y(xi)|∥w∥
是不是很眼熟?这就是 xi 到分类面的Euclidean距离。现在我们可以来定义我们所求解的问题:
argmaxw,b{1∥w∥mini(ti(wTϕ(xi)+b))}
通俗点解释这道式子,就是我们要找到这么一对
w
和
b
,使得
前面说过,我们的模型 w 和 b 只取决于少数的点,就是这些支持向量。支持向量的个数至少会有两个。因为如果你只找到一个支持向量,那么你只要稍微把分类面平移远一些,一定能再找到至少一个。SVM优美的地方就在于,它在保证所有点正确分割的情况下,只关注少量的支持向量,以求出最公平的分类边界。
现在我们要来找
…
式子太复杂了啊!!胖丁我比较笨,所以先给支持向量们加一个条件,让式子简化一下:
我们知道 mini(ti(wTϕ(xi)+b)) 得到的i就是支持向量的下标,那么因为支持向量们被胖丁限制住了,所以
换句话说,我们的优化问题变成了
也就是
因为我们后面会将这个式子求导,所以我们稍微改变一下:
这是一个凸函数求极值。然后把限制条件也改一下:
但是就是这样一道问题,胖丁还是解不出来~所以,只能借助先人伟大的智慧—-Lagrange 乘子法。
对于一般优化问题:
根据Lagrange乘子法求极值法则,我们能得到Lagrange公式:
其中 a=(a1,…,an)T 为Lagrange乘子。由于我们要求解一个拥有不等式约束的优化问题,我们需要用到KKT条件:
其中第三个条件实际上造就了SVM的高效性:当 gi(w)<0 时, ai=0 。这使得我们只需要考虑少量的 ai≠0 而不是所有 ai 。
这里我们省略了原Lagrange和KKT条件中的等式项,因为SVM优化的元问题中并没有等式约束项。
接下来我们简单介绍一下Lagrange+KKT的基本原理。不求面面俱到,只求通俗易懂。实际上,Lagrange本身只有一个约束条件: ai≥0 ,而KKT中的第一和第三个条件是可以推导出来的。
通过观察我们可以发现,原问题的
minwf(w)
其实相当于:
因为 ai≥0 而且 gi(w)≤0 ,也就是说 aigi(w)≤0 。那么当我们对 L(w,a) 求最大值的时候,我们可以找出适合的 a 使得 aigi(w)=0 ,这就是KKT中的第三个条件。所以有:
那么要如何求 minw(maxaL(w,a)) 呢?前面我们说过,
“在凸函数领域,当原问题不方便求解时,我们可以先求解其对偶问题;在满足一定条件的情况下,其对偶问题的解等同于原问题的解。”
也就是说
通过观察我们发现,对偶问题中的 minwL(w,a) 实际上就是对 L(w,a) 求导并找出 w∗ 使得 ▽wL(w,a)=0 。这就是KKT中的第一个条件。
至此,我们得到了KKT的全部三个条件。在满足这三个条件的情况下,我们就能找到最佳的 w∗ ;也就是SVM中的 w∗ 和 b∗ 。
接下来我们把Lagrange公式和KKT条件移植到我们的问题上:
由于元问题条件中的
gi(w)≤0
变成了
ti(wTϕ(xi)+b)−1≥0
,也就是
−(ti(wTϕ(xi)+b)−1)≤0
,所以我们把Lagrange公式中间的
+
换成了
探究第二个条件可得:
探究第三个条件可得:
将第二个条件和第三个条件的推导代入Lagrange公式,(省略步骤)可得:
带有约束条件:
到这里,我们就可以通过找出最佳的
a
值,使得
L(a)
达到最大值,然后代入公式求出
w0
和
b0
。求解
a
的过程是一个典型的二次规划(quadratic programming)问题。借度娘的来解释一下什么是二次规划:
SMO算法是解决二次规划问题的常用方法之一,特别对于线性SVM的求解有较好的表现。原算法的论文参考John C. Platt在1998年发表的《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》
以下内容参考
http://blog.csdn.net/huangynn/article/details/18553069?locationNum=11
并加以改进和完善
John C. Platt给这个QP问题的
ai
的范围加上了一个上限C,即原问题变成:
s.t.
我们知道,式子中 ti 和 xi 的值都是固定的,而 ϕ 也是固定的函数。
算法的基本思路是:使用迭代优化,先选取一个符合条件的 a 序列,每次对其中2个项进行迭代优化,直到得到最优解。SMO的高效性体现就体现在其每次迭代只更新2个项,而固定其他n-2个参数的值不变,减少冗余的计算量。
而之所以一次迭代2个参数而非1个,是因为限制条件中的第二个不允许只改变单一个 ai 的值。
下面是一次迭代的示例:
假设我们已经拥有一组序列
a={a1,…,an}
且满足上面两个限制条件。假设我们选取
a1
和
a2
作为迭代参数,并固定其他参数的值:
根据 t1 和 t2 的值不同,我们要考虑两种情况:
在这里我们分别规定两种情况的上下限,后面有用:
当 t1=t2 :
当 t1=−t2 时:
把 a1 用 a2 的形式表示出来就是 a1=(Q+a2t2)t1 ,或者分成两种情况:
将其代入 L(a) :
由于除了
a1
和
a2
之外的
ai
都是固定值,我们可以得到:
已知 α , β 和 γ 是常数。要得到最大值的L,我们可以对L求导并求解二元一次方程 ▽a2L=0 ,然后代入 a2 求出 a1 。
然而, a2 的值本身还有上限和下限:
最后可以由 a 的最佳序列,算出最佳的 w ,进而算出 b 。
(未完待续)
松弛变量:
由于我们假设所有在D上面的点线性可分,我们有原问题:
但是现实问题中,D通常是线性不可分的,所以我们要允许【少许】的点不满足原问题的限制条件。而这个【少许】的量,就由松弛变量 ξ 决定:
C∑ni=1ξi 就是错误分类的惩罚项。
由于有松弛变量的加入,对偶函数的求解难度较高。可以使用hinge代替原损失函数。
(未完待续)
参考博文:
http://blog.sina.com.cn/s/blog_67ad2e480100zaue.html
http://www.wtoutiao.com/p/104xLRm.html
http://blog.csdn.net/xianlingmao/article/details/7919597
http://wenku.baidu.com/link?url=vJvmMRrRVd0_nN9_xDKi_yd8TUYRBz0oji1l_aDjQjtOc02ylR4BAfb0hgrjzTeu8Gxw79HNdtl4WUu-b4jHKft7C-RPjKP3lmz_0Hl_B8y
《Machine Learning and Pattern Recognition》 –Christ Bishop