这里是《神经网络与机器学习》以及一些《统计学习方法》的笔记。(主要是《神机》坑爹没给SMO或者其他求解算法)
大概知道为啥《神机》这本讲神经网络的书会把SVM放进去了,从结构上看,SVM跟感知机,使用了核方法的SVM跟单隐藏层的神经网络确实非常相似,而当年Vapnic正式提出SVM的论文题目就叫“支持向量网络”。(虽然主要是因为当时神经网络正火而被要求整这名的)
支持向量机(Support Vector Machine,SVM)是一种类似感知机的二分类模型,其原理也是拿一个超平面wTx+b=0来将空间中的数据点集分成两类,即正例和负例。对于需要预测的点,落在超平面一侧的归为一类,落在另一侧的归为另一类。
而跟感知机不同的地方在于训练的时候,即使训练集完全是线性可分的,超平面也不是只要能把两堆点集分开就可以,两边正例和负例的离超平面最近的点跟超平面的距离也都必须是最大化的。或者说,超平面必须位于两堆点集之间的正中间才行。
点集是线性可分的情况下,这样的超平面一般是存在且唯一的,被称为最优超平面(Optimal hyperplane)。
这样做的目的是为了不让分离的超平面偏向正例或者负例,让被预测的点有尽可能正确的分类。
具体的样子如下图。
而图上的蓝点,也就是离最优超平面最近的那些点,称为支持向量(Support vector)。
这就是这玩意叫支持向量机的理由。
线性可分模式下的最优超平面
先从最理想的情况,也就是训练集是线性可分的情况说起。
首先有一系列已经分成两类的训练点x1,x2,⋯,xN,以及各自对应的期望响应d1,d2,⋯,dN,其中di分别取值+1和−1表示其属于不同的两类。
那么其分类方式就可以写成:
wTxi+b≥0,di=+1
wTxi+b<0,di=−1
记判别函数为
g(x)=wTx+b。
根据解析几何,点x到超平面wTx+b=0的距离为:
r=wTx∥w∥+b∥w∥
其中
∥w∥为超平面法向量
w的欧氏范数,也就是向量的长度,用于将
w转化为单位向量。此公式可根据高中数学的向量内积的原理推导。
不过上式计算出的距离在点为正例的时候值是正的,而点为负例的时候值是负的。但是由于距离需要为绝对值,而正好正负例的期望响应取值分别为
+1和
−1,所以上式就改写为:
ri=di(wTxi∥w∥+b∥w∥)
这样计算出来的距离
ri就横竖都是正的,只要点
xi被正确分类了 。
当超平面为最优超平面的时候,设离超平面最近的点,也就是支持向量跟超平面的距离为r∗,那么可知每个点xi跟超平面的距离都将不小于r∗,也就是:
ri=di(wTxi∥w∥+b∥w∥)≥r∗,i=1,2,⋯,N
重新定义w和b,让w取代原来的r∗w∥w∥,b取代原来的r∗b∥w∥,那么上式就可变为:
di(wTxi+b)≥1,i=1,2,⋯,N
顺便定义两个平面
wTx+b=±1为间隔边界,它们将最优超平面夹在正中间,所以上式也可以表述为把点控制在两个分隔边界外边。
当点
xi为支持向量的时候,该点即正好落在间隔边界上,上式等号成立,于是其跟超平面的距离
r∗就是:
r∗=1∥w∥
我们的目标就是让这个距离
r∗也就是上式最大化。
接下来就是怎么定义支持向量机的最优化目标。
由于∥w∥=wTw,那么可以设定代价函数为Φ(w)=12wTw,这样最小化代价函数的时候r∗也就得到了最大化。
那么线性可分的支持向量机的最优化问题就可以定义为如下:
minw,b12wTw
s.t.di(wTxi+b)−1≥0,i=1,2,⋯,N
这是一个有约束最优化问题。
拉格朗日乘子方法
可知这个最优化问题的代价函数Φ(w)是w的凸函数,而且约束条件关于w是线性的。这样就可以用拉格朗日乘子方法来解决这个问题。
所谓的拉格朗日乘子方法基于拉格朗日对偶性的理论,就是建立一个加入了拉格朗日乘子的拉格朗日函数,对其取极大极小来构造一个对偶问题(dual problem),再解决对偶问题,从而解决原问题。在上边所说的情况下,对偶问题的最优解也就是原问题的最优解。
首先建立拉格朗日函数:
J(w,b,α)=12wTw−∑i=1Nαi(di(wTxi+b)−1)
αi为拉格朗日乘子,并且
αi≥0。
我们需要拿这个函数关于w和b取极小。这就是原始问题。
然后对其在关于w,b取极小的情况下,关于αi取极大,构造一个新的最优化问题。这个问题就是对偶问题。
由此可以看出拉格朗日乘子方法其实就是将优化的目标函数跟约束条件简单粗暴得套在一起,成为拉格朗日函数,并为约束条件的每一项乘上一个称为拉格朗日乘子的系数。
其对于约束条件的想法就是,因为是关于拉格朗日乘子取极大,所以要是有其中一项约束条件没有满足,那么拉格朗日函数就会趋于正无穷,也就没法关于w和b取极小了。就是这样来保证约束条件的满足。
根据拉格朗日对偶性理论,原始问题和对偶问题都获得最优解的充要条件是满足KKT(Karush-Kuhn-Tucker)条件。
KKT条件之一要求拉格朗日函数对w,b和α的梯度为零,于是先拿拉格朗日函数J(w,b,α)分别对w和b求偏导并使之为零来获得其对w,b的最优化:
∂J(w,b,α)∂w=0,
∂J(w,b,α)∂b=0
解得:
w=∑i=1Nαidixi,
∑i=1Nαidi=0
可知
w是可以用对偶问题的解
α1,α2,⋯来表示的。
再把上边俩式子带入到J(w,b,α)中并整理可得:
J(w,b,α)=Q(α)=−12∑i=1N∑j=1NαiαjdidjxTixj+∑i=1Nαi
这样得到了如下的对偶问题:
maxαQ(α)=−12∑i=1N∑j=1NαiαjdidjxTixj+∑i=1Nαi
s.t.∑i=1Nαidi=0,αi≥0
根据拉格朗日对偶性理论,KKT条件中还有一个条件为:
αi(di(wTxi+b)−1)=0
这个条件称为对偶互补条件,在对偶问题解决时即可满足。
从中可知,只有当
di(wTxi+b)−1=0,即
xi为支持向量的时候,才有
αi>0,否则
αi=0,因而根据:
w=∑i=1Nαidixi
可知
w实际上是由少数几个支持向量决定的。
因而可以随便拿一个对应的
αj>0的序号
j来获得超平面的另一个系数b:
b=dj−wTxi=dj−∑i=1NαidixTixj,αj>0
综上,只有解决了对偶问题,求出最优的拉格朗日乘子α1,α2,⋯,αN,才可以进一步解得最优超平面的系数w和b。
而对偶问题的解决就不能只靠公式推导了,目前基本上都是使用数值解法,其中最主流的就是SMO算法。
不可分模式的最优超平面
这里的对应的是点集大致上线性可分,但是严格来说线性不可分的情况,也就是正例负例的点大致上是可以用一个超平面分开的,但是由于噪声、误分类等原因总有那么一些点跑到了另一边导致了线性不可分。
前文给出的方法是用于严格线性可分情况的,在这里就行不通了。所以对于这种情况,为了消除这些站错队的点的干扰,解决方式就是给每个点xi在约束条件上加一个非负的松弛变量ξi:
di(wTxi+b)≥1−ξi,i=1,2,⋯,N
意思是每个点跟最优超平面的距离都不一定要大于等于1,还可以比预定的离对面近一些,近多少就由这个松弛变量
ξi度量。当
ξi>1的时候表示点已经出了界跑到了对面。
理所当然的肯定不能让点集在总体上跑偏的太多。于是代价函数就要考虑上松弛变量:
Φ(w,b,ξ)=12wTw+C∑i=1Nξi
也就是说最大化分类间隔的同时还得让点集总体上的跑偏程度,也就是松弛变量的和尽可能小。其中
C称为正则参数或者惩罚参数,用来描述对分类误差的容忍程度,由自己设定。
这样就获得要获得线性不可分情况下的最优超平面,也称为软间隔最大化的最优化原始问题如下:
minw,b,ξ12wTw+C∑i=1Nξi
s.t.di(wTxi+b)≥1−ξi,ξi≥0,i=1,2,⋯,N
前文的线性可分的情况实际上是这里ξi=0时的特殊情况。
同样的套路,对其构造拉格朗日函数并对w,b,ξ求偏导数再让其为零,即可整出对偶问题如下:
maxαQ(α)=−12∑i=1N∑j=1NαiαjdidjxTixj+∑i=1Nαi
s.t.∑i=1Nαidi=0,0≤αi≤C
再使用SMO等方法解出α1,α2,⋯,αN,就可以计算出w:
w=∑i=1Nαidixi
然后随便找一个让
0<αj<C的
j来解得系数b:
b=dj−wTxi=dj−∑i=1NαidixTixj,0<αj<C
训练完毕,进行未分类点的预测时,分类决策函数为:
y=f(x)=sign(wTx+b)
或者写成用
α表示的形式:
y=f(x)=sign(∑i=1NαidixTix+b)
线性不可分情况下的支持向量
对于点xi是不是支持向量依然可以由对偶问题的解α1,α2,⋯,αN确定,αi>0的时候对应的xi就是支持向量,否则就不是。
而跟前文线性可分的情况有所不同的是,这里的支持向量不仅仅是刚好落在间隔边界上的点,落在俩间隔边界中间,包括正好在最优超平面上,甚至跑出了最优超平面跑到了对面的点都是支持向量。
如果满足0<αi<C,那么点xi就是“正统”的支持向量,刚好落在间隔边界上,点xi称为无界的支持向量,或者自由支持向量(《神机》语)。
如果αi=C,那么点xi就是不落在间隔边界上,而是位于间隔边界另一侧的某个位置的支持向量。(我怎么觉得这才应该叫自由支持向量)
而对于这种支持向量具体在哪就得看对应的ξi取值。0<ξi<1的时候,点xi依然在最优超平面的分类正确的一侧;ξi=1时,点xi正好落在最优超平面上;ξi>1时,点xi就跑最优超平面的另一边去了。
所以用来求解b的j必须满足 0<αj<C。
另外上边的方法只能单方向从αi的取值来确定点xi的情况,反过来只知道xi在间隔边界上是不能确定对应的αi的…
使用核方法的支持向量机
这里对应的是真正意义上的点集线性不可分的情况,比如负例的点分布呈一个环将正例包围起来。这时是完全不可能拿平面来将点集分开了。
在这里支持向量机用的就是跟前一章径向基函数网络用的一样的核方法,既然在原来的空间里点集线性不可分,那就索性用某种转换将点集映射到另一个维度更高的空间里去,使之变得线性可分,再拿前文的软间隔最大化的线性方法搞之。在使用核方法的模型里边,支持向量机是玩的最溜的。
这里把点集原本所在的空间称为输入空间,被映射到的高维空间称为特征空间。
而跟径向基函数网络不同的地方在于,径向基函数网络即使是将点集映射到高维空间之后的维数也通常是有限的,而支持向量机映射到的空间则是无限维的(希尔伯特空间)。
希尔伯特空间可认为是欧氏空间的无穷维的推广,但其中向量的距离、内积等都还是生效的。
定义转换ϕ(x)={ϕj(x)}∞j=1,将点x从m0维的输入空间映射到无限维的特征空间,变成无穷维的向量。
那么在特征空间里的超平面参数便如此表示:
w=∑i=1Nαidiϕ(xi)
于是分类决策函数就变成这样:
y=f(x)=sign(wTϕ(x)+b)
=sign(∑i=1Nαidiϕ(xi)Tϕ(x)+b)
那么问题来了,既然被映射到的特征空间理论上可以是无穷维的,那么在实际中怎么把这个无穷维的特征空间的数据实现呢?
其实往前翻你可以发现在实际计算的公式里边,包括对偶问题以及分类决策函数,样本点都是表示成俩向量内积(
xTixj)的形式的。所以把
xi替换成
ϕ(xi)之后就基本上都是形如
ϕ(xi)Tϕ(x)的内积形式。
内积的结果是标量,所以这里就定义了一个函数k(xi,xj)=ϕ(xi)Tϕ(xj)来取代之,这样以后就都只研究k(xi,xj)就好了,不用去纠结这个变换ϕ(xi)具体啥样了,无穷维的向量的表示问题就这样绕过了。
这个方法就是传说中的核技巧(kernel trick)。
定义ϕ(xi)是一个从输入空间(欧氏空间)到特征空间(希尔伯特空间)的映射,对于任意的两个输入空间中的向量xi、xj,都有下式成立:
k(xi,xj)=ϕ(xi)Tϕ(xj)
那么
k(xi,xj)就称为
内积核或者
核函数或者简称
核。
于是分类决策函数就可以改写为:
y=f(x)=sign(∑i=1Nαidik(xi,x)+b)
把
k(xi,xj)简写成
ki,j,对偶问题的目标函数就可以表示为:
Q(α)=−12∑i=1N∑j=1Nαiαjdidjki,j+∑i=1Nαi
内积核
接下来的问题就是满足条件的核函数该怎么找。
当然了,并不是所有的形如k(xi,xj)
- 多项式核函数(p为自定义参数):
k(xi,xj)=(xTixj+1)p - 高斯径向基核函数(σ为自定义参数):
k(xi,xj)=exp(−∥xTixj∥2σ2) - 两层感知器核函数(β0、β1为自定义参数,但并不是所有的值都满足核函数的要求):
k(xi,xj)=tanh(β0xTixj+β1)
至于要什么样的函数k(xi,xj)才能成为核函数的问题,牵扯上了泛函分析的各种高端理论,这里就只给出充要条件好了:
若对于任意x1,x2,⋯,xm,关于k(xi,xj)的m阶的Gram矩阵K=[k(xi,xj)]m×m也就是元素为对x1,x2,⋯,xm中的各个向量两两之间求得的k(xi,xj)的值的矩阵为半正定矩阵,那么k(xi,xj)就是符合要求的核函数,也称正定核。
其实线性支持向量机可视为是特殊情况下的非线性支持向量机,此时核函数k(xi,xj)=xTixj。
综上,支持向量机的对偶问题为如下:
maxαQ(α)=−12∑i=1N∑j=1Nαiαjdidjkij+∑i=1Nαi
s.t.∑i=1Nαidi=0(I)
0≤αi≤C(II)
其中
kij=k(xi,xj)。
SMO算法
前边说过,支持向量机的对偶问题的解基本上没法用公式套出来,只能使用近似的数值解法,其中最应用最广的一种就是序列最小优化算法(Sequence-Minimal Optimization),也即是SMO算法。
SMO算法的基本想法就是两个两个地优化α值,在每次优化的时候都选取两个α来优化,其他的α当作是常量,这样将多个变量的有约束最优化问题转化为了两个变量的最优化问题,并且经过若干轮优化之后,对偶问题将趋于整体的最优化。这里有点类似于随机梯度下降的思想。
至于为啥是同时选取俩α而不是一个进行优化,是因为只选一个α优化的话就破坏约束条件(I)了。
过程如下:
首先假设在某一步已经通过某种方法选中了一对αi跟αj并欲优化之,同时固定其他α为常量,那么对偶问题的最优化目标函数就可以整理成下面的二元二次函数:
maxαi,αjQ(α)=12kiiα2i+12kjjα2j+didjkijαiαj−(αi+αj)+diαi∑k≠i,jN−2dkαkkki+djαj∑k≠i,jN−2dkαkkkj
约束条件(I)就成了这样:
αidi+αjdj=−∑k≠i,jN−2αkdk
不过通常情况等号右边的部分也挺费计算量的,所以一般不会算等号右边,而是保留优化前的
α值
αi0跟
αj0:
αidi+αjdj=αi0di+αj0dj
反正要求序列总和保持为0,而且其他
α也没变动嘛。
而约束条件(I)就成了一二元一次方程,将其代入上面的整理后的目标函数再消去个αi,就完全成了一元二次函数Q(αj)了。除了麻烦系数有点高,难度系数上看估计初中水平都可以解出来。
再看看约束条件(II),成了酱紫:
0≤αi≤C,0≤αj≤C
把约束条件(I)带入(II)消去
αi就简化成了下边的只有单个变量的形式:
L≤αj≤H
其中:
L=max(0,αj0+αi0−C),H=min(C,αj0+αi0),当di=dj
L=max(0,αj0−αi0),H=min(C,C+αj0−αi0),当di≠dj
对于目标函数的优化策略可以按高中数学函数题的解法来想,先不管约束条件,令导数为0解出让Q(αj)最小时的αuncj,然后将其跟约束条件区间的边界L和H比较,要是αj介于L和H之间αj就取这个αuncj,要是跑出了区间就取靠近的那个边界值。
经推导获得的不考虑约束的Q(αj)最小时的αuncj为:
αuncj=αj0+yi(Ei−Ej)η
其中
Ek=g(xk)−dk=∑i=1Nαidik(xi,x)+b−dk
η=kii+kjj−2kij
然后
αj=H,αuncj≥H
αj=L,αuncj≤L
αj=αuncj,L<αuncj<H
解出了
αj之后就可以拿约束条件(I)把
αi也解出来:
αi=αi0+didj(αj0−αj)
这样一轮优化完毕。
#
接下来的问题就是如何科学有效得选择αi跟αj了。
SMO的想法是先找违反约束条件最严重的点对应的α作为αi,这个过程叫外循环;然后是依据已经找好了的αi找配套的αj。由前面可以知道,优化前后αj的该变量主要是由Ei跟Ej的差值决定的,所以一般是按照让Ei跟Ej差距最大的策略决定αj,这个过程叫内循环。
这里约束条件可以表示成酱紫:
(∑j=1Nαjdjkij+b)di>1,αi=0
(∑j=1Nαjdjkij+b)di=1,0<αi<C
(∑j=1Nαjdjkij+b)di<1,αi=C
更新完αi跟αj之后还要接着更新b:
如果满足更新后0<αi<C,那么b可以这样更新:
b1=−Ei−dikii(αi−αi0)−djkji(αj−αj0)+b0
如果满足更新后0<αj<C,那么b也可以这样更新:
b2=−Ej−dikij(αi−αi0)−djkjj(αj−αj0)+b0
如果都上边俩条件都一起满足了那么应该有b1=b2,这时可以随便选择一个作为新的b。
但如果有一个α不满足上边的条件,那么b1跟b2跟它们之间的所有数都可以作为新的b,不过这时候一般取b1跟b2的均值。