前言
本文是参照CSDN的July大神的热门博文《支持向量机通俗导论(理解SVM的三层境界》)写的。目的是因为July大神文中说,SVM理论的理解,需要一遍一遍的推导公式,直到脑中梳理下来,并可以直接推导相关公式的。本文的写作目的,是在笔者在第一次参考了July大神的博客,并手动推导公式成功后,希望通过Markdown的记录流程,进行第二遍对SVM理论的理解。另外,在笔者第一次研究SVM过程中会存在某些不懂的问题,笔者也会秉着July大神的理念——让没有机器学习理论基础的读者们看懂博文,尽量的将SVM的理论解释清楚。
再次说明,本文的最主要目的是笔者对博主July关于SVM理论介绍的二次学习,如果可以的话,也希望能给笔者的读者一些启发。
本文说明:
- 本文中涉及大量的向量,有的加了向量符号,有的没有加向量符号,但由于数量过多,且参考资料比较多,所以难以统一,笔者只能尽量的说明清楚。例如,文中的数据点
x
都是向量,核函数中的
K(xi,x) 与 K(xi→,x→) 表达的是同一个意思。
参考网址:
《支持向量机通俗导论(理解SVM的三层境界》)
《支持向量机(五)SMO算法 》
一、了解SVM
支持向量机(Support Vector Machine, SVM),通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
1. 分类标准的起源:Logistic回归
(1) 线性分类器
理解SVM,咱们必须先弄清楚一个概念:线性分类器。
给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类。如果用x表示数据点,用y表示类别(y可以取1或者-1,分别代表两个不同的类),一个线性分类器的学习目标便是要在n维的数据空间中找到一个超平面(hyper plane),这个超平面的方程可以表示为:
- ωT 中的T表示转置;
- x :数据点
y :类别(取1或-1)
对于 y 取1或-1,可能有读者表示有疑问。其实1或-1的分类标准起源于logistic回归。
(2) Logistic回归
Logistic回归目的是从特征学习出一个0/1分类模型。这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
有假设函数:
- x:n维数据点;
- g:Logistic函数;
- θTx :数据点x x 的特征;
(关于\theta
而g(z) = \frac {1}{1+e^{-z}}
g(z)=11+e−z
的图像如下图1.1所示:
图1.1 Logistic函数曲线
从图中可以看出,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>0 时,则 hθ(x)>0.5 ,即 g(z) 只是用来映射;
- θTx≫0 时,则 hθ(x)=1 ; θTx≪0 时,则 hθ(x)=0 ;
如果我们只从特征 θTx 出发,那么我们所构建的模型的目标,就是让训练数据中,y=1 y=1 的特征 θT≫0 ,且 y=0 的特征 θT≪0 。Logistic回归,就是要学习得到 θ ,使得正例的特征远大于0,负例的特征远小于0,而且要在全部训练实例上达到这个目标。
(3) Logistic回归变形
为了后面的使用方便,我们这里对Logistic回归进行变形。
首先,将使用的结果标签
y=0
与
y=1
替换为
y=−1
与
y=1
。展开特征
θTx
,如下式:
然后将上式(1.1.4)中的 θ0 替换为 b ,最后将后面的
也就是说,除了分类值y,由 y=0 变为 y=−1 之外,线性分类函数与Logistic回归的形式 hθ(x)=g(θTx)=11+e−θTx 没有区别。
进一步,我们可以将假设函数 hω,b(x)=g(ωTx+b) 中的 g(z) 函数做一个简化,将其简单映射到 y=−1 与 y=1 上。映射关系如下:
2. 线性分类的一个例子
(1) 线性分类举例
下面举个简单的例子。如下图1.2所示,现在有一个二维平面,平面上有两种不同的数据,分别用圈和叉表示。由于这些数据是线性可分的,所以可以用一条直线将这两类数据分开,这条直线就相当于一个超平面,超平面一边的数据点所对应的y全是-1 ,另一边所对应的y全是1。
图1.2 二维平面线性分类
这个超平面可以用分类函数
f(x)=ωTx+b
表示,当
f(x)
等于0的时候,x便是位于超平面上的点,而
f(x)
大于0的点对应
y=1
的数据点,
f(x)
小于0的点对应
y=−1
的点,如下图1.3所示:
图1.3 二维平面超平面分类
换言之,在进行分类的时候,遇到一个新的数据点 x ,将
注:
有的资料定义特征到结果的输出函数为
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∥ω∥
已经没有影响。
(2) y的取值意义
在July大神的博客中,有人问:SVM函数间隔中,
γ^=y(wTx+b)=yf(x)
中的
y
是只取1和-1 吗?
此处总结July博客下面评论中的解释如下:
这个问题将问题搞混了。
y
是个分类标签,二分时,y就取了两个值,而刚好取了-1和1。只是因为用超平面分类时,不同的类中的点的函数值刚好有不同的符号,所以这里就用符号来进行了分类。
具体阐述如下:
1. 对于二类问题,因为
2. 支持向量机去求解二类问题,目标是求一个特征空间的超平面;而超平面分开的两类对应于超平面的函数值的符号是刚好相反的;
3. 基于上述两种考虑,为了使问题足够简单,我们取
y
的值为1和-1;
4. 在取定分类标签y为-1和1之后,一个平面正确分类样本数据,就相当于用这个平面计算
5. 并且这样一来,
yf(x)
也有了明确的几何含义;
总而言之要明白,二类问题的标签
y
是可以取任意两个值的,不管取怎样的值对于相同的样本点,只要分类相同,所有的y的不同取值都是等价的。之所以取某些特殊的值,只是因为这样一来计算会变得方便,理解变得容易。正如July大神的朋友张磊所言,svm中y取1或-1的历史原因是因为感知器最初的定义,实际取值可以任意,总能明确表示输入样本是否被误分,但是用+1、-1可以起码可以是问题描述简单化、式子表示简洁化、几何意义明确化。
举个例子:如果取
接下来的问题是,如何确定这个超平面呢?从直观上而言,这个超平面应该是最适合分开两类数据的直线。而判定“最适合”的标准就是这条直线离直线两边的数据的间隔最大。所以,得寻找有着最大间隔的超平面。
3. 函数间隔与几何间隔
(1) 函数间隔(Functional Margin)
在超平面
ωTx+b=0
确定的情况下,
|ωTx+b|
能够表示点x到超平面的距离远近,而通过观察
ωTx+b
的符号与类型标记
y
符号是否一致,可以判断分类是否正确。
所以,我们可以用
定义函数间隔如下所示:
式(1.3.1)中参数含义如下:
-
- x :特征;
y :结果标签;- i :表示第i个样本;
而超平面
(ω,b) 关于训练数据集 T 中所有样本点(xi,yi) 的函数间隔最小值,便成为超平面 (ω,b) 关于 T 的函数间隔:
γ^=minγi^(i=1,...n)(1.3.2) (2) 几何间隔(Geometrical Margin)
上面给出了函数间隔的定义,但这样定义的函数间隔有问题。比如成比例的改变 ω,b (如将他们都增大2倍),则函数间隔 f(x) 的值变成了原来的2倍,但此时超平面却没有改变。所以只有函数间隔远远不够。
事实上,我们可以对法向量 ω 加些约束条件,从而引出真正定义点到超平面的距离–几何间隔(geometrical margin)的概念。
假定对于一个点 x ,令其垂直投影到超平面上的对应点为x0 , ω 是垂直于超平面的一个向量,为样本 x 到超平面的距离,如下图1.4所示:
图1.4 点x 在超平面的投影 x0
根据平面几何知识,有:
x=x0+γω∥ω∥(1.3.3)
上式(1.3.3)中参数说明如下:-
∥ω∥
:
ω
的二阶范数,是一个类似于模的表示长度的概念;
- 例如有向量 ω={a,b,c} ,则 ∥ω∥=a2+b2+c2−−−−−−−−−√ ;
- ω∥ω∥ 是单位向量,即一个向量除以它的模;
又由于 x0 是超平面上的点,满足 f(x0)=0 ,所以代入超平面的方程 ωTx+b=0 ,可得到 ωTx0+b=0 ,即 ωTx0=−b 。
然后,令式(1.3.3)即 x=x0+γω∥ω∥ 两端同时乘 ωT ,再根据 ωTx0=−b 与 ωTω=∥ω∥2 ,可以得到:
γ=ωT+b∥ω∥=f(x)∥ω∥(1.3.4)
为了得到 γ 的绝对值,令 γ 乘上对应的类别y,即可得出几何间隔(用 γ˜ 表示)的定义:
γ˜=yγ=γ^∥ω∥(1.3.5)
式(1.3.5)中, γ^ 是前文中的函数间隔。所以可以看出,几何间隔就是函数间隔除以 ∥ω∥ ,而且函数间隔 y⋅(ωTx+b)=yf(x) 实际上就是 |f(x)| ,只是人为定义的一个间隔度量。几何间隔 yf(x)∥ω∥ 才是直观上的点到超平面的距离。4. 最大间隔分类器(Maximum Margin Classifier)
(1) “间隔”的说明
对一个数据点进行分类,当超平面离数据点的”间隔”越大,分类的确信度(confidence)也越大。所以,为了使得分类的确信度尽量高,需要让所选择的超平面能够最大化该“间隔”值。这个间隔就是下图1.5中的Gap的一半。
图1.5 超平面的间隔
通过由前面的分析可知:函数间隔不适合用来最大化间隔值,因为在超平面固定以后,可以等比例地缩放 ω 的长度和 b 的值,这样可以使得
f(x)=ωT+b 的值任意大,即函数间隔 γ^ 可以在超平面保持不变的情况下被取得任意大。
但由于几何间隔 γ˜ 与 ∥ω∥ 做了除运算,所以在缩放 ω 与 b 的时候,几何间隔γ˜ 不会改变,它只随着超平面的变化而变动。因此,这是更加合适的一个间隔,即这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。(2) 最大间隔分类器的定义
最大间隔分类器(maximum margin classifier)的目标函数可以定义为:
maxγ˜(1.4.1)
同时需要满足一些条件,根据式(1.3.2)中间隔的定义,存在:
s.t.,yi(ωTxi+b)=γi^≥γ^,i=1,...,n(1.4.2)
上式(1.4.2)中, s.t. 即Subject to的缩写,约束条件的意思。
回顾式(1.3.5)中几何间隔的定义 γ˜=yγ=γ^∥ω∥ ,可知如果令函数间隔 γ^=1 ,则有 γ˜=1∥ω∥ ,且约束条件如上式(1.4.2)。综上,上述目标函数便转化成了:
⎧⎩⎨⎪⎪max1∥ω∥s.t.,yi(ωTxi+b)=γi^≥γ^,i=1,...,n(1.4.3)
上式(1.4.3),相当于在相应的约束条件 yi(ωTxi+b)≥1,i=1,...,n 下,将值 1∥ω∥ 最大化,即最大化几何间隔 γ˜ 。注:为什么令 γ^=1 ?
在几何间隔部分说到,若成比例改变 ω,b ,超平面不会改变,但函数间隔 γ^ 会成比例改变,所以可以通过等比例改变 ω,b 值的方法使函数间隔 γ^=1 。
具体方法:令 γ^=y(ωTx+b) 中的 ω,b 同乘 γ^=1 ,得到 ω′=ωγ^,b′=bγ^ ,再将 ω′,b′ 代入式(1.4.1)中,即得到最大间隔分类器的目标函数。
此处如下图1.6所示:
图1.6 超平面上的支持向量
中间的实线便是寻找到的最优超平面(Optimal Hyper Plane),其到两条虚线边界的距离相等,这个距离就是几何间隔 γ˜ 。两条虚线间隔边界之间的距离等于 2γ˜ ,而虚线边界上的点,就是支持向量。由于这些支持向量刚好在虚线间隔边界上,且我们之前把函数间隔 γ^ 设置为1,所以它们满足 y(ωTx+b)=1 。而对于其他所有不是支持向量的点,则显然有 y(ωTx+b)>1 。至此算是将SVM的第一层讲解完毕,对于那些只关心怎么用SVM的朋友便已足够,不必再更进一层深究其更深的原理。
二、深入SVM
1. 从线性可分到线性不可分
接着考虑上一章中得到的式(1.4.3)中的目标函数:
⎧⎩⎨⎪⎪max1∥ω∥s.t.,yi(ωT+b)=γi^≥γ^,i=1,...,n
由于求 max1∥ω∥ 的最大值,相当于求 12∥ω∥2 的最小值,所以上述目标函数等价于下式:
⎧⎩⎨min12∥ω∥2s.t.,yi(ωT+b)=γi^≥γ^,i=1,...,n(2.1.1)(1) 从原始问题到对偶问题的求解
由于现在的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。
这个问题可以用现成的QP (Quadratic Programming) 优化包进行求解。一言以蔽之:在一定的约束条件下,目标最优,损失最小。
此外,由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(Dual Problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法。
这样做的优点在于:- 对偶问题往往更容易求解;
- 可以自然的引入核函数,进而推广到非线性分类问题。
什么是拉格朗日对偶型呢?简单的讲,通过给每一个约束条件加上一个拉格朗日乘子 α (Lagrange Multiplier),定义拉格朗日函数如下式(2.1.2):
L(ω,b,α)=12∥ω∥2−∑i=1nαi[yi(ωTxi+b)−1](2.1.2)注:
1. 这里定义为拉格朗日函数的好处,在于通过拉格朗日函数将约束条件融合到目标函数里,从而只用一个函数表达式便能清楚表达出我们的问题。(具体内容可以见大学课堂的概率论教材);
2. 拉格朗日乘子 α={αi},i=1,...,n ,且 αi>0,i=1,...,n ;然后令:
θ(ω)=maxαi≥0L(ω,b,α)(2.1.3)
容易验证,当某个约束条件不满足时,例如 yi(ωTxi+b)<1 ,那么显然有 θ(ω)=+∞ (只要让 αi=+∞ 即可)。
而当所有约束条件都满足时,此时式(2.1.3)多项式的后一项 ∑ni=1αi[yi(ωTxi+b)−1]>0 ,此时式(2.1.3)的最优值为 θ(ω)=12∥ω∥2 ,该值也为最初要最小化的量。
因此,在约束条件得到满足的情况下(包括拉格朗日乘子的约束条件: α={αi},i=1,...,n ,且 αi>0,i=1,...,n ),最小化 12∥ω∥2 ,实际上等价于直接最小化(2.1.3)式 θ(ω) 。因为如果约束条件没有得到满足, θ(ω) 会等于无穷大,自然不会是我们所要求的最小值。
具体写出来,目标函数变成了:
minω,bθ(ω)=minω,bmaxαi≥0L(ω,b,α)=p∗(2.1.4)
这里用 p∗ 表示这个问题的最优解,而且与最初的问题等价。如果直接求解,那么一上来便得面对 ω 和b b 两个参数,而\alpha_iαi 又是不等式约束,这个求解过程不好做。所以这里我们把最小和最大的位置交换,变成:
\max _{\alpha_i \geq 0} \min _{\omega, b} \mathcal{L}(\omega, b, \alpha) = d^* \qquad (2.1.5)maxαi≥0minω,bL(ω,b,α)=d∗(2.1.5)
交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用 d∗ 表示,而且这里有 d∗≤p∗ ,在满足某些条件(后文中的Slater条件)的情况下, d∗=p∗ 。这时候就可以通过求解对偶问题,间接地求解原始问题。换句话说,之所以从式(2.1.4)中的原始问题 p∗ ,转换到式(2.1.5)中的对偶问题 d∗ ,一是因为 d∗ 是 p∗ 的近似解,而是因为转化为对偶问题后更容易求解。下面,我们可以先求 L 对 ω,b 的极小值,然后求 L 对 α 的极大值。
(2) KKT条件
上一小节中提到,在满足某些条件的情况下, d∗=p∗ 。这里某些条件是指Slater条件。
所谓Slater条件,就是指凸优化问题:如果存在一个点 x ,使得所有等式约束都成立,而且所有不等式约束都严格成立(即取>,< ,不取 ≥,≤ ),则满足Slater条件。
对于此处,Slater条件成立,所以 d∗≤p∗ 可以取等号。一般情况下,一个最优化数学模型能表示成下列标准形式:
minf(x)s.t. hj(x)=0,j=1,...,pgk(x)≤0,k=1,...,qx∈X⊂Rn(2.1.6)
式(2.1.6)中参数如下:- f(x) :需要最小化的函数;
- h(x) :等式约束;
- g(x) :不等式约束;
- p,q :等式约束和不等式约束的数量;
同时,我们需要了解以下两点:
- 凸优化的概念:
- χ⊂Rn 为一凸集, f:χ⊂Rn 为一个凸函数;
- 凸优化就是找出一点 x∗∈χ ,使得每一个 x∈χ 满足 f(x∗)≤f(x) ,即 x∗ 是 f(x) 的极小值点;
- KKT条件的意义:
- KKT条件是一个非线性规划(Nonlinear Programming)问题能有最优化解法的必要和充分条件;
而KKT条件就是指上面式(2.1.6)中最优化数学模型的标准形式中的最小点 x∗ 必须满足下面的条件,这些条件如下式(2.1.7)所示:
hj(x∗)=0,j=1,..,p,gk(x∗)≤0,k=1,...,q∇f(x∗)+∑j=1pλj∇hj(x∗)+∑k=1qμk∇gk(x∗)=0λj≠0,μk≤0,μkgk(x∗)=0(2.1.7)
经过论证,我们这里的问题是满足KKT条件的。原因如下:- 满足Slater条件;
- f=min12∥ω∥2 可微, g=yi(ωTxi+b)−1≥0 可微,即在拉格朗日函数 L(ω,b,α) 中, L 对 ω,b 都可导;
因为我们现在转化为求解第二个问题。也就是说,原始问题(即式(1.4.3)) max1∥ω∥ ,通过满足KKT条件,已经转化成了对偶问题(即式(2.1.5)) maxαi≥0minω,bL(ω,b,α)=d∗ 。
(3) 对偶问题求解的3个步骤
求解这个对偶学习问题,分为三个步骤:
1. 令 L(ω,b,α) 关于 ω 和 b 最小化;
2. 利用SMO算法求解对偶问题中的拉格朗日乘子,求对α 的极大;
3. 求参数 ω,b ;注:July大神的原文中的步骤与笔者的不同,是因为笔者没有理解按照July大神的步骤。按照原文中的(2)(3)步骤的话,是已经在步骤(2)中求出了 α 的极大(即已经求出了 α ),然后又在步骤(3)中用SMO算法求了一遍 α ,这是笔者不能理解的。所以笔者在此按照自己的理解,把这三个步骤改了一下。如果真有读者看到了这里而且有指点意见的话,笔者感激不尽。
下面按步骤进行说明:
A. 首先固定 α ,令 L 关于 ω,b 最小化
对于式(2.1.2),我们分别对 ω,b 求偏导数,即令 ∂L∂ω,∂L∂b 等于0。
∂L∂ω=0⇒ω=∑i=1nαiyixi∂L∂b=0⇒∑i=1nαiyi=0(2.1.8)注:关于二范数的求导如下式(2.1.9)所示:
∂∂x∥x−α∥2=x−α∥x−α∥2∂∥x∥22∂x=∂∥xTx∥2∂x=2x(2.1.9)将上式(2.1.8)代入之前的式(2.1.2),即 L=12∥ω∥2−∑ni=1αi[yi(ωTxi+b)−1] 中,得到:
L=12∑i,j=1nαiαjyiyjxTixj−∑i,j=1nαiαjyiyjxTixj−b∑i=1nαiyi+∑i=1nαi=∑i=1nαi−12∑i,j=1nαiαjyiyjxTixj(2.1.10)
关于上式(2.1.10)的推导比较复杂,如下式所示:
L(ω,b,α)=12∥ω∥2−∑i=1nαi[yi(ωTxi+b)−1]=12ωTω−∑i=1nαiyiωTxi−b∑i=1nαiyi+∑i=1nαi(2.1.11)
将式(2.1.8)中的 ω=∑ni=1αiyixi 代入上式(2.1.11)中得:
L(ω,b,α)=12ωT⋅∑i=1nαixiyi−ωT∑i=1nαiyixi−b∑i=1nαiyi+∑i=1nαi=−12ωT∑i=1nαiyixi−b∑i=1nαiyi+∑i=1nαi=−12[∑i=1nαiyixi]T∑i=1nαiyixi−b∑i=1nαiyi+∑i=1nαi=−12∑i=1nαiyi(xi)T⋅∑i=1nαiyixi−b∑i=1nαiyi+∑i=1nαi=−12∑i,j=1nαiαjyiyjxTixj+∑i=1nαi(2.1.12)
经过式(2.1.11)与(2.1.12)的推导,即可得到式(2.1.10)。在式(2.1.10)中我们可以看出,由于 xi,yi 都是已知量,所以此时的拉格朗日函数只包含了一个变量,那就是 αi(i=1,...,n) 。只要求出了 αi ,就能在后面的步骤中求出 ω,b ,从而求出分类函数 f(x)=ωT+b 。
B. 利用SMO算法求解对偶问题中的拉格朗日乘子
求对 α 的极大值,就是关于对偶问题的最优化问题。经过上一个步骤的求取 ω,b ,得到的拉格朗日函数已经没有了变量 ω,b ,只存在变量 α 。
通过上面的式(2.1.5), (2.1.6), (2.1.10),可以得到此时的目标函数:
maxα∑i=1nαi−12∑i=1nαiαjyiyjxTixjs.t.,αi≥0,i=1,...,n∑i=1nαiyi=0(2.1.13)
这时候通过SMO算法可以求解对偶问题中的拉格朗日乘子 α 。
注:关于SMO算法,可以跳到后文,即下一篇博客的第三章第5节。但SMO算法中需要使用到后文讲到的核函数、松弛因子的概念,所以笔者建议还是按照顺序进行学习。这样求出了极值情况下的 αi ,就可以求出极值情况下的 ω,b 。
C. 求参数 ω,b
上面一步求出了拉格朗日乘子 α 。通过式(2.1.8),可以计算出:
ω∗=∑i=1nαiyixi
这里的 ω∗ 是指极值情况下的 ω 值,再然后可以求 b 值。由于对于边界上的支持向量有:
y(ωTx+b)=1(2.1.14)
式(2.1.14)的参数 x 数据点是支持向量,参数y 表示支持向量所属类别(取值1或-1)。
而在 y=−1,y=1 的类别中,支持向量处于边界点。由超平面的图(即图1.6)可得:
⎧⎩⎨⎪⎪maxyi=−1ωTxi+b=−1minyi=1ωTxi+b=1(2.1.15)
上式(2.1.15)中的两式相加,得到极值情况下的 b 值,记为b∗ :
b∗=12[maxyi=−1ω∗Txi+minyi=1ω∗Txi](2.1.16)
这样就求出了 ω,b,α ,便求出了我们在线性情况下的超平面 f(x) 。(4) 线性不可分的情况
到目前为止,我们的 SVM 还比较弱,只能处理线性的情况,下面我们将引入核函数,进而推广到非线性分类问题。
让我们再来看看上述推导过程中得到的一些有趣的形式。首先就是关于我们的超平面,对于一个数据点 x 分类,实际上是通过把x 带入到 f(x)=ωTx+b 算出结果,然后根据其正负号进行类别划分的。在前面的推导中,我们得到式(2.1.8)):
ω∗=∑i=1nαiyixi
因此我们的分类函数为:
f(x)=(∑i=1nαiyixi)Tx+b=∑i=1nαiyi⟨xi,x⟩+b(2.1.17)
上式(2.1.17)中,符号 ⟨⋅,⋅⟩ 表示向量内积。
这里的形式的有趣之处在于,对于新点 x 的预测,只需要计算它与训练数据点的内积即可。这一点是之后使用核函数Kernel进行非线性推广的基本前提,至关重要。
此外,所谓 Supporting Vector 也在这里显示出来——事实上,所有非支持向量所对应的系数α 都是等于零的,因此对于新点的内积计算,不需要针对所有的训练数据,实际上只要针对少量的支持向量就可以了。为什么非支持向量对应的 α 等于零呢?直观上来理解的话,就是这些“后方”的点(即在超平面另一侧的点)——正如我们之前分析过的一样,对超平面是没有影响的,由于分类完全有超平面决定,所以这些无关的点并不会参与分类问题的计算,因而也就不会产生任何影响了。
在本节第一小节中,通过拉格朗日乘子得到的目标函数(式(2.1.3))如下:
θ(ω)=maxαi≥0L(ω,b,α)=maxαi≥012∥ω∥2−∑i=1nαi[yi(ωTxi+b)−1]
注意:如果x_i xi 是支持向量的话,上式右边的[y_i(\omega ^ T x_i + b) - 1] [yi(ωTxi+b)−1] 部分是等于0的,因为支持向量的函数间隔等于1;而对于非支持向量来说,函数间隔大于0,所以[y_i(\omega ^ T x_i + b) - 1] [yi(ωTxi+b)−1] 部分是大于0的。而\alpha_i \geq 0 αi≥0 (见式(2.1.2)的注),所以为了满足最大化,\alpha_i αi 必须等于0。这也是非支持向量点的局限性。
从第一章第4节到上述所有内容,便得到了一个最大间隔超平面分类器(Maximum Margin Hyper Plane Classifier),这就是所谓的支持向量机(Support Vector Machine)。但是到目前为止,我们的 SVM 还比较弱,只能处理线性的情况。不过,在得到了对偶dual 形式之后,通过核函数Kernel推广到非线性的情况就变成了一件非常容易的事情了。2. 核函数Kernel
(1) 特征空间的隐式映射
事实上,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。
在上文中,我们已经了解到了SVM处理线性可分的情况,那对于非线性的数据SVM应该怎么处理?对于非线性的情况,SVM 的处理方法是选择一个核函数\mathcal{K}(⋅,⋅) K(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图2.1所示,一堆数据在二维空间无法划分,从而映射到三维空间里划分:
图2.1 二维空间数据映射到三维空间里并划分
而在我们遇到核函数之前,如果用原始的方法,那么在用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器,因此,考虑的假设集是如下式(2.2.1)这种类型的函数:
f(x) = \sum_{i=1}^n \omega_i \phi_i (x) + b \qquad (2.2.1)f(x)=∑i=1nωiϕi(x)+b(2.2.1)
这里的\phi : X \rightarrow F ϕ:X→F 是从输入空间到某个特征空间的映射。
这意味着,建立非线性学习器分为两步:- 使用一个非线性映射将原始数据x x 变换到一个特征空间F;
- 在特征空间使用线性学习器分类。
而由前面的内容可以了解到,对偶形式是线性学习器的一个重要性质,这意味着假设可以表达为训练点的线性组合,因此决策规则可以用测试点和训练点的内积来表示:
f(x) = \sum_{i=1}^n \alpha_i y_i \langle \phi (x_i) , \phi (x)\rangle + b \qquad (2.2.2)f(x)=∑i=1nαiyi⟨ϕ(xi),ϕ(x)⟩+b(2.2.2)
上式(2.2.2)中, \langle \phi (x_i) , \phi (x)\rangle ⟨ϕ(xi),ϕ(x)⟩ 的意义就是在特征空间中直接计算内积。这种像在原始输入点的函数中一样,有可能将上面两个步骤融合到一起建立一个非线性的学习器,这样直接计算的方法,被称为核函数方法。
这里的核,是一个函数\mathcal{K} K ,对于所有的数据点 x,z∈X ,满足:
K(x,z)=⟨ϕ(x),ϕ(z)⟩(2.2.3)(2) 核函数:如何处理非线性数据
A. 原始数据的映射
来看个核函数的例子。如下图2.2所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时我们该如何把这两类数据分开?
注:后面会有July大神的好友pluskid提供的gif动图说明。
图2.2 圆圈状的数据
事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪音生成得到的。所以,一个理想的分界应该是一个“圆圈”,而不是一条线(超平面)。如果用 x1,x2 来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:
a1x1+a2x21+a3x2+a4x22+a5x1x2+a6=0(2.2.4)
在上面形式的基础上,如果我们构造另外一个五维的空间,其中五个坐标的值分别为 Z1=x1,Z2=x21,Z3=x2,Z4=x22,Z5=x1x2 ,那么显然式(2.2.4)中的方程在新的坐标系下可以写成:
∑i=15aiZi+a6=0(2.2.5)
关于新的坐标Z,这正是一个超平面的方程!解释一下,就是说如果我们做一个映射 ϕ:R2→R5 ,将 x 按照上面的规则映射为Z ,那么在新的五维空间中,原来的数据将会变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是Kernel方法处理非线性问题的基本思想。在进一步描述Kernel的细节之前,不妨再来看看这个例子映射过后的直观例子。虽然我们可能无法把 5 维空间画出来,不过由于July大神这里生成数据的时候就是用了特殊的情形,具体来说,我们这里的超平面实际的方程是这个样子(圆心在 X2 轴上的一个正圆),因此我们只需要把它映射到 Z1=x1,Z2=x21,Z3=x2 这样一个三维空间里就可以了。
下图2.3是July大神的好友pluskid提供的gif动图:
图2.3 映射到三维空间的数据动图
上图映射之后的结果,将坐标轴经过适当的旋转,就可以很明显地看出,数据是可以通过一个平面来分开的。上面的例子可以体现,核函数相当于将原来的分类函数:
f(x)=∑i=1nαiyi⟨xi,x⟩+b
映射成了式(2.2.2)中的:
f(x)=∑i=1nαiyi⟨ϕ(xi),ϕ(x)⟩+b
而其中的 α 值是可以通过求解由(2.1.13)映射变形来的对偶问题得到:
maxα∑i=1nαi−12∑i=1nαiαjyiyj⟨ϕ(xi),ϕ(xj)⟩s.t.,αi≥0,i=1,...,n∑i=1nαiyi=0(2.2.6)B. 维度爆炸问题的解决
看起来问题似乎解决了:拿到了非线性数据,就找一个映射 ϕ(⋅) ,然后一股脑把原来的数据映射到新空间中,再做线性 SVM 即可。
而实际上并没有这么简单,原因在于可能出现维度爆炸的情况。
刚才的方法稍想一下就会发现有问题:在最初的例子里,我们对一个二维空间做映射,选择的新空间是原始空间的所有一阶和二阶的组合,得到了五个维度;如果原始空间是三维,那么我们展开后会得到19维的新空间。这样的话,维度数目是呈爆炸增长的,这给 ϕ(⋅) 的计算带来了非常大的困难,而且如果遇到了无穷维的计算,就根本无从计算了。
这时候仍然需要Kernel方法解决这个问题。仍然从最开始的简单例子出发:设两个向量 x1=(η1,η2)T,x2=(ξ1,ξ2)T ,而 ϕ(⋅) 是前面说到的五维空间映射。映射后的内积为:
⟨ϕ(x1),ϕ(x2)⟩=η1ξ1+η21ξ21+η2ξ2+η22ξ22+η1η2ξ1ξ2(2.2.7)
对于上式(2.2.7)的推导,其实就是把 x1,x2 的映射 ϕ(x1),ϕ(x2) 展开,然后作相应的内积运算即可得到。讲解如下:
由上面可知,若有向量 x=(x1,x2)T ,则映射的结果应该是:
ϕ(x)=x1+x21+x2+x22+x1x2
又由于 x1=(η1,η2)T,x2=(ξ1,ξ2)T ,则 x1,x2 的映射如下:
ϕ(x1)=(η1,η21,η2,η22,η1η2)ϕ(x2)=(ξ1,ξ21,ξ2,ξ22,ξ1ξ2)
上式作内积运算即可得到式(2.2.7):
⟨ϕ(x1),ϕ(x2)⟩=η1ξ1+η21ξ21+η2ξ2+η22ξ22+η1η2ξ1ξ2另外,如果我们如果计算下式:
(⟨x1,x2⟩+1)2=2η1ξ1+η21ξ21+η2ξ2+η22ξ22+2η1η2ξ1ξ2+1(2.2.8)
式(2.2.8)与式(2.2.7)相比,两者有很多相似的地方。实际上,我们只要把映射的某几个维度线性缩放一下,然后再加上一个常数维度,计算出来的结果和经过映射的两向量内积的结果是相等的。
具体来说,如果对于向量 x=(a,b)T ,设置新映射如下式:
φ(x)=(2√a,a2,2√b,b2,2√ab,1)T(2.2.9)
则式(2.2.8)即 (⟨x1,x2⟩+1)2 的结果和内积 ⟨φ(x1),φ(x2)⟩ 的结果是相等的。然而两者的区别在于什么地方呢?- (⟨x1,x2⟩+1)2 :直接在原来的低维空间进行计算,而不需要显式的写出映射后的结果。
- ⟨φ(x1),φ(x2)⟩ :先映射到高维空间,然后根据内积的公式进行计算;
注:关于上述两个公式的说明
- (⟨x1,x2⟩+1)2 :是带内积的完全平方式,可以拆开,然后通过凑一个常数得到;
- ⟨φ(x1),φ(x2)⟩ :也是根据第一个式子拼凑得到的;
回到刚才提到的维度爆炸,在 ⟨φ(x1),φ(x2)⟩ 的方法不能计算的情况下,另一种方法 (⟨x1,x2⟩+1)2 却能从容处理,甚至无穷维度的情况也可以计算。
我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数(Kernel Function)。例如在刚才的例子中,我们的核函数就是:
K(x1,x2)=(⟨x1,x2⟩+1)2(2.2.10)核函数能简化映射空间中的内积运算——碰巧的是,在我们的SVM里需要计算的地方,数据向量总是以内积的形式出现的。对比刚才我们上面写出来的式(2.2.2),现在我们的分类函数为:
∑i=1nαiyiK(xi,x)+b(2.2.11)
这时候,前面式(2.2.6)也可以变形为:
maxα∑i=1nαi−12∑i=1nαiαjyiyjK(xi,xj)s.t.,αi≥0,i=1,...,n∑i=1nαiyi=0(2.2.12)
通过上式(2.2.12),我们可以由该对偶问题计算得到 α 。这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果却是等价的!
当然,因为我们这里的例子非常简单,所以我可以手工构造出对应于 ϕ(⋅) 的核函数出来,如果对于任意一个映射,想要构造出对应的核函数就很困难了。下面我们介绍几个常用的核函数。(3) 几个常用核函数
通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数)。
A. 多项式核
多项式核形式如下:
K(x1,x2)=(⟨x1,x2⟩+R)d(2.2.13)
显然刚才我们举的例子是这里多项式核的一个特例(R = 1, d = 2)。B. 高斯核
高斯核形式如下:
K(x1,x2)=exp(−∥x1−x2∥22σ2)(2.2.14)
这个核就是最开始提到过的,会将原始空间映射为无穷维空间的那个家伙。
不过,如果 σ 选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果 σ 选得很小,则可以将任意的数据映射为线性可分,当然这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。
不过总的来说,通过调控参数 σ ,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。下图2.4所示的例子便是把低维线性不可分的数据通过高斯核函数映射到了高维空间:
图2.4 高斯核将低维不可分数据映射到高维空间
C. 线性核
线性核形式如下:
K(x1,x2)=⟨x1,x2⟩(2.2.14)
这个核实际上就是原始空间中的内积,它存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了。这里的意思是说,咱们写代码或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核就可以了。这样便不用再分别写一个线性的,和一个非线性的,在形式上统一了起来。(4) 核函数的本质
上面说了这么多,还是要在这里概括一下核函数到底是什么东西。基本上就是三点:
- 实际中,我们会经常遇到线性不可分的样例,此时,我们的常用做法是把样例特征映射到高维空间中去(如上文的图2.2与图2.3,映射到高维空间后,相关特征便被分开了,也就达到了分类的目的);
- 但进一步,如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕的(即维度爆炸,如前文说的19维甚至无穷维的例子);
- 此时,核函数就隆重登场了,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。
最后引用一个例程,举例说明一下核函数解决非线性问题的直观效果:
假设现在你是一个农场主,圈养了一批羊群,但为预防狼群袭击羊群,你需要搭建一个篱笆来把羊群围起来。但是篱笆应该建在哪里呢?你很可能需要依据牛群和狼群的位置建立一个分类器,比较下图这几种不同的分类器,我们可以看到SVM完成了一个很完美的解决方案。
图2.5 SVM, Logistic回归,决策树的分类效果对比
这个例子从侧面简单说明了SVM使用非线性分类器的优势,而逻辑模式以及决策树模式都是使用了直线方法。3. 松弛变量
在本文第一节最开始讨论支持向量机的时候,我们就假定,数据是线性可分的,亦即我们可以找到一个可行的超平面将数据完全分开。后来为了处理非线性数据,在本章第2节使用Kernel方法对原来的线性 SVM 进行了推广,使得非线性的情况也能处理。虽然通过映射 ϕ(⋅) 将原始数据映射到高维空间之后,能够线性分隔的概率大大增加,但是对于某些情况还是很难处理。
例如可能并不是因为数据本身是非线性结构的,而只是因为数据有噪音。对于这种偏离正常位置很远的数据点,我们称之为outlier,在我们原来的 SVM 模型里,outlier 的存在有可能造成很大的影响,因为超平面本身就是只有少数几个支持向量组成的,如果这些支持向量里又存在 outlier 的话,其影响就很大了。比如下图2.6所示:
图2.6 outlier对超平面的影响
用黑圈圈起来的那个蓝点是一个 outlier ,它偏离了自己原本所应该在的那个半空间,如果直接忽略掉它的话,原来的分隔超平面还是挺好的。但是由于这个 outlier 的出现,导致分隔超平面不得不被挤歪了,变成途中黑色虚线所示(这只是一个示意图,并没有严格计算精确坐标),同时函数间隔也相应变小了。当然,更严重的情况是,如果这个 outlier 再往右上移动一些距离的话,我们将无法构造出能将数据分开的超平面来。
为了处理这种情况,SVM 允许数据点在一定程度上偏离一下超平面。例如上图中,黑色实线所对应的距离,就是该 outlier 偏离的距离,如果把它移动回来,就刚好落在原来的蓝色间隔边界上,而不会使得超平面发生变形了。换言之,在有松弛的情况下outline点也属于支持向量SV,同时,对于不同的支持向量,拉格朗日参数的值也不同。
在论文《Large Scale Machine Learning》中阐述了相关内容,如下图2.7所示:
图2.7 有松弛的outlier的处理
以分类平面为界,可以将点分为三类:- 远离分类平面的点值为0;
- 边缘上的点,值在
[0,1L]
之间;
- 其中,L为训练数据集个数,即数据集大小;
- outline数据和分类平面内部的数据值为1/L;
回到之前的问题,原本的约束条件如式(2.1.1)中:
yi(ωTxi+b)≥1,i=1,...,n
现在考虑到outlier问题,约束条件便改成:
yi(ωTxi+b)≥1−ξi,i=1,...,n(2.3.1)
其中 ξi≥0 称为松弛变量(Slack Variable),指对应数据点 xi 允许偏离的函数间隔的量。
当然,如果我们允许 ξi 任意大的话,那么任意的超平面都是符合条件的了,所以我们仍然需要在(2.1.1)式中原来的目标函数后面加上一项,使得这些 ξi 的总和最小。即现在的目标函数变为下式:
min12∥ω∥2+C∑i=1nξi(2.3.2)
上式(2.3.2)中,需要在寻找间隔最大的超平面,与保证数据点偏差最小之间进行权衡。而 C 是一个参数,是目标函数中上述两项的权重。如果把目标函数与约束条件完整的写出来,应该如下式所示:
min12∥ω∥2+C∑i=1nξis.t.,yi(ωTxi+b)≥1−ξi,i=1,...,nξi≥0,i=1,...,n(2.3.3)
再用本章第1节第(1)小节式(2.1.2)的方法,将约束条件加入到目标函数中,得到新的拉格朗日函数,如下式所示:
L(ω,b,ξ,α,r)=12∥ω∥2+C∑i=1nξi−∑i=1nαi[yi(ωTxi+b)−1]−∑i=1nriξi(2.3.4)
其中 ri 的存在与 αi 是一样的。 αi 是第一个限制条件 yi(ωTxi+b)≥1−ξi 的拉格朗日乘子, ri 是第二个限制条件 ξi≥0 的拉格朗日乘子。分析方法与前面一样,转换为对偶问题后,我们先让 L 对 ω,b,ξ 求偏导并令其为0,得到下式:
∂L∂ω=0⇒ω=∑i=1nαiyixi∂L∂b=0⇒∑i=1nαiyi=0∂L∂ξi=0⇒C−αi−ri=0,i=1,...,n(2.3.5)
将上式中的 ω 代入 L 并化简,得到和原来一样的目标函数(即式(2.1.13)):
maxα∑i=1nαi−12∑i,j=1nαiαjyiyj⟨xi,xj⟩
不过由于我们得到了式(2.3.5)中的限制条件 C−αi−ri=0 ,以及 ri≥0 ,因此可以得到 αi≤C 。因此现在整个对偶问题写作:
maxα∑i=1nαi−12∑i,j=1nαiαjyiyj⟨xi,xj⟩s.t.,0≤αi≤C,i=1,...,n∑i=1nαiyi=0(2.3.5)把前后的结果对比一下(错误修正:图中的Dual formulation中的Minimize应为maxmize):
图2.8 原公式与对偶公式的对比
可以对比得到,唯一的区别就是现在对偶变量 α 多了一个上限 C 。而 Kernel 化的非线性形式也是一样的,只要把⟨xi,xj⟩ 换成 K(xi,xj) 即可。
这样一来,一个完整的,可以处理线性和非线性并能容忍噪音和 outliers 的支持向量机终于介绍完毕了。4. 总结
不准确的说,SVM 它本质上即是一个分类方法。基本可以用如下内容来概括它的要点:
- 用 ωT+b 定义分类函数;
- 求 ω,b ;
- 为了寻找最大间隔,引出 12∥ω∥2 ;
- 引入拉格朗日因子,化为对拉格朗日乘子 α 的求解;
- 求解过程中,处理一系列最优化与凸二次规划的问题;
- 求解 α 时可以使用快速学习方法SMO;
- 处理非线性情况时,使用核函数;
- 核函数在低维计算,等效了高维表现,避免了直接映射到高维计算时可能出现的维度爆炸现象;
理解到这第二层,已经能满足绝大部分人一窥SVM原理的好奇心,然对于那些想在证明层面理解SVM的则还很不够,但进入第三层理解境界之前,建议读者要有比较好的数理基础和逻辑证明能力。毕竟原作者July大神尚且吃了不少苦头,更何况笔者一个机器学习的小渣渣……
后面第三章证明SVM的部分,由于CSDN篇幅所限,所以放在下面一篇博客中。