本文是“支持向量机系列”的第四篇,参见本系列的其他文章。
在最开始讨论支持向量机的时候,我们就假定,数据是线性可分的,亦即我们可以找到一个可行的超平面将数据完全分开。后来为了处理非线性数据,使用 Kernel 方法对原来的线性 SVM 进行了推广,使得非线性的的情况也能处理。虽然通过映射 $\phi(\cdot)$ 将原始数据映射到高维空间之后,能够线性分隔的概率大大增加,但是对于某些情况还是很难处理。例如可能并不是因为数据本身是非线性结构的,而只是因为数据有噪音。对于这种偏离正常位置很远的数据点,我们称之为 outlier ,在我们原来的 SVM 模型里,outlier 的存在有可能造成很大的影响,因为超平面本身就是只有少数几个 support vector 组成的,如果这些 support vector 里又存在 outlier 的话,其影响就很大了。例如下图:
用黑圈圈起来的那个蓝点是一个 outlier ,它偏离了自己原本所应该在的那个半空间,如果直接忽略掉它的话,原来的分隔超平面还是挺好的,但是由于这个 outlier 的出现,导致分隔超平面不得不被挤歪了,变成途中黑色虚线所示(这只是一个示意图,并没有严格计算精确坐标),同时 margin 也相应变小了。当然,更严重的情况是,如果这个 outlier 再往右上移动一些距离的话,我们将无法构造出能将数据分开的超平面来。
为了处理这种情况,SVM 允许数据点在一定程度上偏离一下超平面。例如上图中,黑色实线所对应的距离,就是该 outlier 偏离的距离,如果把它移动回来,就刚好落在原来的超平面上,而不会使得超平面发生变形了。具体来说,原来的约束条件
\[
y_i(w^Tx_i+b)\geq 1, \quad i=1,\ldots,n
\]
现在变成
\[
y_i(w^Tx_i+b)\geq 1\color{red}{-\xi_i}, \quad i=1,\ldots,n
\]
其中 $\xi_i\geq 0$ 称为松弛变量 (slack variable) ,对应数据点 $x_i$ 允许偏离的 functional margin 的量。当然,如果我们运行 $\xi_i$ 任意大的话,那任意的超平面都是符合条件的了。所以,我们在原来的目标函数后面加上一项,使得这些 $\xi_i$ 的总和也要最小:
\[
\min \frac{1}{2}\|w\|^2\color{red}{+C\sum_{i=1}^n \xi_i}
\]
其中 $C$ 是一个参数,用于控制目标函数中两项(“寻找 margin 最大的超平面”和“保证数据点偏差量最小”)之间的权重。注意,其中 $\xi$ 是需要优化的变量(之一),而 $C$ 是一个事先确定好的常量。完整地写出来是这个样子:
\[
\begin{align}
\min & \frac{1}{2}\|w\|^2 + C\sum_{i=1}^n\xi_i \\
s.t., & y_i(w^Tx_i+b)\geq 1-\xi_i, i=1,\ldots,n \\
& \xi_i \geq 0, i=1,\ldots,n
\end{align}
\]
用之前的方法将限制加入到目标函数中,得到如下问题:
\[
\mathcal{L}(w,b,\xi,\alpha,r)=\frac{1}{2}\|w\|^2 + C\sum_{i=1}^n\xi_i – \sum_{i=1}^n\alpha_i \left(y_i(w^Tx_i+b)-1+\xi_i\right) – \sum_{i=1}^n r_i\xi_i
\]
分析方法和前面一样,转换为另一个问题之后,我们先让 $\mathcal{L}$ 针对 $w$、$b$ 和 $\xi$ 最小化:
\[
\begin{align}
\frac{\partial \mathcal{L}}{\partial w}=0 &\Rightarrow w=\sum_{i=1}^n \alpha_i y_i x_i \\
\frac{\partial \mathcal{L}}{\partial b} = 0 &\Rightarrow \sum_{i=1}^n \alpha_i y_i = 0 \\
\frac{\partial \mathcal{L}}{\partial \xi_i} = 0 &\Rightarrow C-\alpha_i-r_i=0, \quad i=1,\ldots,n
\end{align}
\]
将 $w$ 带回 $\mathcal{L}$ 并化简,得到和原来一样的目标函数:
\[
\max_\alpha \sum_{i=1}^n\alpha_i – \frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_j\langle x_i,x_j\rangle
\]
不过,由于我们得到 $C-\alpha_i-r_i=0$ ,而又有 $r_i\geq 0$ (作为 Lagrange multiplier 的条件),因此有 $\alpha_i\leq C$ ,所以整个 dual 问题现在写作:
\[
\begin{align}
\max_\alpha &\sum_{i=1}^n\alpha_i – \frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_j\langle x_i,x_j\rangle \\
s.t., &0\leq \alpha_i\leq C, i=1,\ldots,n \\
&\sum_{i=1}^n\alpha_iy_i = 0
\end{align}
\]
和之前的结果对比一下,可以看到唯一的区别就是现在 dual variable $\alpha$ 多了一个上限 $C$ 。而 Kernel 化的非线性形式也是一样的,只要把 $\langle x_i,x_j \rangle$ 换成 $\kappa(x_i,x_j)$ 即可。这样一来,一个完整的,可以处理线性和非线性并能容忍噪音和 outliers 的支持向量机才终于介绍完毕了。 🙂
击节赞叹!
目标函数中的参数C,就要用cross validation这样的方法来确定喽?
(ps:这篇要是能再有一副图就更美了。针对文中现在那张图中的例子,如果用添加了松弛变量的SVM来求解会是什么样子。然后就能有比对了。)
我是想画图的来着,但是图是用 Illustrator 画的,Illustrator 里面又没法像 LaTeX 那样输入字符 \xi ($\xi$) 来表示 slack variable 的距离,后来就索性不画了…… =.=bb
我想就算在线性可分(或者在映射后空间内线性可分)的情况下,原始SVM和这种SVM的解都会不同吧。当然是跟C有关。如果C = 无穷大,那么就跟原始SVM相同;如果C = 0,那么W = 0。
w = 0 是什么场景,真是有点儿难以想象呢。
C 是参数,可以用 cross validation 来求。如果线性可分,C 取多少都无所谓,因为所有 slack variable 都是 0 。如果线性不可分,而 $C=\infty$ 的话,就无解,或者说任意解,因为不管 w 取什么值,目标函数的值都是等于 $\infty$ 。
不对吧,线性可分情况下C的多少会影响优化方程的最优解。为什么会所有的slack variable 一定等于0呢?
有情况会是这样: 增加slack variable的量,虽然会增加优化方程中第二项所带来的penalty,但是同时也会增加margin值,而可能导致最终的优化方程值更优。
所以最后可能会是slack varible不是0的解。
嗯,你说的有道理,确实是这样子的!
[…] 支持向量机: Outliers /?p=692 […]
写的太好了!我见过最好的介绍了。
描述C的作用是那句应该是“寻找margin最大的超平面”吧
恩,确实是这样子,谢谢指出~~
[…] 支持向量机: Outliers /?p=692 […]
[…] slack variable […]
[…] 支持向量机:Outliers —— 介绍支持向量机使用松弛变量处理 outliers 方法。 […]
请教博主一个问题:
您用什么工具画的图?
我也想知道博主用的是什么画图软件~~~
写的很清晰。
大致能看懂,不过要是让自己去实现这个东西估计就一筹莫展了,真是悲剧。难道这就是传说中的眼高手低 ·.·
写的太好了,能把这么枯燥的东西介绍的这么生动,佩服的五体投地啊
C越大的话。应该会拟合的越好吧。但是也可能会产生过拟合现象~
将min f(x)转化为max L(…)的过程似乎应该被称作 wolfe dual 哦~~~ 另外鄙人不才 想补充一下 最后的拉格朗日方程中 新引入的拉格朗日系数r 也是为了保证距离参数为正~~ 最后想请教前辈一下 LIBSVM中的 gamma 到底是什么东西 各个kernel的方程不尽相同 很难想象这些核函数能有一个统一的系数 而且还必须要用户事先指定。。。
谢谢。gamma 这样的 hyper parameter 在机器学习中还比较常见,如果没有办法确定的情况下一般是通过 cross validation 枚举选结果最好的一个参数。
19年2月,从 支持向量机通俗导论(理解SVM的三层境界)赶来,这是我见过的介绍SVM从简到繁,从线性可分到核函数,再到噪点,整个SVM写的最深入浅出的文章里,10年的话,ML和DL国内还没有大热,佩服在此领域深耕细作的博主,博主现在应该已经非常牛掰了。。。
讲得真是太好了,两年后再读一遍,真实受益匪浅呐
感谢分享知识
楼主现在mit博士毕业,是谷歌的研究科学家了呀