SVM——支持向量机简析与应用指导

本篇文章基于对Andrew Ng课程内容的总结以及我个人的理解,希望有帮助
SVM属于supervised learning算法,鉴于目前无论是在工业界还是学术界都有着极其广泛的使用,可以说SVM是必须要了解甚至掌握的机器学习算法,本篇文章将从以下几个方面对SVM进行介绍。

1 SVM的优化目标

说到SVM,我们首先需要了解它的前身Logistic Regression(逻辑回归),逻辑回归来自于对线性回归的改良:

通过在线性回归后加入一个sigmoid过滤器得到属于[0,1]的结果(通过设置阈值,一般为0.5,判断样本属于正例还是反例)。 Logistic Regression的优化目标为(非正则化):

− ln ⁡ L ( w , b ) = ∑ n − [ y ^ n ln ⁡ f w , b ( x n ) + ( 1 − y ^ n ) ln ⁡ ( 1 − f w , b ( x n ) ) ] -\ln L(w,b)=\sum\limits_n -[\hat{y}^n \ln f_{w,b}(x^n)+(1-\hat{y}^n) \ln(1-f_{w,b}(x^n))] lnL(w,b)=n[y^nlnfw,b(xn)+(1y^n)ln(1fw,b(xn))]
即为两个二项分布(真实分布与模型分布)的交叉熵(Cross Entropy)。至于为什么使用交叉熵作为逻辑回归的cost function,而不是我们更加常用的MSE,这里可以做一个简单的解释:如果我们绘制出MSE以及cross entropy的cost空间图,可以发现MSE的存在梯度消失的情况容易陷入困境而CE则表现更好,如下图

那么回到正题,SVM在Logistic Regression上做了什么优化呢?首先上一张Andrew老师的PPT(请忽略老师略显杂乱的笔记):

ppt
首先我们看到 − y l o g h θ ( x ) -ylogh_{\theta}(x) yloghθ(x),该式即为 y = 1 y=1 y=1时的cost值,而 − ( 1 − y ) l o g ( 1 − h θ ( x ) ) -(1-y)log(1-h_{\theta}(x)) (1y)log(1hθ(x))即为 y = 0 y=0 y=0时的cost值(注意对于一个样本,其真实值y只可能为0或者1其中之一,因此两项中仅可能存在一项,这样的表达式是为了对所有样本的通用性,数学美~),分别绘制两个式子则分别为图①与图②:
而SVM的改进就在于对cost function进行了优化,将原来的蓝色线部分转换为了分段式的紫色线部分,即当z值大于(或小于)一定值时,取cost=0,其余时候cost表现为线性函数。如此一来,SVM的优化目标可以概括为:
costforSVM

注意:这里是带了正则化参数 θ \theta θ的,与一般的Logistic不同的是,SVM通过调节参数C来表示cost与参数正则化之间权重关系,形式不同,意义相同。

2 为什么说 SVM 是 large margin classifier?

有人将SVM称为large margin classifiers,那么怎样理解这个词语呢?
首先复习一下向量内积的几何意义:两个向量的内积从几何上可以分解为一个向量(任选其一)在另一向量上的投影长度(注意投影可负,当夹角大于90度时为负)与另一向量长度的乘积。
在这里插入图片描述
有了以上的依据,注意到 θ T x \theta^Tx θTx则也可以表示为以上的形式,这会在接下来的内容使用到。
那么接着依据上一小节提到的SVM的cost function,此处为了简化问题我们假设C取一个“很大”的值,那么为了达到min的效果,可以认为function总的前一项 ≈0,只剩后一项 m i n 1 2 ∑ θ j 2 min\frac{1}{2}\sum\theta_{j}^{2} min21θj2
假设有一下数据集:
数据集
为了简化问题我们假设 θ 0 = 0 \theta_0=0 θ0=0(这样会使得边界线恒过原点),面对这样一个数据集,可能的结果很多种,如:
结果
图中橙色线表示边界线,绿色线表示 θ \theta θ(为什么 theta 会与边界线垂直呢?其实很简单,列出边界线方程,分别求偏导(得到梯度)也就是theta向量)。可以很明显的看出,无论是左图还是右图都可以正确的区分正例与反例,但是为了满足要求,左图中要求 θ \theta θ的值很大(因为只有这样才能满足 θ T x \theta^Tx θTx大于1或者小于-1,可参考第一小节的内容),但是这与 m i n 1 2 ∑ θ j 2 min\frac{1}{2}\sum\theta_{j}^{2} min21θj2显然是相悖的,而第二种划分方式则很好的满足了要求。其实直观地来也是第二种分类方式更加优秀gap更大。
这里虽然作出了一系列假设,但是及时没有这些假设SVM方法仍然是适用的(拓展至三维就是点面距离…)
那么large margin是怎么来的呢?其实到现在为止这个名称的由来已经很明显了:
margin

3 利用SVM解决复杂非线性问题——核方法kernal

假设当前数据集如下所示:
非线性数据集
注:图片来自Andrew授课PPT

那么为了拟合这个数据集(分类)我们需要的显然不是一个简单的线性函数,可以大概看出是一个“葫芦形”,但是如何进行学习呢?常规的方法,我们通过定义:
y = θ 0 + θ 1 f 1 + θ 2 f 2 + ⋯ + θ n f n y=\theta_0+\theta_1f_1+\theta_2f_2+\cdots+\theta_nf_n y=θ0+θ1f1+θ2f2++θnfn
其中 f 1 , ⋯   , f n f_1,\cdots,f_n f1,,fn都由 x 1 , ⋯   , x n x_1,\cdots,x_n x1,,xn组合而成,如 f n = x 1 x n f_n=x_1x_n fn=x1xn等等
可想而知,采用这种方法是能够实现需求的,但是如何选择 f f f是困难的。那么是否有更简单的方法能够进行非线性的拟合呢?核函数即为一种最常用的非线性拟合方法。首先明确几个概念:
l a n d m a r k ( l ) landmark(l) landmark(l):核点,核点是选择好的,用于表征相似度的点
s i m i l a r i t y 函 数 similarity函数 similarity:核函数,常用的核函数有高斯核函数等,用于衡量样本点与核点之间的关系
高斯核函数 G a u s s i a n Gaussian Gaussian k e r n a l kernal kernal又被称为径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数,其公式表示为:
f = s i m i l a r i t y ( x , l i ) = e x p ( − ∣ ∣ x − l i ∣ ∣ 2 2 σ 2 ) f = similarity(x, l^i)=exp(-\frac{||x-l^i||^{2}}{2\sigma^{2}}) f=similarity(x,li)=exp(2σ2xli2)
该公式衡量了样本点与核点的相关性(依据距离),其三维图形为:
高斯核函数
注:图片来源于百度图片,如有侵权立马删除,感谢

左图取 σ \sigma σ值较小,右图较大
那么有了以上的定义,我们如何利用核函数来进行非线性的拟合呢?同样以先前的样本集为例,假设我们的核点以及function定义如下:
在这里插入图片描述
注:图片来自Andrew课程

f = θ 0 + θ 1 f 1 + θ 2 f 2 + θ 3 f 3 > 0 f=\theta_0+\theta_1f_1+\theta_2f_2+\theta_3f_3>0 f=θ0+θ1f1+θ2f2+θ3f3>0时,属于正例,否则为反例,其中 θ 0 = − 0.5 , θ 1 = 1 , θ 2 = 1 , θ 3 = 0. \theta_0=-0.5,\theta_1=1,\theta_2=1,\theta_3=0. θ0=0.5,θ1=1,θ2=1,θ3=0.
若满足以上定义,可以发现:只有当样本x接近 l 1 , 或 者 l 2 l^1,或者l^2 l1,l2时,样本才被认定为正例,否则为反例,汇出边界则最终就可以得到想要的“葫芦形”!!
结果

4 在SVM中使用核函数

上一小节我们已经说过了核函数的含义以及使用核函数面对非线性问题时的解决方案,但是可以发现,上面仍然遗留了几个问题没有解决:

  • 核点 l l l 如何选择?
  • 如何进行优化?

如何选择核点?
事实上这个问题的解决方案很直觉:将所有的sample都作为核点进行考量。最终由核函数参数 θ \theta θ 决定哪些核点是“重要的”。注意如果原样本为 x x x,那么 x x x将被转换为一个 m 维 m维 m向量作为新的输入(假设共有m个样本):
x ⇒ [ s i m i l a r i t y ( x , l 1 ) s i m i l a r i t y ( x , l 2 ) ⋯ s i m i l a r i t y ( x , l m ) ] ⇒ [ f 1 f 2 ⋯ f m ] x\Rightarrow\begin{bmatrix}\\similarity(x,l^1)\\similarity(x,l^2)\\\cdots\\similarity(x,l^m)\end{bmatrix}\Rightarrow\begin{bmatrix}\\f^1\\f^2\\\cdots\\f^m\end{bmatrix} xsimilarity(x,l1)similarity(x,l2)similarity(x,lm)f1f2fm
则转换为:
y = θ 0 + θ 1 f 1 + θ 2 f 2 + ⋯ + θ m f m y=\theta_0+\theta_1f_1+\theta_2f_2+\cdots+\theta_mf_m y=θ0+θ1f1+θ2f2++θmfm
在这里插入图片描述
那么如何进行优化呢?(得到 θ ⃗ \vec{\theta} θ
事实上,带核函数SVM相较于线性SVM优化函数的差异仅仅在于输入的改变以及 θ \theta θ数量的变化:
优化函数
以上即为两个问题的答案。

接下来是一些补充内容,是依据Andrew老师的课件提取的
parameters
带Gaussian核函数的SVM算法的超参数主要有两个,分别是 C 以 及 σ 2 C以及\sigma^2 Cσ2,,其中C的含义与原Logistic回归中的参数 λ \lambda λ 意义正好相反(如果只是为了理解可以认为就是 1 λ \frac{1}{\lambda} λ1,实际上有微小差别,了解即可),所以其对应的效果也正好与 λ \lambda λ相反.而对于 σ 2 \sigma^2 σ2的解释已经十分清晰,这里不过多解释。

5 小结

最后的最后,我们来进行一个简单的总结,使用SVM的步骤:

  • 明确问题(大分类问题)
  • 选择超参数C(意义参考上一小节)
  • 选择合适的核函数
    这里大家需要注意,在文章或者一些研究中可以听到别人提出“No kernal”的说法,实际上这就是本篇文章中最先提出的SVM,不带核函数。
    常用的核函数其实就两种,No kernal以及Gaussian Kernal,其他的更加复杂的Polynomial Kernal或对应了具体的应用领域或存在较大的局限性,想要了解详情大家可自行检索。
  • 用起来!!

一些需要注意的点:

  • kernal核函数可以随便选择吗?
    从理论上来说没有问题,但是实际上我们现行使用的工具包都对SVM算法进行了大量的优化(提升效率),而这些优化也带来了一些限制,其中就包括对kernal的限制,总的来说只能够选择满足Mercer's Theorem(默塞尔定理)的核函数才可以使用。具体原理笔者没有深究,有兴趣请自行检索。
  • SVM如何处理多分类问题?
    实际上与Logistic回归相同,SVM解决多分类问题的基本思路同样是one-vs-all,通俗地解释是:将多分类问题转换为多个二分类问题,进行多次判断,最终选择各个二分类中值最大的作为最后输出
  • Logistic vs SVM ?
    这里贴出Andrew的PPT供大家参考:
    选择
    总地来说:
    1.如果n非常大(feature非常多),而训练样本有限(可能比feature还少),这时选择logistic或者线性SVM是比较合适的,否则容易陷入overfitting 的困境。
    2.如果n与m的比例适中,那么这个时候选择带Gaussion核函数的SVM可能会取得不错的效果。
    3.如果有很多的样本而只有少量的feature,那么可以先新建一些可用的feature,选择使用logistic或者线性SVM(这里可能会有疑问:为什么不选择带Gaussion核函数的SVM?原因是,当样本量太大时,进行非线性的拟合太耗时,效率低下,eng要做也是没有问题的)

以上就是本篇文章的全部内容,感谢各位的阅读! 转载请注明出处!