在浏览本篇博客之前,最好先查看一下我写的另一篇文章机器学习之初识SVM(点击可查阅哦),这样可以更好地为了结以下内容做铺垫!
支持向量机学习方法包括构建由简至繁的模型:线性可分支持向量机、线性支持向量机及非线性支持向量机。当训练数据线性可分时,通过硬间隔最大化,学习一个线性的分类器,即线性可分支持向量机,又称为硬间隔支持向量机;当训练数据近似线性可分时,通过软间隔最大化,也学习一个线性的分类器,即线性支持向量机,又称为软间隔支持向量机;当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
给定训练样本集 D=(x1,y1),(x2,y2),......(xm,ym),y∈−1,+1 ,分类学习最基本的想法就是基于训练集D在样本空间中找到一个超平面,将不同类别的样本分开。但是正如下图所示,能将训练样本分开的超平面可能有很多,那我们应该选择哪一个呢?
直观上看,我们应该去找位于两类训练样本“正中间”的超平面,也就是样本点与直线的距离最大那条直线。因为该超平面对训练样本局部扰动的容忍性最好。
在样本空间中,超平面可用如下方程来描述:
其中 w=(w1,w2,...wd) 为法向量,决定了超平面的方向;b为位移项,是超平面与远点之间的距离。显然超平面可由法向量w和位移b唯一确定。
一般来说,一个点距离超平面的距离d的大小可以表示分类预测的确信程度。在超平面
wTx+b=0
确定的情况下,
其中, ||w|| 为w的范数。
当点A表示某一实例
xi
,其类标记为
yi=+1
。点A与超平面的距离记作
di
,那么
当点A表示某一实例
xi
,其类标记为
yi=−1
。点A与超平面的距离记作
di
,那么
一般地,点
xi
与超平面的距离是
公式(4)也被称为超平面关于样本点 xi 的几何间隔。
最大间隔分离超平面
如上图所示,距离超平面最近的这几个训练样本点被称为支持向量,两个异类支持向量(即分别位于超平面两侧的点)到超平面的距离之和为
上面(5)的d称为间隔(margin)。
要求得最大间隔(即最大化 2w ),就是要满足:
显然,为了最大化间隔,仅需最大化 ||w||−1 ,这等价于最小化 ||w||2 ,于是上式可以重写为:
这就是支持向量机的基本模型。
因为现在的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。这个问题可以用现成的QP (Quadratic Programming) 优化包进行求解。一言以蔽之:在一定的约束条件下,目标最优,损失最小。
此外,由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(dual problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。
那什么是拉格朗日对偶性呢?简单来讲,通过给每一个约束条件加上一个拉格朗日乘子(Lagrange multiplier),定义拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出我们的问题):
然后令
容易验证,当某个约束条件不满足时,例如 yi(wTxi+b)<1 ,那么显然有 θ(w)=∞ (只要令 αi=∞ 即可)。而当所有约束条件都满足时,则最优值为 θ(w)=12||w||2 ,亦即最初要最小化的量。
因此,在要求约束条件得到满足的情况下最小化 12||w||2 ,实际上等价于直接最小化 θ(w) (当然,这里也有约束条件,就是 αi≥0,i=1,…,n) ,因为如果约束条件没有得到满足, θ(w) 会等于无穷大,自然不会是我们所要求的最小值。
具体写出来,目标函数变成了:
这里用表示 p∗ 这个问题的最优值,且和最初的问题是等价的。如果直接求解,那么一上来便得面对w和b两个参数,而 αi 又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:
交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用 d∗ 来表示。而且有 d∗≤p∗ ,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。
换言之,之所以从minmax的原始问题 p∗ ,转化为maxmin的对偶问题 d∗ ,一者因为 d∗ 是 p∗ 的近似解,二者,转化为对偶问题后,更容易求解。
下面可以先求L 对w、b的极小,再求L 对的极大。
对偶问题求解的3个步骤:
1)、首先固定,要让 L 关于 w 和 b 最小化,我们分别对w,b求偏导数,即令 ∂L/∂w 和 ∂L/∂b 等于零:
将以上结果代入之前的L:
得到:
有读者可能会问上述推导过程如何而来?说实话,其具体推导过程是比较复杂的,如下图所示:
最后,得到:
“倒数第4步”推导到“倒数第3步”使用了线性代数的转置运算,由于 ai 和 yi 都是实数,因此转置后与自身一样。“倒数第3步”推导到“倒数第2步”使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法运算法则。最后一步是上一步的顺序调整。
从上面的最后一个式子,我们可以看出,此时的拉格朗日函数只包含了一个变量,那就是 αi (求出了 αi 便能求出w和b)。
2)求对 α 的极大,即是关于对偶问题的最优化问题。经过上面第一个步骤的求w和b,得到的拉格朗日函数式子已经没有了变量w,b,只有 α 。从上面的式子得到:
这样,求出了 αi ,根据,即可求出w,然后通过:
3)在求得L(w, b, a) 关于 w 和 b 最小化,以及对 α 的极大之后,最后一步则可以利用SMO算法求解对偶问题中的拉格朗日乘子 α 。
线性支持向量机以及软间隔最大化
假设给定一个特征空间上的训练数据集
假设训练数据集不是线性可分的,通常情况是,训练数据中有一些特异点,将这些特异点去除以后,剩下的大部分的样本点组成的集合是线性可分的。
线性不可分意味着某些样本点
(xi,yi)
不能满足函数间隔大于等于1的约束条件,为了解决这个问题,可以对每个样本点
(xi,yi)
引进一个松弛变量
ζi≥0
,这样,约束条件变为:
同时,对于每个松弛变量 ζi ,支付一个代价 ζi ,目标函数由原来的
12||w||2 变为:
这里,C>0称为惩罚参数,一般由应用问题决定,C值大时对误分类的惩罚增大,
C值小时对误分类的惩罚减小,此时,最小化目标函数有两层含义:使 12||w||2 尽量小,同时使误分类的个数尽量少,C是调和二者的系数。
有了上面的思路,上面问题变成如下凸二次规划问题(原始优化问题):
上面的对偶问题是:
原始优化问题的拉格朗日函数是:
到目前为止,我们的 SVM 还比较弱,只能处理线性的情况,下面我们将引入核函数,进而推广到非线性分类问题。
非线性支持向量机和核函数
非线性分类问题是指通过利用非线性模型才能很好地进行分类的问题。先看一个例子:
由上图可见,无法用直线(线性模型)将正负实例正确分开,但是我们却可以用一条椭圆双曲线(非线性模型)将他们正确分开。
非线性问题往往不好求解,我们可以将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。正如上面的例子,通过将原始的二维空间映射到一个合适的三维空间,就能找到一个合适的超平面。
上面的例子说明,用线性分类方法求解非线性分类问题分为两步:首先使用一个变换将原来的空间的数据映射到新空间;然后在新空间里用线性分类学习方法从训练数据集中学习分类模型。核技巧就是属于这样的方法。
令
Φ(x)
表示将x映射后的特征向量,于是在特征空间中超平面所对应的模型可表示为
类似地,可得到:
其对偶问题是:
我们注意到上面式子的计算涉及到了就算
Φ(xi)TΦ(xj)
,这是样本
xi
与
xj
映射到特征空间后的内积,由于特征空间的维数可能很高,甚至可能是无穷维,因此直接计算
Φ(xi)TΦ(xj)
通常是困难的,因此,我们可以设想有这样一个函数:
然后用上面的式子,我们就不必直接去计算高维甚至无穷维特征空间的内积,于是,我们可以将公式改写成如下:
求解后,得到
这里的 k(xi,xj) 就是核函数。
那么常用的核函数都有什么呢?
1、线性核是最简单的核函数,核函数的数学公式如下:
2、多项式核实一种非标准核函数,它非常适合于正交归一化后的数据,其具体形式如下:
这个核函数是比较好用的,就是参数比较多,但是还算稳定。
3、这里说一种经典的鲁棒径向基核,即高斯核函数,鲁棒径向基核对于数据中的噪音有着较好的抗干扰能力,其参数决定了函数作用范围,超过了这个范围,数据的作用就“基本消失”。高斯核函数是这一族核函数的优秀代表,也是必须尝试的核函数,其数学形式如下:
虽然被广泛使用,但是这个核函数的性能对参数十分敏感,以至于有一大把的文献专门对这种核函数展开研究,同样,高斯核函数也有了很多的变种,如指数核,拉普拉斯核等。
4、指数核函数就是高斯核函数的变种,它仅仅是将向量之间的L2距离调整为L1距离,这样改动会对参数的依赖性降低,但是适用范围相对狭窄。其数学形式如下:
5、拉普拉斯核完全等价于指数核,唯一的区别在于前者对参数的敏感性降低,也是一种径向基核函数。
6、Sigmoid 核来源于神经网络,现在已经大量应用于深度学习,是当今机器学习的宠儿,它是S型的,所以被用作于“激活函数”。关于这个函数的性质可以说好几篇文献,大家可以随便找一篇深度学习的文章看看。
7、 二次有理核完完全全是作为高斯核的替代品出现,如果你觉得高斯核函数很耗时,那么不妨尝试一下这个核函数,顺便说一下,这个核函数作用域虽广,但是对参数十分敏感,慎用!!!!
此外,还可通过函数组合得到,例如:
1.若
k1
和
k2
为核函数,则对于任意正数a和b,其线性组合
也是核函数;
2.若
k1
和
k2
为核函数,则核函数的直积
也是核函数;
3.若
k1
为核函数,则对于任意函数
g(x)
,
也是核函数;
核函数的选择
线性核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
高斯核:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。我个人的体会是:使用libsvm,默认参数,RBF核比Linear核效果稍差。通过进行大量参数的尝试,一般能找到比linear核更好的效果。
至于到底该采用哪种核,要根据具体问题,有的数据是线性可分的,有的不可分,需要多尝试不同核不同参数。如果特征的提取的好,包含的信息量足够大,很多问题都是线性可分的。当然,如果有足够的时间去寻找RBF核参数,应该能达到更好的效果。
参考资料:
2、李航 - <<统计学习方法>>
3、周志华 - <<机器学习>>
相关博客:
1、机器学习系列之机器学习之决策树(Decision Tree)及其Python代码实现
2、机器学习系列之机器学习之Validation(验证,模型选择)
3、机器学习系列之机器学习之Logistic回归(逻辑蒂斯回归)
4、机器学习系列之机器学习之拉格朗日乘数法