机器学习 Week5 —— 支持向量机,核函数

之前介绍了几种不同的监督学习算法以及测试集和验证集的概念:

这篇文章介绍监督学习中一个很强大,在学术界和工业界都很流行的算法——支持向量机(Support Vector Machine,SVM),首先大致了解一下支持向量机的思想

支持向量机简介

支持向量机是用于分类问题的算法,支持向量机的基本思想是对于N维的数据,找到一个N-1维的超平面(hyperplane),作为数据分类的决策边界,确定这个超平面的规则是找到离分隔超平面最近的那些点,使它们离分隔超平面的距离尽可能远,因为这样可以使得训练出来的分类器更加健壮。离超平面最近的那些点就被称为支持向量(support vector),举个例子,对于二维的数据,支持向量机就要找到一个一维的向量来作为边界,如图所示:


二维数据点中的支持向量

线性支持向量机(Linear SVM)

在 Logistic 回归中,我们根据\theta^Tx是否大于0来进行分类,并且将两个类别分别记作1和0,这里我们则将两个类别分别记为+1和-1,即y^n=1y^n=-1。当f(x)=\theta^Tx大于0的时候,预测为+1,并且f(x)越大越好;当小于0的时候,预测为-1,并且f(x)越小越好
所以其实线性支持向量机的假设函数和 Logistic回归的假设函数是相同的,不同的只是损失函数。下面我们来看一下怎么确定线性支持向量机的损失函数。
首先我们画出用不同函数作为损失函数时候的图像,将横轴记为y^nf(x),这样的话,如果y^n=1,这时候我们希望f(x)越正越好,所以y^nf(x)越大,损失函数越小,f(x)越小,损失函数越大;而如果y^n=-1,这时候希望f(x)越负越好,所以y^nf(x)越大,说明f(x)越负,即损失函数就越小。所以,将横轴记为y^nf(x)更加方便,无论是y^n=1还是y^n=-1的情况,损失函数都是随着横轴递减的
之前我们曾经使用过 Square Error Cost 作为损失函数,这是一个二次函数,当y^n=1的时候,是(f(x)-1)^2,当y^n=-1的时候,是(f(x-(-1)))^2,因此总的可以写成(y^nf(x)-1)^2
在 Logistic 回归中使用的损失函数则是交叉熵(Cross-Entropy),统一了y^n=1y^n=-1的情况后,可以写成\ln(1+e^{-y^nf(x)})/\ln2,其中除以了一个常数是不影响的。从下图看一下:

Loss functions

红色的曲线就是 Square Error Cost,显然违背了随着横轴递减的规律,因此不能采用;蓝线是 Sigmoid 函数加上 Square Error Cost,虽然满足递减的规律,但是变化趋势太小,损失函数的下降并不明显,而我们知道随着横轴增大,损失函数应该会下降很多;而绿色的曲线就是 Logistic 回归中使用的交叉熵,和蓝线对比起来,损失函数的下降趋势就很明显
那么在支持向量机中,使用的是叫做 Hinge Loss 的损失函数,它的图像就是下面的紫色的线:
Hinge Loss

具体的损失函数是:
l(f(x^n),y^n)=max(0,1-y^nf(x^n))
y^n=1时,只要1-f(x)<0f(x)>1,损失函数就为0了;
y^n=-1时,只要1+f(x)<0f(x)<-1,损失函数为0
也就是说,当y^nf(x)>1时,损失函数就是0,就算继续让y^nf(x)增大,也不会得到损失的下降;而当y^nf(x)在0到1之间时,虽然已经可以预测出正确的结果,但是对于 Hinge Loss 来说还不够好,还是有一定的损失,要比正确的结果好过一段距离之后,损失函数才会降为0。相比于交叉熵,Hinge Loss 更加健壮
所以概括一下,线性支持向量机使用的假设函数就是一个线性函数(f(x)=\theta^Tx),损失函数是 Hinge Loss 再加上一个正则化的部分,这是一个凸函数,因此我们可以使用梯度下降法来进行优化

松弛变量(Slack Variable)

先直观地理解一下松弛变量。支持向量机的目标是找到一个边界以最大化边界与支持向量的距离,但是有时有些样本点可能不满足间隔条件,这时引入一个松弛变量\epsilon^n\ge0,使间隔加上松弛变量满足间隔条件
我们来看一下 Hinge Loss 的部分,记:
\epsilon^n=max(0,1-y^nf(x))
由于我们的目标是最小化 Hinge Loss,因此上式等价于:
\begin{align} \epsilon\ge1-y^nf(x) \newline\ \epsilon^n\ge0\end{align}
变化之后:y^nf(x)\ge1-\epsilon^n,就是说间隔(margin)要大于等于1,但是这个间隔是软间隔(soft margin),其中有一个松弛变量,就是\epsilon^n
这是一个二次规划(Quadratic Programming,QP)问题,因此可以用QP问题的算法来解。当然,不用QP算法的话用梯度下降法也是可以的

对 Hinge Loss 使用梯度下降法

忽略掉正则化的部分,线性支持向量机的损失函数就是:
L(f)=\sum_nl(f(x^n,y^n))
l(f(x^n),y^n)=max(0,1-y^nf(x^n))
如果我们的参数是\theta,我们首先需要求出损失函数对\theta的偏导数:
\frac{\partial l(f(x^n,y^n))}{\partial \theta_i}=\frac{\partial l(f(x^n,y^n))}{\partial f(x^n)}\frac{\partial f(x^n)}{\partial \theta_i}
由于f(x^n)=\theta^Tx^n,因此\frac{\partial f(x^n)}{\partial \theta_i}=x_i^n
接下来计算\frac{\partial l(f(x^n,y^n))}{\partial f(x^n)}
\frac{\partial max(0,1-y^nf(x^n))}{\partial f(x^n)}= \begin{cases} -y^n, & if \ \ \ y^nf(x^n)<1 \\ 0, & otherwise \end{cases}
因此,偏导数为:
\frac{\partial L(f)}{\partial \theta_i}=\sum_n-\delta(y^nf(x^n)<1)y^nx_i^n
我们把-\delta(y^nf(x^n)<1)y^n记作c^n(\theta),其中\delta(x)表示当满足x时,\delta(x)为1,否则为0
于是,我们就得到了在 Hinge Loss 中,梯度下降法的更新公式:
\theta_i=\theta_i-\alpha\sum_n c^n(\theta)x_i^n

核函数(Kernel Function)

将我们最终使用梯度下降法得到的那组最优化的参数记作向量\theta^*,实际上,\theta^*就是x^n的线性组合:
\theta^*=\sum_n a_n^*x^n
将梯度下降法的更新公式写成向量的形式:
\theta=\theta-\alpha\sum_n c^n(\theta)x^n
而前面说过c^n(\theta)很多时候都会是等于0的,因此对应最后的参数\theta^*=\sum_n a_n^*x^n,就会有很多数据点x^n前面对应的a_n^*是等于0的,也叫做a_n^*稀疏的(sparse),而那些a_n^*不等于0的x^n就叫做支持向量(Support Vectors)
意思就是如果一个数据点对应的a_n^*等于0,那么这个数据点对模型一点作用都没有,只有当它对应的a_n^*不等于0,它才会对决定最后的模型有用。只有少数的点会被选作支持向量,如果出现了异常值(outlier),那么只需要保证不把它选作支持向量就行了。比如如果是用的交叉熵作为损失函数,那么损失函数在每个地方的微分都是不等于0的,所以最终的a_n^*也不会是稀疏的,那么每一个数据点对最后的模型都会有影响,所以相比于其他模型,支持向量机是比较稳健的(robust)。
将式子\theta^*=\sum_n a_n^*x^n矩阵化得到:\theta=Xa,则:
f(x)=\theta^Tx=a^TX^Tx=\sum_n a_n(x^n*x)
具体的矩阵变换如图(图中的w就是指\theta):

Dual Representation

接下来,我们将假设函数写成带核函数的形式:

其中的就是核函数(Kernel Function),如果不作任何映射直接作内积,就称为线性核,得到的就是之前的线性支持向量机。
之前构造的线性支持向量机没有作数据的映射,因此只能用来分隔线性的数据。如果数据线性不可分,就需要将映射到,映射到高维空间之后得到线性可分的数据:
映射

这样带来的问题是如果维度较高会导致计算量爆炸,因此使用核技巧(Kernel trick)可以帮助我们在高维映射下计算SVM,举个高维映射的例子:

Kernel trick

这样,计算就可以通过计算核函数来计算,避免了显式地写出映射后的结果,直接使计算量小了很多
在实际应用中,不需要去考虑如何映射,而是可以直接选择核函数,通常我们会从一些核函数中选择,例如:

  • 线性核函数:K(x,z)=<x,z>(向量内积)
  • 多项式核函数:K(x,z)=(<x,z>+R)^d
  • 高斯核函数,高斯核函数是最常用的,可以将数据映射到无穷维,也叫做径向基函数(Radial Basis Function,RBF):
    K(x,z)=exp(-\frac{||x-z||^2}{2\sigma^2})

最后,放张图总结一下支持向量机:


Support Vector Machine

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容