前言
在前一篇文章中介绍的 SVM 基本型,其实还可以进行优化。主要是利用核函数对向量内积的计算进行优化。另外,我们还将详细分析拉格朗日乘子法与KKT条件,以及KKT条件对SVM分类的作用。那我们先来看看核函数是什么。
核函数
在异或问题中,由于 \(0\oplus 0=0\)、\(1\oplus 1=0\)、\(0\oplus 1=1\)、\(1\oplus 0=1\),所有只有两类结果,我们将 0 标记为负号,将 1 标记为正号,并且将这四种情况形象地标注在下图左侧中。可以看到,对于这类样本点,我们无法找到线性可分的超平面,而只能绘制一条非线性曲线将他们划分开。那么有什么办法可以将他们划分开呢?这时候,核方法(kernel trick)就出场啦。
所谓的核方法,其实就是将样本从原始的特征空间映射到一个高维的特征空间,以使得样本在高维特征空间中仍然线性可分。正如下图中所示,我们对 \(x\) 使用一个映射函数 \(\phi\),得到映射到高维特征空间的特征向量 \(\phi \left( x\right) \),然后这些样本点在三维空间的确可以找到一个平面将样本点线性可分(黑色实线所画的平面)。幸运的是,如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使样本可分。那么其实我们只要找到映射函数,就可以将线性不可分的样本转为线性可分的情况了。但是,这个映射函数很难寻找,SVM 模型没有直接硬来,而是巧妙的引入核函数来间接地解决实现这种变换。
那么接下来我们看看核函数如何应用于模型上。
在前一篇文章中的 SVM 对偶问题为:
可以看到,我们需要计算第 i 和第 j 两个样本的内积。
另外,对应的分类决策函数的公式为:
我们也需要计算总样本 X 和样本 i 之间的内积。我们发现,这里其实存在着重复的内积计算,并且在高维中内积计算非常耗时,可不可以只算一次?事实上,是可以的,我们完全可以提前将两两样本间以及样本与自身的内积都算出来并存储下来,下次使用时只需直接取出使用即可,这大大提高了计算效率。但是,现在问题是当样本点映射到高维空间中内积计算的问题。这里,就巧妙引入了核函数,替代了向量内积。它可表示为:
那么引入核函数后,对偶问题变为:
分类决策函数变为:
所以我们只需要计算核函数的值即可,而核函数的计算只需套用公式。常用的核函数有线性核(\(k\left( x_{i},x_{j}\right) =x_{i}^{T}x_{j}\))以及高斯核(\(k\left( x_{i},x_{j}\right) =\exp \left( -\dfrac {\left| x_{i}-x_{j}\right| ^{2}}{2\sigma ^{2}}\right) \))
注意到大部分的拉格朗日乘子 \(\alpha_{i}\) 都是0。因为大部分的样本都会被分类正确,只有少部分的样本被误分类,也就说只要被分类正确,\(\alpha_{i}=0\),该样本不会出现在分类决策函数的求和公式中,自然不会对最终的决策结果产生任何影响。
最后,支持向量机的决策过程也可以看做一种相似性比较的过程。首先,输入样本与一系列模板样本进行相似性比较,模板样本就是训练过程决定的支持向量,而采用的相似性度量就是核函数。样本与各支持向量比较后的得分进行加权后求和,权值就是训练时得到的各支持向量的系数 \(\alpha_{i}\) 和类别标号的成绩。最后根据加权求和值大小来进行决策。而采用不同的核函数,就相当于采用不同的相似度的衡量方法。
到这里,SVM 的理论基础基本都介绍完了。总的来说,首先进行特征空间的非线性映射,然后在这个新的空间中求最优分类面即最大间隔分类面,而这种非线性映射是通过定义适当的内积核函数来巧妙实现的。
接下来,我们介绍下凸优化问题中涉及的KKT条件。
KKT 条件(Karush–Kuhn–Tucker conditions)
什么是 KKT
KKT 是一组不等式约束,主要应用在凸优化问题上。其实大家在高数中曾使用过拉格朗日乘子法求解带等式约束的优化问题,而KKT条件解优化问题就是升级版啦。
拉格朗日乘子法
假设有如下带等式约束的优化问题:
我们使用拉格朗日乘子法通过引入拉格朗日乘子将等式约束的优化问题转化为无等式约束的优化问题。
所以我们通过一个拉格朗日乘子组成的行向量 \(\alpha\)(其中 \(\alpha=\left[ \alpha _{1},\alpha_{2},\ldots ,\alpha_{n}\right] \)),将目标函数和等式约束组合成 \(L\left( \alpha ,x\right) =f\left( x\right) +\alpha^{T} \cdot h\),其中\(h\left( x\right) =\left[ h_{1}\left( x\right),h_{2}\left( x\right),\ldots ,h_{m}\left( x\right)\right] ^{T}\)。然后就可以求最优值,也就是利用费马引理,将函数 L 对各个参数求导取零,然后等式联立进行求解。
KKT条件
假设有如下带不等式约束的优化问题:
我们同样先将约束问题转化为无约束的优化问题,得到函数:
其中\(\alpha\)、\(\beta\)为行向量,\(g\left( x\right)\)、\(h\left( x\right)\)均为列向量。那么 KKT 条件的作用就是,该问题的最优解必须满足以下条件:
- \(L\left( \alpha ,\beta ,x\right)\) 对 \(x\) 的导数为零;
- \(h\left(x\right)=0\);
- \(\alpha g\left( x\right)\leq 0\)。
这样之后就能求得最优值。其中第三个式子比较有意思。由于 \(g\left(x\right) \leq0\),因此只有 \(\alpha=0\) 或 \(g\left(x\right)=0\) 时,等式才成立。而这里是 SVM 中很多重要性质的来源,比如支持向量的概念。后面我们在介绍KKT条件与 SVM 的关系时再具体解释。那为什么拉格朗日乘子法和KKT条件能够得到最优值?
拉格朗日乘子法和KKT条件能够得到最优值的原因
对于拉格朗日乘子法,假设目标函数为 \(f\left(x,y\right)\),要求其极值,且满足 \(g\left(x,y\right)=c\) (c为常数)。假设 \(d_{n}=f\left(x,y\right)\),其中 \(d_{n}\) 可以取不同的值。不难看出,当\(d_{n}\)取不同的值时,我们可以得到不同的等高线(如上图所示)。(其实等高线主要针对二维输入而只有一维输出的,由于三维曲面难以分析,因此,我们利用水平横切面将切面投影到 xoy 平面上而形成等高线)。
而对于方程 \(g\left(x,y\right)=c\) 的可行集,假设他们构成了一条曲线。由于在无解的时候这条曲线和等高线是不会相交的,只有有解的时候,曲线和等高线就会相交。由于等高线可以变大或变小,所以只有等高线与曲线相切的时候,等高线才能确定下来,也才能找到最优解。否则相交的时候会存在多个等高线,那么便无法找到最优解。那么,相切意味者切线必须平行,同时也意味着两者的梯度平行。此时引入一个未知标量 \(\lambda \)。有:
到这里,其实这个式子就对应到了 \(L\left( \alpha ,x\right)\)对 \(x\) 的导数为零;
对于KKT条件,它是解决凸优化问题的必要条件。我们以上文提到的带不等式约束的优化问题为例。其实,\(f\left( x\right) =\max _{\alpha,\beta}L\left( \alpha ,\beta ,x\right)\)。为什么呢?由于有约束条件\(h_{j}\left(x\right)=0\) 且 \(\alpha g\left(x\right)\leq 0\),所以只有当\(g_{j}\left(x\right)=0\) 时,函数L 才会在满足约束条件下取得最大值。诶?刚好这个最大值是 \(f\left(x\right)\)。所以现在我们要最小化的 \(f\left(x\right)\) 就可以写为 \(\min_{x}\max _{\alpha,\beta}L\left( \alpha ,\beta ,x\right)\) 。然后,由于我们的优化是满足强对偶的,即可以利用对偶式子来求解原问题的最优解,所以式子又可以写为 \(\max_{\alpha,\beta}\min _{x}L\left( \alpha ,\beta ,x\right)\)。那么当式子在 \(x_{0}\) 处取得最小值的时候,根据费马引理,有\(L\left( \alpha ,\beta ,x\right)\)对 \(x\) 的导数必须为零,这就是 KKT 的第一个条件,而 \(h\left(x\right)=0\) 为已知条件作为 KKT 的第二个条件,接着 \(\alpha g\left( x\right)=0\)为必须满足的 KKT 的第三个条件,另外 KKT 乘子\(\alpha _{i}\)、\(\beta _{i}\)均需要大于等于零。所有上述说明,满足强对偶条件的优化问题的最优值都必须满足 KKT 条件。
SVM 与 KKT 条件分析
在 SVM 软间隔基本型的优化问题中,要满足的 KKT 条件为:
再结合求解出的约束 \(0\leq \alpha _{i}\leq C\) 以及 \(C=\alpha_{i}+\mu_{i}\)。
那么,对于任意一个样本 \(\left(x _{i},y _{i}\right)\),由括号中的第三个条件可知,总有 \(\alpha _{i}=0\) 或者 \(y_{i}f\left( x_{i}\right)=1-\xi _{i}\);
那么当 \(\alpha _{i}=0\),即样本被分类正确,它们处在边界的外面,不会影响到函数 f,即 \(y_{i}\left( w^{T}x_{i}+b\right) \geq 1\);
当 \(\alpha_{i}>0\) 时,该样本是支持向量;
若 \(0<\alpha _{i}
若 \(\alpha_{i}=C\),则有 \(\mu_{i}=0\),那么此时若 \(\xi_{i}\leq 1\),则样本落在最大间隔的内部,否则该样本被错误分类了,即它跑到了对面的间隔边界外了,即 \(y_{i}\left( w^{T}x_{i}+b\right) \leq 1\)。
总之,软间隔的支持向量可以在边界上,边界内或者错误的边界外。
注意硬间隔支持向量与软间隔支持向量的区别。
参考
[1] <<机器学习>> by 周志华
[2] <<统计学习方法>> by 李航
[3] 机器学习算法与Python实践之(三)支持向量机(SVM)进阶
[4] 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
[5] 浅谈最优化问题的KKT条件
[6] 拉格朗日乘数Wiki