SVM详解
介绍
搬运一下百度百科的定义,
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。
下面通过一个例子一步步来演示得到svm的过程。
边距Margin
我们以最简单的二分类任务为例(如下图),希望找到一个分界线把两类数据区分开,那么线性划分\(f(x) = \hat{w}^Tx + \hat{b}\)就可以完成。注意到这里出现了Margin的概念,图中,我们通过改变斜率w来控制划分的角度,也可以通过调整b的取值(+-b0)可以得到无数条平行的线性划分,那么哪一种划分是最好的呢?最直观的想法是希望这条划分能尽可能远离两类数据点,也就是两条边界的间距(Margin)要尽可能大。
现在我们讲线性函数式两边同时除以b0,得到新的\(f(x) = w^Tx + b\),这里的\(w = \frac{\hat{w}}{b_0}, b = \frac{\hat{b}}{b_0}\),然后两条决策边界就可以表示为\(f(x) = 1 & f(x) = -1\),如下图所示,
如果采用向量的形式,\(f(x) = 0\) 可以表示为 \(||w||*||x_1 - x_2||*cos\theta = 0\),因为w肯定是与f(x)垂直的,所以\(cos\theta = 1\),从而我们可以得到\(Margin = \frac{2}{||w||}\),目标也就是要最大化这个Margin。
拉格朗日对偶Lagrange duality
这个问题其实就是一个限制最优化问题,我们对问题进行进一步转化如下,
原问题: \(max_w \frac{2}{||w||}\)
满足,对于正样本\(y^i=+1,f(x^i)>=+1\),对于负样本\(y^i=-1,f(x^i)<=-1\)(i为数据点)
转化为: \(min_w \frac{||w||^2}{2}\)
满足,\(1-y^i(w^Tx^i + b) <= 0\)
下面就是要如何解决这个最优化问题?
这里才用的是拉格朗日对偶方法。下面谈谈什么是对偶以及怎么解决对偶问题。假设,
原问题:\(min_xf(x) = min_x max L(x,\lambda)\)
对偶问题:\(max_{\lambda} min_x L(x,\lambda) = max_{\lambda} \theta_d(\lambda)\)
其中,对偶方程\(\theta_d(\lambda) = min_x L(x,\lambda)\)
========================================================
举个栗子,原问题\(min_x f(x) = x^2\),满足\(g(x) = x + 1 <= 0\),画图如下,
构建拉格朗日函数 \(L(x,\lambda) = f(x) + \lambda g(x)\),其中\(\lambda>=0\)就是拉格朗日乘子。然后我们会发现,满足g(x)<=0时,\(max_{\lambda} L(x,\lambda) = f(x)\),那么原问题就变成了 \(min_x max_{\lambda} L(x,\lambda)\)。
现在利用凸问题的强对偶性,原问题可以转化为对偶问题 \(max_{\lambda} min_x L(x,\lambda)\),而这个函数就很容易求解了,在这个例子中,L函数先对x求偏导得到 \(x = -\frac{\lambda}{2}\),代入L函数,再对\(\lambda\)求偏导,得到\(\lambda = 2, x = -1\),所以x=-1就是最优解。
========================================================
KKT(Karush-Kuhn-Tucker)条件
准备工作都完成了,现在回到SVM对偶问题,
构造拉格朗日函数 \(L(w,b,x) = \frac{||w||^2}{2} + \sum_{i=1}^n \lambda_i(1 - y^i(w^Tx^i + b))\),下面就是分别对w,b求偏导,代入可以得到对偶函数 \(\theta_d(\lambda) = \frac{||w||^2}{2} + \sum_{i=1}^n \lambda_i - \frac{1}{2} \sum_{i=1}^2 \sum_{k=1}^n \lambda_i \lambda_k y^i y^k (x^i)^T x^k\),然后就是求解 \(max_{\lambda}\theta_d(\lambda)\)就ok了(满足KKT条件),解法有很多如牛顿法,梯度下降法,smo等等。
你可能会问Why dual?
因为原问题要解d+1个变量(w和b),而对偶问题是求解n个(\(\lambda_i\)),那么当参数量d远大于数据量n的时候,求解对偶问题会更快捷,反过来,如果数据量n太大,远大于维度d,求解对偶问题就会很慢了。
还有一个更重要的原因是,当我们回头看对偶函数\(\theta = \sum_{i=1}^n \lambda_i - \frac{1}{2} \sum_{i=1}^2 \sum_{k=1}^n \lambda_i \lambda_k y^i y^k (x^i)^T x^k\),其中\((x^i)^T x^k\)其实是一个內积的形式,可以替换为kernel核来解决非线性划分的问题。
Kernel就是一种以內积形式表示的特征空间,\(K(u,v) = \psi(u)'\psi(v)\)。
关于核函数的选择这里就不展开了,搬运一下百度百科提到的几种常见核:
Soft-margin
前面提到的Margin是一种Hard-margin,很直接的理解就是他死死地规定了一个划分,不容许异常数据点(不许样本犯错!),也就是说他严格要求数据集是可以被划分的,所以很明显这在实际中是不太可能的,人非圣贤孰能无过数据也是可能有误的嘛!SVM应对这个问题可以采用上面提到的kernel,也可以通过soft-margin来relax边界限制条件。怎么个soft法?
在hard-margin中,还记得有两条决策边界把数据集死死地分开了,不容许有数据点跑进margin范围或是跑到对面,那么soft则是可以允许(或者说控制)这种情况发生,如下图所示,
现在,修改一下之前的目标函数,变成 \(min_w(\frac{||w||^2}{2} + C \sum_{i=1}^n \xi_i)\),满足\(y^i(w^Tx^i + b) >= 1 - \xi_i\) 且 \(\xi_i >= 0\),\(\xi_i = max(0, 1 - y^i(w^Tx^i + b))\)也叫做hinge loss。
从上图中可以看到,如果正样本点在正区域\(\xi = 0\),如果他跑到了边界,甚至跑出了边界,这个值就会增大,现在我们虽然允许有数据可能会跑错地方,但是希望最小化\(\frac{||w||^2}{2}\)的同时也能最小化这个东西,也就是尽量别跑错!
这里的C表示松弛惩罚量Slack penalty,如果C=0,可能会underfitting因为数据的影响太小了,如果C趋于无穷大,可能会Overfitting,因为模型会要求每个数据都在对的位置(类别)。
在Soft-margin情况下,KKT条件变为
最后讨论几种情况,
当\(\lambda_i = 0\)时,\(\beta_i = C, \xi_i=0, y^i(w^Tx^i + b) >= 1 - \xi_i = 1\);
当\(\lambda_i = C\)时,\(\beta_i = 0, -\xi_i < 0, y^i(w^Tx^i + b) = 1 - \xi_i <= 1\);
当\(0 < \lambda_i < C\)时,\(\xi_i = 0, g_i(w,b,\xi) = 0, y^i(w^Tx^i + b) = 1 - \xi_i = 1\)。
じゃあ,再见。