支持向量机SVM

原创 2017年07月17日 11:39:49

支持向量机SVM

这篇文章是对http://www.cnblogs.com/pinard/p/6097604.html系列文章的理解和补充

感知机模型

感知机可以说是最古老的分类方法之一了,在1957年就已经推出。它的泛化能力不强,但是却是SVM,神经网络和深度学习的基础。
感知机的思想很简单,就是尝试找到一条直线,将平面上属于不同类别的点分开。如果找不到这样一条直线,说明数据是线性不可分的。使用感知机最大的一个前提是数据线性可分,这严重限制了感知机的使用场景,即使XOR数据使用感知机也会分类失败。另外即使数据线性可分,利用感知机找到的分类直线也不是唯一的,这和训练过程中的参数设置有关。SVM就从以上两点改进,通过最大化几何间隔改进第二个问题,通过引入核函数改进第一个问题。另外神经网络可以通过核函数和增加隐层使数据非线性可分。

感知机模型

假设有n个样本,每个样本对应有m维特征和一个二元类别输出,如下:
(x(1)1,x(1)2,...,x(1)m,y(1)),(x(2)1,x(2)2,...,x(2)m,y(2)),...,(x(n)1,x(n)2,...,x(n)m,y(n))

为了方便,这里二元类别不再是{0,1},而是{1,1}

感知机模型可以定义为:y=sign(wTx),其中:

sign(x)={1,x01,x<0

wTx=w0+w1x1+...+wmxm

感知机的损失函数

根据感知机的模型,将wTx>0的样本类别取值为1,将wTx<0的样本类别取值为-1.因此正确分类的样本满足y(wTx)>0,而错误分类的样本满足y(wTx)<0.损失函数的目标是希望错误分类的所有样本,到超平面的距离之和最短。

如何求一个点到超平面的距离?如图所示,以二维平面为例。设点x到直线的距离为r,x在直线上的投影为x0,直线的法线方向为w,所以点x可以表示为x=x0+rw/w,将上式代入wTx+b=0得到

wTx+b=wT(x0+rw/w)+b=wTx0+b+rwTw/w=rw

所以点x到直线的距离为r=(wTx+b)/w

对于错误分类的样本点,其到超平面的距离为ywTx/w(简单形式)

我们发现,超平面由参数w控制,当w中每一个元素都扩大为原来的N倍,超平面不变,距离不变。所以我们可以将w设置为1,来简化我们的目标函数。此时错分样本到超平面的距离为ywTx

这里写图片描述

我们假设所有错误分类的点的集合为M,则损失函数为

J(w)=x(i)My(i)wTx(i)

这里为了简化目标函数,将距离中的分母设置为1,在SVM中,通常将分子设置为1,这主要和优化算法有关。

损失函数的优化方法

知道了感知机的损失函数,就可以优化了。损失函数是一个凸函数,可以使用梯度下降。但是损失函数中的样本不是样本总体,而是那些错误分类的样本,所以不能使用整体的梯度下降算法,只能使用随机梯度下降或小批量梯度下降。

这里选择使用的是随机梯度下降,每次只利用一个错分样本更新参数。

损失函数基于w的偏导数为:

wJ(w)=x(i)My(i)x(i)

梯度下降的迭代公式为

w=w+αx(i)My(i)x(i)

由于采用随机梯度下降,每次只利用一个样本更新参数,所以参数的迭代公式为:

w=w+αy(i)x(i)

优化算法的执行步骤如下:

  1. 给定n个m维的训练样本和标签,定义所有样本的x0为1,选择初始的参数wRm+1和步长α。需要注意的是,由于感知机的解不唯一,初始值的设定会影响最终的迭代效果。
  2. 根据参数w,选择一个误分类的点
  3. 对参数进行一次随机梯度下降迭代
  4. 检查样本中是否有误分类的点,如果没有,算法结束,如果有,转到2.

损失函数优化算法的对偶形式

上一节的感知机模型的算法形式我们一般称为感知机模型算法的原始形式。对偶形式是对算法执行速度的优化。具体是怎么优化的呢?

通过感知机算法的原始形式w=w+αy(i)x(i)可以看出,每次梯度迭代都是选择一个样本来更新参数。经过若干次迭代得到最终结果。对于从来没有误分类的样本,参与迭代的次数是0.而对于多次误分类的样本j,参与迭代的次数是mj。如果令w的初始值为0,参数w的最终表达式为

w=j=1nαmjy(j)x(j)

其中mj为样本x(j)在迭代过程中因误分类而更新的次数。设置mj的初始值为0,每次对应的样本参与更新时,mj+1

由于α为常量,我们令βj=αmj,这样参数w的最终表达式为

w=j=1nβjy(j)x(j)

根据上式,判断第i个样本是否误分的公式变为y(i)nj=1βjy(j)x(j)x(i)<0

注意,上面判断误差的形式里面,计算的是x(j)x(i)的内积,而且这个内积在之后的计算中还会用到。如果我们事先计算所有样本的内积,在之后的运算中重用,能节省很多时间。

计算所有样本的内积的矩阵称为Gram矩阵,是一个对称矩阵,形式如下:

G=<x(1),x(1)><x(2),x(1)><x(n),x(1)><x(1),x(2)><x(2),x(2)><x(n),x(2)>   <x(1),x(n)><x(2),x(n)><x(n),x(n)>

判断第j个样本是否错误分类时,需要用到矩阵G中的第j列。根据矩阵计算可以一次性判断所有样本是否误分类。设β=[β1,β2,...,βn]TF=y(βTyT)G,FRn,可以判断所有样本是否误分类。

利用对偶形式的算法步骤如下:

  1. 给定n个m维的训练样本和标签,定义所有样本的x0为1,选择初始的参数βRn为0和步长α。需要注意的是,由于感知机的解不唯一,步长初始值的设定会影响最终的迭代效果。
  2. 计算所有样本的Gram矩阵
  3. 计算F=y(βTyT)G,判断F中是否有小于等于0的元素,如果有,对应的样本被误分。选择一个被误分的样本x(i)
  4. β中的第i个分量更新:βi:=βi+α
  5. 重新计算F=y(βTyT)G,中第i个元素的值,判断F中是否有小于0的元素,如果没有,算法结束,如果有,转到3

为什么感知机的对偶算法要比原始算法的计算速度快?因为在原始算法中,每更新一次参数w,判断样本误分是要按照之前的步骤重新计算,但是对偶形式中利用了Gram矩阵,减少了运算量。

感知机小结

感知机算法简单易懂,但是泛化能力不强,不能处理线性不可分的数据,并且解不唯一。但是他是很多算法的鼻祖,比如SVM,神经网络和深度学习。感知机算法中距离的计算,目标函数的简化以及对偶优化算法,在SVM中还会再涉及。

线性SVM

上文讲到的感知机模型有几个缺点:1、解不唯一,对于线性可分的数据,可以找到不止一个超平面可以将数据分开,但是哪个超平面的泛化能力最强呢? 2、感知机模型对于线性不可分的数据分类失败。SVM可以说是感知机的一个改进,首先通过引进支持向量使得解唯一,然后通过引进软间隔支持极少数的异常点的线性数据,以及核函数支持非线性分类。

本节由感知机到SVM,讲解线性SVM的原理和推导过程。

首先感知机中的目标函数是使得所有误分点到超平面的距离和最小。也就是所,离超平面远的点是正确分类的,反而是离超平面比较近的点容易错误分类。如果我们让离超平面比较近的点尽可能远,那么我们的分类效果就会好一点。SVM的思想源于此。

SVM是让所有点离超平面的距离尽可能的大,我们假设大于一定的距离,我们要求一个超平面,使得离超平面最近的点尽可能的远。上面一再提到样本离超平面的距离,所以首先要解决的是如何求距离。然后是目标函数的设置和优化算法。

函数间隔和几何间隔

当分离超平面设置为wTx+b=0时,根据wTx+by是否同号,判断分类是否正确。根据这个,引入函数间隔的概念,定义函数间隔γ为:

γ=y(wTx+b)

可以看出,它就是感知机中点到超平面的距离中的分子。训练集中n个样本点对应n个函数间隔,最小的一个是整个训练集的函数间隔。

函数间隔并不能反映点到超平面的距离,在感知机中我们也提到,当wb成比例的增长时,超平面没有变,但是函数间隔成比例增长。为了统一度量,定义几何间隔,几何间隔是点到超平面的真正距离:

γ=y(wTx+b)/w=γ/w
—–(1)

同样,训练集中n个样本对应n个几何间隔,最小的一个是整个集合的几何间隔。

在感知机中提到,当wb成比例增长时,γ不变,所以可以通过设置分子或者分母为1,进行简化。在感知机中,我们设置分母为1,这里设置分子为1,即函数间隔为1。

将式(1)中wb同时除以γ,分子为1,分母为w=w/γ

所以几何间隔在固定了参数wb之后,表达式为γ=1/w

支持向量

SVM的思想就是确定一个超平面,使得所有样本中离超平面最近的点尽量远。离超平面最近的这些点就称为支持向量。如下图所示,两条虚线上的点离超平面最近,称为支持向量。和这两条虚线平行并位于最中间的直线就是分类超平面。由图中还可以看出,如果分类超平面是wTx+b=0,则两条虚线的公式分别为wTx+b=1何wTx+b=1,而且两条虚线的间隔是2γ

这里写图片描述

线性SVM的目标函数

还是那句话,SVM使得所有样本中距离超平面最近的点离超平面最远。也就是说要使得整个样本的几何间隔最大。用数学式子表达就是:

maxγ=y(wTx+b)/w
—–(2)

s.t.y(i)(wTx(i)+b)/wy(wTx+b)/w
—-(3)

(2)和(3)中的w和b同时除以γ=y(wTx+b),并使得(3)中不等式两边同时乘以w ,得到

max1/ws.t.y(i)(wTx(i)+b)1

将最大化转为最小化可得

min12w2s.t.y(i)(wTx(i)+b)1(i=1,2,...,n)

上式就是线性SVM的目标函数,加上系数是为了计算方便。这是一个约束优化问题,而且有n个约束条件,和之前介绍的logistic和感知机的目标函数是无约束优化问题不一样。可以用约束优化的方式解决。

由于目标函数12w是凸函数,同时约束条件不等式是仿射的,可以利用对偶理论,通过拉格朗日函数将其转化为无约束的优化问题。

(原问题:

minxRnf(x)

s.t.{Ci(x)0,i=1,2,...,khj(x)=0,j=1,2,...,l

对偶问题:

L(x,α,β)=f(x)+i=1kαiCi(x)+j=1lβjhj(x)

αi0

如果f(x)Ci(x)是凸函数,并hj(x)是仿射函数,x,α,β分别是原问题和对偶问题的最优解的充要条件是:x,α,β满足KKT条件

xL(x,α,β)=0αCi(x)=0i=1,2,...,kCi(x)0i=1,2,...,kαi0i=1,2,...,khj(x)=0j=1,2,...,l

)

根据上面的对偶问题的理论,可以将SVM约束优化问题转化为无约束优化问题:

L(w,b,α)=12w2i=1nαi[yi(wTxi+b)1]s.t.αi0
—–(4)

由于引进了拉格朗日乘子,目标为minw,bmaxαi0L(w,b,α)

由于优化条件满足KKT,可以转化为等价的对偶问题来求解,即

maxαi0minw,bL(w,b,α)

我们可以先求优化函数对W,b的极小值,然后再求关于拉格朗日乘子α的极大值。

首先求解关于w,b的极小值,分别通过对w,b的求偏导得到

{wL(w,b,α)=0wni=1αiyixi=0w=ni=1αiyixibL(w,b,α)=0ni=1αiyi=0

将上面两个等式带入(4)中:

ψ(α)=12||w||2i=1nαi[yi(wTxi+b)1]=12wTwi=1nαiyiwTxii=1nαiyib+i=1nαi=12wTi=1nαiyixii=1nαiyiwTxii=1nαiyib+i=1nαi=12wTi=1nαiyixiwTi=1nαiyixii=1nαiyib+i=1nαi=12wTi=1nαiyixii=1nαiyib+i=1nαi=12wTi=1mαiyixibi=1nαiyi+i=1nαi=12(i=1nαiyixi)T(i=1nαiyixi)bi=1nαiyi+i=1nαi=12i=1nαiyixTii=1nαiyixibi=1nαiyi+i=1nαi=12i=1nαiyixTii=1nαiyixi+i=1nαi=12i=1,j=1nαiyixTiαjyjxj+i=1nαi=i=1nαi12i=1,j=1nαiαjyiyjxTixj

最后对上式求极大化,转化为求极小化,得到

minα12i=1nj=1nαiαjyiyj<xixj>i=1mαi

s.t.i=1nαiyi=0andαi0i=1,2,...,n

以上就是SVM的目标函数,只要求出α=[α1,α2,...,αn]T就可以求出w和b了。具体怎么求α,一般需要SMO算法。这里

根据对偶理论,假设得到了原问题和对偶问题的最优解w,b,α,可以推导KKT条件如下:

w=wni=1αiyixi=0b=ni=1αiyi=0αi(yi(wTxi+b)1)=0yi(wTxi+b)10αi0

假设已经求得最优的α,那么根据w=ni=1αiyixi就可以求得w。求b则稍微麻烦一些。g根据KKT的第三个条件可知,当αi>0时,yi(wTxi+b)=1,表示样本xi离分类超平面的距离是1,即是支持向量。根据这个等式,可以求得b。找到所有的支持向量,即找到α中所有非零元素,对应的样本就是支持向量,然后根据上述等式求得相应的b,为了模型更加鲁棒,求它们的均值作为最终的b。

线性可分SVM算法过程

这里对线性可分SVM的算法做一个总结。

输入是线性可分的n个样本(x1,y1),(x2,y2),...,(xn,yn)。其中样本是m维向量,标签取值于{1,1}

输出是分离超平面的参数w,b

算法过程如下:

  1. 构造约束优化问题

    minαi=1nj=1nαiαjyiyj<xi,xj>i=1nαi

    s.t.i=1nαiyi=0andαi0,i=1,2,...,n

  2. 用SMO算法求解上述问题对应的最有解α

  3. 找出所有S个支持向量,即满足αi>0的样本

  4. 计算w=i=1Sαiyixi,计算W时只需利用支持向量相应的数据即可,因为非支持向量的αi=0,在计算中不起作用。

  5. 对所有S个支持向量,通过yi(wTxi+b)=1,(等式两边同乘yi,得到wTxi+b=yi,所以b=yiwTxi,将(4)中计算得到的w带入)计算出每个支持向量对应的bj=yjSi=1αiyi<xi,xj>,求平均值为最终的b

  6. 最后超平面为wx+b=0,最终的分类决策函数为f(x)=sign(wx+b)

这样就得到最终的分类超平面:(w)Tx+b=(Si=1αiyixi)x+b=0,最终的分类器为:f(x)=sign((w)Txi+b)=sign(Si=1αiyixi)x+b)

线性可分SVM对于非线性数据是没有办法使用的,不可分的原因有两个。一是线性数据集中有少量异常点,由于这些异常点线性不可分,利用SVM的软间隔模型可以解决此类问题;二是数据本身是非线性的,需要引进核函数。

线性SVM软间隔最大化模型

有时候数据本身是线性可分的,也就是说可以用线性SVM来分类,但是却因为存在一些异常点,导致线性不可分。比如下图,本来数据可以按照下图的实线做超平面分离的,可是有一个橙色和一个蓝色的异常点导致分类失败。

这里写图片描述

另一种情况是数据仍然线性可分,但是会影响到泛化效果。如下图,如果不考虑异常点,SVM超平面应该是下图中红线所示,但是由于一个蓝色的异常点,导致我们学习到的超平面是下图中黑色虚线,这会严重影响到模型的泛化效果。

这里写图片描述

如何解决上述两个问题呢?SVM引入软间隔最大化的方法来解决。

线性分类SVM软间隔最大化模型

所谓软间隔,是相对硬间隔而言的。我们认为上节介绍的SVM模型是硬间隔最大化,即所有样本点到分离超平面的距离都大于等于1。而软间隔的条件可以放宽,只要求样本点到分离超平面的距离加上一个松弛变量后大于等于1,同时这些松弛变量也要作为惩罚加入目标函数。

硬间隔最大化:min12||w||22s.tyi(wTxi+b)1(i=1,2,...n)

软间隔最大化:min12||w||22+Cni=1ξis.t.yi(wTxi+b)1ξiandξi0(i=1,2,...,n)

对比硬间隔最大化,软间隔最大化在两个地方做了改进。首先是约束条件:对每一个样本到分离超平面的距离加上了一个松弛变量,使得样本到超平面的距离的约束有所放松。另外加上这些松弛变量也要有代价,所以在目标函数上加上了对松弛变量的约束。这里C>0是惩罚函数,可以理解为一般回归和分类中的正则化参数。C越大,对误分类的惩罚越大,样本中被错误分类的点越少,但是支持向量的间隔越小。

也就是所,我们希望目标函数最小化,一方面要求支持向量离超平面尽量远,另一方面要求松弛变量尽量小。

软间隔最大化的目标函数和上一节介绍的硬间隔最大化模型的目标函数形式一样,都可以用对偶理论解决。

线性SVM软间隔最大化的目标函数

首先用拉格朗日函数将约束优化问题转化为无约束优化问题:

L(w,b,ξ,α,μ)=12||w||22+Ci=1nξii=1nαi[yi(wTxi+b)1+ξi]i=1nμiξi

其中αi0,μi0是拉格朗日系数。

首先求w,b,ξ使L(w,b,ξ,α,μ)最小化,可以通过偏导数求解:

Lw=0w=i=1nαiyixi

Lb=0i=1nαiyi=0

Lξi=0Cαiμi=0

然后利用上面三个式子消除w和b

L(w,b,ξ,α,μ)=12||w||22+Ci=1nξii=1nαi[yi(wTxi+b)1+ξi]i=1nμiξi =12||w||22+i=1nCξii=1nαi[yi(wTxi+b)1+ξi]i=1nμiξi=12||w||22i=1nαi[yi(wTxi+b)1+ξi]+i=1nαiξi=12||w||22i=1nαi[yi(wTxi+b)1]=12wTwi=1nαiyiwTxii=1nαiyib+i=1nαi=12wTi=1nαiyixii=1nαiyiwTxii=1nαiyib+i=1nαi=12wTi=1nαiyixiwTi=1nαiyixii=1nαiyib+i=1nαi=12wTi=1nαiyixii=1nαiyib+i=1nαi=12wTi=1nαiyixibi=1nαiyi+i=1nαi=12(i=1nαiyixi)T(i=1nαiyixi)bi=1nαiyi+i=1nαi=12i=1nαiyixTii=1nαiyixibi=1nαiyi+i=1nαi=12i=1nαiyixTii=1nαiyixi+i=1nαi=12i=1,j=1nαiyixTiαjyjxj+i=1nαi=i=1nαi12i=1,j=1nαiαjyiyjxTixj

进过计算,第4行的式子和硬间隔最大化的函数一样,之后的计算过程也完全一样,最后得到的结果也一样,不过对拉格朗日系数的约束不一样。

之前对拉格朗日系数的约束只有两个,现在有4个,分别是

ni=1αiyi=0Cαiμi=0αi0μi0

对第2,3,4三个式子,可以消去μi,得到

{ni=1αiyi=00αiC

综上,软间隔最大化的目标函数为

minαi=1,j=1nαiαjyiyj<xi,xj>i=1nαi

s.t.{ni=1αiyi=00αiC

软间隔最大化的目标函数和硬间隔最大化的目标函数只有一点不一样,就是对α的约束。

软间隔最大化的支持向量

硬间隔最大化的支持向量很好计算,求出最优的α之后,找到里面的非零元素,对应的样本即为支持向量。但是软间隔最大化由于加入的松弛变量,所以情况比较复杂。

下面左图是硬间隔最大化的分类情况,样本点的位置只有两种情况,在虚线的外侧和在虚线上,分别为正确分类的点和支持向量。右图是软间隔最大化的分类情况,样本点的位置有5中情况,分别为:

  1. 在虚线外且被正确分类,对模型的建设没有贡献
  2. 在虚线上且被正确分类,真正的支持向量
  3. 被正确分类但是在实线和虚线中间,如点1,2,4,这些也是支持向量
  4. 在实线上,这些点可以拒绝判断,也可以认为分类正确
  5. 被分类错误的点,在超平面的另一端且在虚线外,如点5

这里写图片描述

那么如何根据α判断这些点的位置呢?还要利用KKT条件:

wL(x,α,ξ,α,μ)bL(x,α,ξ,α,μ)ξL(x,α,ξ,α,μ)αi(yi{wTxi+b}1+ξi)yi{wTxi+b}1+ξiαiμiξiξiμi=wi=1Nαiyixi=0=i=1Nαiyi=0=Cαiμi=0=0;i=1,2,...n0;i=1,2,...n0;i=1,2,...n=0;i=1,2,...n0;i=1,2,...n0;i=1,2,...n

现在基于α对上面五种情况再做更详细的讨论:

  1. αi=0时,根据第三条,μi=C,再根据第七条,得ξi=0,然后再根据第四第五条得到yi(wTxi+