SVM 是一个非常优雅的算法,具有完善的数学理论,虽然如今工业界用到的不多,但还是决定花点时间去写篇文章整理一下。
首先我们先来了解下什么是线性可分。
在二维空间上,两类点被一条直线完全分开叫做线性可分。
严格的数学定义是:
和 是 n 维欧氏空间中的两个点集。如果存在 n 维向量 w 和实数 b,使得所有属于 的点 都有 ,而对于所有属于 的点 则有 ,则我们称 和 线性可分。
从二维扩展到多维空间中时,将 和 完全正确地划分开的 就成了一个超平面。
为了使这个超平面更具鲁棒性,我们会去找最佳超平面,以最大间隔把两类样本分开的超平面,也称之为最大间隔超平面。
样本中距离超平面最近的一些点,这些点叫做支持向量。
SVM 想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面可以用下面这个线性方程来描述:
二维空间点 到直线 的距离公式是:
扩展到 n 维空间后,点 到直线 的距离为:
其中 。
如图所示,根据支持向量的定义我们知道,支持向量到超平面的距离为 d,其他点到超平面的距离大于 d。
于是我们有这样的一个公式:
稍作转化可以得到:
是正数,我们暂且令它为 1(之所以令它等于 1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),故:
将两个方程合并,我们可以简写为:
至此我们就可以得到最大间隔超平面的上下两个超平面:
每个支持向量到超平面的距离可以写为:
由上述 可以得到 ,所以我们得到:
最大化这个距离:
这里乘上 2 倍也是为了后面推导,对目标函数没有影响。刚刚我们得到支持向量 ,所以我们得到:
再做一个转换:
为了方便计算(去除 的根号),我们有:
所以得到的最优化问题是:
2.1.1 等式约束优化问题
本科高等数学学的拉格朗日程数法是等式约束优化问题:
我们令 ,函数 称为 Lagrange 函数,参数 称为 Lagrange 乘子没有非负要求。
利用必要条件找到可能的极值点:
具体是否为极值点需根据问题本身的具体情况检验。这个方程组称为等式约束的极值必要条件。
等式约束下的 Lagrange 乘数法引入了 个 Lagrange 乘子,我们将 与 一视同仁,把 也看作优化变量,共有 个优化变量。
2.1.2 不等式约束优化问题
而我们现在面对的是不等式优化问题,针对这种情况其主要思想是将不等式约束条件转变为等式约束条件,引入松弛变量,将松弛变量也是为优化变量。
以我们的例子为例:
我们引入松弛变量 得到 。这里加平方主要为了不再引入新的约束条件,如果只引入 那我们必须要保证 才能保证 ,这不符合我们的意愿。
由此我们将不等式约束转化为了等式约束,并得到 Lagrange 函数:
由等式约束优化问题极值的必要条件对其求解,联立方程:
(为什么取 ,可以通过几何性质来解释,有兴趣的同学可以查下 KKT 的证明)。
针对 我们有两种情况:
情形一:
由于 ,因此约束条件 不起作用,且
情形二:
此时 且 ,可以理解为约束条件 起作用了,且
综合可得: ,且在约束条件起作用时 ;约束不起作用时
由此方程组转换为:
以上便是不等式约束优化优化问题的 KKT(Karush-Kuhn-Tucker) 条件, 称为 KKT 乘子。
这个式子告诉了我们什么事情呢?
直观来讲就是,支持向量 ,所以 即可。而其他向量 。
我们原本问题时要求: ,即求
由于 ,故我们将问题转换为: :
假设找到了最佳参数是的目标函数取得了最小值 p。即 。而根据 ,可知 ,因此 ,为了找到最优的参数 ,使得 接近 p,故问题转换为出 。
故我们的最优化问题转换为:
出了上面的理解方式,我们还可以有另一种理解方式: 由于 ,
所以 ,所以转化后的式子和原来的式子也是一样的。
对偶问题其实就是将:
变成了:
假设有个函数 我们有:
也就是说,最大的里面挑出来的最小的也要比最小的里面挑出来的最大的要大。这关系实际上就是弱对偶关系,而强对偶关系是当等号成立时,即:
如果 是凸优化问题,强对偶性成立。而我们之前求的 KKT 条件是强对偶性的充要条件。
我们已知 SVM 优化的主问题是:
那么求解线性可分的 SVM 的步骤为:
步骤 1:
构造拉格朗日函数:
步骤 2:
利用强对偶性转化:
现对参数 w 和 b 求偏导数:
得到:
我们将这个结果带回到函数中可得:
也就是说:
步骤 3:
由步骤 2 得:
我们可以看出来这是一个二次规划问题,问题规模正比于训练样本数,我们常用 SMO(Sequential Minimal Optimization) 算法求解。
SMO(Sequential Minimal Optimization),序列最小优化算法,其核心思想非常简单:每次只优化一个参数,其他参数先固定住,仅求当前这个优化参数的极值。我们来看一下 SMO 算法在 SVM 中的应用。
我们刚说了 SMO 算法每次只优化一个参数,但我们的优化目标有约束条件: ,没法一次只变动一个参数。所以我们选择了一次选择两个参数。具体步骤为:
这样约束就变成了:
其中 ,由此可以得出 ,也就是说我们可以用 的表达式代替 。这样就相当于把目标问题转化成了仅有一个约束条件的最优化问题,仅有的约束是 。
2. 对于仅有一个约束条件的最优化问题,我们完全可以在 上对优化目标求偏导,令导数为零,从而求出变量值 ,然后根据 求出 。
3. 多次迭代直至收敛。
通过 SMO 求得最优解 。
步骤 4 :
我们求偏导数时得到:
由上式可求得 w。
我们知道所有 对应的点都是支持向量,我们可以随便找个支持向量,然后带入: ,求出 b 即可,
两边同乘 ,得
因为 ,所以:
为了更具鲁棒性,我们可以求得支持向量的均值:
步骤 5: w 和 b 都求出来了,我们就能构造出最大分割超平面:
分类决策函数:
其中 为阶跃函数:
将新样本点导入到决策函数中既可得到样本的分类。
在实际应用中,完全线性可分的样本是很少的,如果遇到了不能够完全线性可分的样本,我们应该怎么办?比如下面这个:
于是我们就有了软间隔,相比于硬间隔的苛刻条件,我们允许个别样本点出现在间隔带里面,比如:
我们允许部分样本点不满足约束条件:
为了度量这个间隔软到何种程度,我们为每个样本引入一个松弛变量 ,令 ,且 。对应如下图所示:
增加软间隔后我们的优化目标变成了:
其中 C 是一个大于 0 的常数,可以理解为错误样本的惩罚程度,若 C 为无穷大, 必然无穷小,如此一来线性 SVM 就又变成了线性可分 SVM;当 C 为有限值的时候,才会允许部分样本不遵循约束条件。
接下来我们将针对新的优化目标求解最优化问题:
步骤 1:
构造拉格朗日函数:
其中 和 是拉格朗日乘子,w、b 和 是主问题参数。
根据强对偶性,将对偶问题转换为:
步骤 2:
分别对主问题参数w、b 和 求偏导数,并令偏导数为 0,得出如下关系:
将这些关系带入拉格朗日函数中,得到:
最小化结果只有 而没有 ,所以现在只需要最大化 就好:
我们可以看到这个和硬间隔的一样,只是多了个约束条件。
然后我们利用 SMO 算法求解得到拉格朗日乘子 。
步骤 3 :
然后我们通过上面两个式子求出 w 和 b,最终求得超平面 ,
这边要注意一个问题,在间隔内的那部分样本点是不是支持向量?
我们可以由求参数 w 的那个式子可看出,只要 的点都能够影响我们的超平面,因此都是支持向量。
我们刚刚讨论的硬间隔和软间隔都是在说样本的完全线性可分或者大部分样本点的线性可分。
但我们可能会碰到的一种情况是样本点不是线性可分的,比如:
这种情况的解决方法就是:将二维线性不可分样本映射到高维空间中,让样本点在高维空间线性可分,比如:
对于在有限维度向量空间中线性不可分的样本,我们将其映射到更高维度的向量空间里,再通过间隔最大化的方式,学习得到支持向量机,就是非线性 SVM。
我们用 x 表示原来的样本点,用 表示 x 映射到特征新的特征空间后到新向量。那么分割超平面可以表示为: 。
对于非线性 SVM 的对偶问题就变成了:
可以看到与线性 SVM 唯一的不同就是:之前的 变成了 。
我们不禁有个疑问:只是做个内积运算,为什么要有核函数的呢?
这是因为低维空间映射到高维空间后维度可能会很大,如果将全部样本的点乘全部计算好,这样的计算量太大了。
但如果我们有这样的一核函数 , 与 在特征空间的内积等于它们在原始样本空间中通过函数 计算的结果,我们就不需要计算高维甚至无穷维空间的内积了。
举个例子:假设我们有一个多项式核函数:
带进样本点的后:
而它的展开项是:
如果没有核函数,我们则需要把向量映射成:
然后在进行内积计算,才能与多项式核函数达到相同的效果。
可见核函数的引入一方面减少了我们计算量,另一方面也减少了我们存储数据的内存使用量。
我们常用核函数有:
线性核函数
多项式核函数
高斯核函数
这三个常用的核函数中只有高斯核函数是需要调参的。
因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。