本文是参照CSDN的July大神的热门博文《支持向量机通俗导论(理解SVM的三层境界》)写的。目的是因为July大神文中说,SVM理论的理解,需要一遍一遍的推导公式,直到脑中梳理下来,并可以直接推导相关公式的。本文的写作目的,是在笔者在第一次参考了July大神的博客,并手动推导公式成功后,希望通过Markdown的记录流程,进行第二遍对SVM理论的理解。另外,在笔者第一次研究SVM过程中会存在某些不懂的问题,笔者也会秉着July大神的理念——让没有机器学习理论基础的读者们看懂博文,尽量的将SVM的理论解释清楚。
再次说明,本文的最主要目的是笔者对博主July关于SVM理论介绍的二次学习,如果可以的话,也希望能给笔者的读者一些启发。
《支持向量机通俗导论(理解SVM的三层境界》)
《支持向量机(五)SMO算法 》
支持向量机(Support Vector Machine, SVM),通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
理解SVM,咱们必须先弄清楚一个概念:线性分类器。
给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类。如果用x表示数据点,用y表示类别(y可以取1或者-1,分别代表两个不同的类),一个线性分类器的学习目标便是要在n维的数据空间中找到一个超平面(hyper plane),这个超平面的方程可以表示为:
对于 y 取1或-1,可能有读者表示有疑问。其实1或-1的分类标准起源于logistic回归。
Logistic回归目的是从特征学习出一个0/1分类模型。这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
有假设函数:
(关于\theta θ 与\omega ω 的关系,后面式1.1.5中会给出解释)
而g(z) = \frac {1}{1+e^{-z}} g(z)=11+e−z 的图像如下图1.1所示:
从图中可以看出,Logister函数将范围为负无穷到正无穷的自变量z,映射到了区间(0, 1)。
前面提到的假设函数(式1.1.2),就是类型属于y = 1的概率。
\left\{\begin{matrix} \begin{align*} & P(y=1|x;\theta)=h_\theta(x) \\ & P(y=0|x;\theta)=1-h_\theta(x) \end{align*} \end{matrix} \right. \qquad (1.1.3)
这样,当我们要判别一个新来的特征属于哪个类时,只需求h_\theta(x) hθ(x) 即可,若h_\theta(x) hθ(x) 大于0.5,数据点就是y=1的类;反之,属于y=0类。
注: hθ(x) 只与 θTx 有关
如果我们只从特征 θTx 出发,那么我们所构建的模型的目标,就是让训练数据中,y=1 y=1 的特征 θT≫0 ,且 y=0 的特征 θT≪0 。Logistic回归,就是要学习得到 θ ,使得正例的特征远大于0,负例的特征远小于0,而且要在全部训练实例上达到这个目标。
为了后面的使用方便,我们这里对Logistic回归进行变形。
首先,将使用的结果标签 y=0 与 y=1 替换为 y=−1 与 y=1 。展开特征 θTx ,如下式:
下面举个简单的例子。如下图1.2所示,现在有一个二维平面,平面上有两种不同的数据,分别用圈和叉表示。由于这些数据是线性可分的,所以可以用一条直线将这两类数据分开,这条直线就相当于一个超平面,超平面一边的数据点所对应的y全是-1 ,另一边所对应的y全是1。
这个超平面可以用分类函数 f(x)=ωTx+b 表示,当 f(x) 等于0的时候,x便是位于超平面上的点,而 f(x) 大于0的点对应 y=1 的数据点, f(x) 小于0的点对应 y=−1 的点,如下图1.3所示:
注:
有的资料定义特征到结果的输出函数为 u=ω→⋅x→−b (后文也有用到),与这里定义的 f(x)=ωTx+b 本质上是一样的。
为什么呢?因为无论是 u=ω→⋅x→−b ,还是 f(x)=ωTx+b ,都不影响最终的优化结果。
下文你将看到,当我们转化到优化目标函数 max1∥ω∥,s.t.,yi(ωTxi+b,i=1,...,n) 的时候,为了求解方便,我们会把 yf(x) 令为1。即 yf(x) 无论是 y(ωT+b) ,还是 y(ωT−b) ,对我们要优化的目标函数 max1∥ω∥ 已经没有影响。
在July大神的博客中,有人问:SVM函数间隔中, γ^=y(wTx+b)=yf(x) 中的 y 是只取1和-1 吗? y 的唯一作用就是确保函数间隔的非负性?
此处总结July博客下面评论中的解释如下:
这个问题将问题搞混了。 y 是个分类标签,二分时,y就取了两个值,而刚好取了-1和1。只是因为用超平面分类时,不同的类中的点的函数值刚好有不同的符号,所以这里就用符号来进行了分类。
具体阐述如下:
1. 对于二类问题,因为 y 只取两个值,这两个是可以任意取的,只要是取两个值就行;
2. 支持向量机去求解二类问题,目标是求一个特征空间的超平面;而超平面分开的两类对应于超平面的函数值的符号是刚好相反的;
3. 基于上述两种考虑,为了使问题足够简单,我们取 y 的值为1和-1;
4. 在取定分类标签y为-1和1之后,一个平面正确分类样本数据,就相当于用这个平面计算 yf(x)>0 ;
5. 并且这样一来, yf(x) 也有了明确的几何含义;
总而言之要明白,二类问题的标签 y 是可以取任意两个值的,不管取怎样的值对于相同的样本点,只要分类相同,所有的y的不同取值都是等价的。之所以取某些特殊的值,只是因为这样一来计算会变得方便,理解变得容易。正如July大神的朋友张磊所言,svm中y取1或-1的历史原因是因为感知器最初的定义,实际取值可以任意,总能明确表示输入样本是否被误分,但是用+1、-1可以起码可以是问题描述简单化、式子表示简洁化、几何意义明确化。
举个例子:如果取 y 为1与2(比如原来取-1的现在取1,原来取1的现在取2 ),那么分类正确的判定标准就变成了 (y−1.5)⋅f(x)>0 。所以取1和-1只是为了计算简单方便,没有实质变化,更非一定必须取一正一负。
接下来的问题是,如何确定这个超平面呢?从直观上而言,这个超平面应该是最适合分开两类数据的直线。而判定“最适合”的标准就是这条直线离直线两边的数据的间隔最大。所以,得寻找有着最大间隔的超平面。
在超平面 ωTx+b=0 确定的情况下, |ωTx+b| 能够表示点x到超平面的距离远近,而通过观察 ωTx+b 的符号与类型标记 y 符号是否一致,可以判断分类是否正确。
所以,我们可以用 y⋅(ωT+b) 的正负性来判定或表示分类的正确性。所以我们便在此处引出了函数间隔(Functional Margin)的概念。
定义函数间隔如下所示:
式(1.3.1)中参数含义如下:
而超平面 (ω,b) 关于训练数据集 T 中所有样本点 (xi,yi) 的函数间隔最小值,便成为超平面 (ω,b) 关于 T 的函数间隔:
上面给出了函数间隔的定义,但这样定义的函数间隔有问题。比如成比例的改变 ω,b (如将他们都增大2倍),则函数间隔 f(x) 的值变成了原来的2倍,但此时超平面却没有改变。所以只有函数间隔远远不够。
事实上,我们可以对法向量 ω 加些约束条件,从而引出真正定义点到超平面的距离–几何间隔(geometrical margin)的概念。
假定对于一个点 x ,令其垂直投影到超平面上的对应点为 x0 , ω 是垂直于超平面的一个向量,为样本 x 到超平面的距离,如下图1.4所示:
根据平面几何知识,有:
又由于 x0 是超平面上的点,满足 f(x0)=0 ,所以代入超平面的方程 ωTx+b=0 ,可得到 ωTx0+b=0 ,即 ωTx0=−b 。
然后,令式(1.3.3)即 x=x0+γω∥ω∥ 两端同时乘 ωT ,再根据 ωTx0=−b 与 ωTω=∥ω∥2 ,可以得到:
对一个数据点进行分类,当超平面离数据点的”间隔”越大,分类的确信度(confidence)也越大。所以,为了使得分类的确信度尽量高,需要让所选择的超平面能够最大化该“间隔”值。这个间隔就是下图1.5中的Gap的一半。
通过由前面的分析可知:函数间隔不适合用来最大化间隔值,因为在超平面固定以后,可以等比例地缩放 ω 的长度和 b 的值,这样可以使得 f(x)=ωT+b 的值任意大,即函数间隔 γ^ 可以在超平面保持不变的情况下被取得任意大。
但由于几何间隔 γ˜ 与 ∥ω∥ 做了除运算,所以在缩放 ω 与 b 的时候,几何间隔 γ˜ 不会改变,它只随着超平面的变化而变动。因此,这是更加合适的一个间隔,即这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。
最大间隔分类器(maximum margin classifier)的目标函数可以定义为:
注:为什么令 γ^=1 ?
在几何间隔部分说到,若成比例改变 ω,b ,超平面不会改变,但函数间隔 γ^ 会成比例改变,所以可以通过等比例改变 ω,b 值的方法使函数间隔 γ^=1 。
具体方法:令 γ^=y(ωTx+b) 中的 ω,b 同乘 γ^=1 ,得到 ω′=ωγ^,b′=bγ^ ,再将 ω′,b′ 代入式(1.4.1)中,即得到最大间隔分类器的目标函数。
此处如下图1.6所示:
至此算是将SVM的第一层讲解完毕,对于那些只关心怎么用SVM的朋友便已足够,不必再更进一层深究其更深的原理。
接着考虑上一章中得到的式(1.4.3)中的目标函数:
由于现在的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。
这个问题可以用现成的QP (Quadratic Programming) 优化包进行求解。一言以蔽之:在一定的约束条件下,目标最优,损失最小。
此外,由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(Dual Problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法。
这样做的优点在于:
什么是拉格朗日对偶型呢?简单的讲,通过给每一个约束条件加上一个拉格朗日乘子 α (Lagrange Multiplier),定义拉格朗日函数如下式(2.1.2):
注:
1. 这里定义为拉格朗日函数的好处,在于通过拉格朗日函数将约束条件融合到目标函数里,从而只用一个函数表达式便能清楚表达出我们的问题。(具体内容可以见大学课堂的概率论教材);
2. 拉格朗日乘子 α={αi},i=1,...,n ,且 αi>0,i=1,...,n ;
然后令:
下面,我们可以先求 L 对 ω,b 的极小值,然后求 L 对 α 的极大值。
上一小节中提到,在满足某些条件的情况下, d∗=p∗ 。这里某些条件是指Slater条件。
所谓Slater条件,就是指凸优化问题:如果存在一个点 x ,使得所有等式约束都成立,而且所有不等式约束都严格成立(即取 >,< ,不取 ≥,≤ ),则满足Slater条件。
对于此处,Slater条件成立,所以 d∗≤p∗ 可以取等号。
一般情况下,一个最优化数学模型能表示成下列标准形式:
同时,我们需要了解以下两点:
而KKT条件就是指上面式(2.1.6)中最优化数学模型的标准形式中的最小点 x∗ 必须满足下面的条件,这些条件如下式(2.1.7)所示:
因为我们现在转化为求解第二个问题。也就是说,原始问题(即式(1.4.3)) max1∥ω∥ ,通过满足KKT条件,已经转化成了对偶问题(即式(2.1.5)) maxαi≥0minω,bL(ω,b,α)=d∗ 。
求解这个对偶学习问题,分为三个步骤:
1. 令 L(ω,b,α) 关于 ω 和 b 最小化;
2. 利用SMO算法求解对偶问题中的拉格朗日乘子,求对 α 的极大;
3. 求参数 ω,b ;
注:July大神的原文中的步骤与笔者的不同,是因为笔者没有理解按照July大神的步骤。按照原文中的(2)(3)步骤的话,是已经在步骤(2)中求出了 α 的极大(即已经求出了 α ),然后又在步骤(3)中用SMO算法求了一遍 α ,这是笔者不能理解的。所以笔者在此按照自己的理解,把这三个步骤改了一下。如果真有读者看到了这里而且有指点意见的话,笔者感激不尽。
下面按步骤进行说明:
对于式(2.1.2),我们分别对 ω,b 求偏导数,即令 ∂L∂ω,∂L∂b 等于0。
注:关于二范数的求导如下式(2.1.9)所示:
将上式(2.1.8)代入之前的式(2.1.2),即 L=12∥ω∥2−∑ni=1αi[yi(ωTxi+b)−1] 中,得到:
在式(2.1.10)中我们可以看出,由于 xi,yi 都是已知量,所以此时的拉格朗日函数只包含了一个变量,那就是 αi(i=1,...,n) 。只要求出了 αi ,就能在后面的步骤中求出 ω,b ,从而求出分类函数 f(x)=ωT+b 。
求对 α 的极大值,就是关于对偶问题的最优化问题。经过上一个步骤的求取 ω,b ,得到的拉格朗日函数已经没有了变量 ω,b ,只存在变量 α 。
通过上面的式(2.1.5), (2.1.6), (2.1.10),可以得到此时的目标函数:
这样求出了极值情况下的 αi ,就可以求出极值情况下的 ω,b 。
上面一步求出了拉格朗日乘子 α 。通过式(2.1.8),可以计算出:
到目前为止,我们的 SVM 还比较弱,只能处理线性的情况,下面我们将引入核函数,进而推广到非线性分类问题。
让我们再来看看上述推导过程中得到的一些有趣的形式。首先就是关于我们的超平面,对于一个数据点 x 分类,实际上是通过把 x 带入到 f(x)=ωTx+b 算出结果,然后根据其正负号进行类别划分的。在前面的推导中,我们得到式(2.1.8)):
为什么非支持向量对应的 α 等于零呢?直观上来理解的话,就是这些“后方”的点(即在超平面另一侧的点)——正如我们之前分析过的一样,对超平面是没有影响的,由于分类完全有超平面决定,所以这些无关的点并不会参与分类问题的计算,因而也就不会产生任何影响了。
在本节第一小节中,通过拉格朗日乘子得到的目标函数(式(2.1.3))如下:
事实上,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。
在上文中,我们已经了解到了SVM处理线性可分的情况,那对于非线性的数据SVM应该怎么处理?对于非线性的情况,SVM 的处理方法是选择一个核函数\mathcal{K}(⋅,⋅) K(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图2.1所示,一堆数据在二维空间无法划分,从而映射到三维空间里划分:
而由前面的内容可以了解到,对偶形式是线性学习器的一个重要性质,这意味着假设可以表达为训练点的线性组合,因此决策规则可以用测试点和训练点的内积来表示:
f(x) = \sum_{i=1}^n \alpha_i y_i \langle \phi (x_i) , \phi (x)\rangle + b \qquad (2.2.2)
来看个核函数的例子。如下图2.2所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时我们该如何把这两类数据分开?
注:后面会有July大神的好友pluskid提供的gif动图说明。
在进一步描述Kernel的细节之前,不妨再来看看这个例子映射过后的直观例子。虽然我们可能无法把 5 维空间画出来,不过由于July大神这里生成数据的时候就是用了特殊的情形,具体来说,我们这里的超平面实际的方程是这个样子(圆心在 X2 轴上的一个正圆),因此我们只需要把它映射到 Z1=x1,Z2=x21,Z3=x2 这样一个三维空间里就可以了。
下图2.3是July大神的好友pluskid提供的gif动图:
上面的例子可以体现,核函数相当于将原来的分类函数: