SVM原理
首先需要知道支持向量机的分类:
线性可分支持向量机
这种向量机是属于最为理想的状态,满足两个条件,线性和可分。
线性支持向量机
这种向量机则允许出现一些错误的数据点
非线性支持向量机
这种向量机就是能够处理非线性的数据,通过特征映射的方式将非线性的数据信息转化为线性可分的数据,然后再利用向量机进行分类。
简单的理解表现在二维平面上就是线性的分类方式为一条直线,而非线性的分类方式为一条曲线。
函数间隔与几何间隔:
参数说明
线性核:
C参数越来越大,分类的界面越来越窄,表明使用了越来越少的样本来做分类,有可能导致过拟合,但是C值越大,能使得训练精度变高。实际中需要确认想要的目标是训练精度高,还是泛化能力强的问题
高斯核:
γ足够大的话,分界曲面靠近于训练数据,换句话说,总是可以将γ值取得足够大的话,使得它的分类准确度是百分之一百
当γ足够小的时候,高斯核就退化成为了线性核 当γ足够大的时候,高斯核就退化成为了K近邻
SVM优化问题推导
假设在一个平面中,存在两个类别的样本,并且是可分的,那么一定可以找到无数条直线将其分开。存在一条直线可以将其分开,并且这条直线离样本的距离是最大的。
下面我们通过一个实际的表达式来推到到数学上的表达式
假设这条直线为:2x+y−4=0
那么我们可以写成(2,1)(xy)−4=0
即将(2,1)作为w,(xy)作为x,−4作为b,这样分界面就可以写成wTx+b=0。其中w和x为向量,b为标量。这里的分界面的表达式代表的就是这条分解的直线,在高维空间中,则称之为超平面。
此时将样本点带入wTx+b中得到的结果如果为正数,样本点就位于直线法线的正向,反之则位于法线的负向。
接下来我们要考虑的是如何衡量样本属于正例还是负例呢?
这里使用的是距离的方式来衡量,回顾下我们计算点到直线的距离计算公式:∥w∥∣wx+b∣,通过这个来衡量样本分界面wTx+b=0的距离。
但是这个公式中包含了一个绝对值让人很讨厌,我们要想办法去掉绝对值。
如果该样本属于正例的话,那么wTx+b的结果为一个正数,如果是负例的话,则是一个负数,那么这个时候如果我们给wTx+b乘上标记值y,当样本点落在直线上方的时候,距离为正值,对应的标记值y为+1,二者相乘为正值。如果样本点位于直线下方,距离为负值,对应的标记值y为-1,二者相乘也为正值。那就可以去掉wTx+b的绝对值符号了,结果为∥w∥y∗(wTx+b), 这就是最终的距离衡量式子。
那么我们要的目标是什么呢?
我们希望的是能够找到一个分割面,二维的话就是一条直线,能够使得样本离这条直线的距离最大。
那么在训练过程中,我们首先需要找到的是离分界面距离最小的那个样本,然后使得这个样本到超平面的距离达到最大,表达成数学式子如下:
w,bargmax{∥w∥1nminyn∗(wTxn+b)} 因为∥w∥1和n无关,所以提出到外面。
上面的目标函数中:有这一个∥w∥1项,这个∥w∥的计算是这样的,假设它为k维,那么∥w∥=w12+w22+w32+...+wk2再开根号,如果直接用这个来进行优化,实现起来非常复杂,所以需要做一个等价的变化。
比如说刚刚的直线:2x+y−4=0,那么我们总是可以计算所有的样本到这条直线的距离,那么必然存在最小距离,我们可以将这个距离进行缩放到1,这个是可以做到的。
原因是这样,假设直线的最小距离算出来为7,那么我们对直线距离计算公式两边同时除以7,那么就可以让距离变为1,那么此时的直线可能转化为 42x+y−4=0。那么这个时候y∗(wx+b)这个项就为1,同时要求所有的样本点的y*(wx + b)计算的结果都要大于等于1。
那么我们就可以令离超平面最近的点的距离为:y∗(wx+b)=1,这样所有的样本点到超平面的距离都会大于等于1,所以nminyn∗(wxn+b)=1。
那么目标函数就可以化简为:argwmax∥w∣∣1s.t. yn∗(wTxn+b)≥1
此时我们多了一个约束条件,y∗(wx+b)大于等于1。
要求∥w∥1最大,那就是要求∥w∥最小,就相当于求21∥w∥2最小,其中的21和平方都是为了后面的求解方便。
最终我们得到SVM的目标函数为:
argwmin21∥w∥2s.t. yn∗(wTxn+b)≥1, n=1,......,N 拉格朗日乘子法和KKT条件
引入拉格朗日乘子,将优化函数写成:
L(w,b,α)=21∥w∥2+n=1∑Nαn{1−yn(wTxn+b)} 然后对w和b分别求偏导得到:
∂w∂L(w,b,α)=w−n=1∑Nαnynxn=0∂b∂L(w,b,α)=n=1∑Nαnyn=0 化简一下可以得到:
w=n=1∑Nαnynxnn=1∑Nαnyn=0 将这两个结果带入先前的拉格朗日函数中:
L(w,b,α)=21∥w∥2+n=1∑Nαn{1−yn(wTxn+b)}=21∥w∥2+n=1∑Nαn−n=1∑NαnynwTxn+n=1∑Nαnynb=21∥w∥2+n=1∑Nαn−n=1∑NαnynwTxn=21n=1∑Nαnynxnm=1∑Nαmynxm+n=1∑Nαn−n=1∑Nαnyn(m=1∑Nαmymxm)xn=21n=1∑Nm=1∑Nαnαmynynxnxm+n=1∑Nαn−n=1∑Nm=1∑Nαnαmynymxnxm=n=1∑Nαn−21n=1∑Nm=1∑Nαnαmynynxnxm 其中限制条件为:
αn≥0, n=1,...,Nn=1∑Nαnyn=0 那么如何高效地解出这个式子呢?需要用到SMO算法,但是在介绍SMO之前,先来看下线性不可分的数据场景下,SVM要怎么处理。
线性支持向量机
若数据线性不可分,或者存在一个样本点使得最终的结果泛化能力降低,那么可以增加松弛因子来解决这个问题。
约束条件则转化为:y∗(wx+b)≥1−ξ
目标函数则转化为:min 21∥w∥2+C⋅ξ
这里的C为一个超参数,保证》0
实际上最终我们得到的松弛因子就是损失,前面的是1/2 |w| 2是一个L2的正则项
SVM存在的问题:
SVM的优点有:
SVM可以用来划分多分类吗?
可以,两个方法,一是直接多分类,时间复杂度是K方乘以一个SVM的时间复杂度和1 vs 1的分类器是一样的,二是使用1 vs rest / 1 vs 1
神经网络也可以处理非线性问题,为什么去全连接层换成SVM的效果会更好呢?在这个问题上SVM会有优势吗?
SVM会更好一点,因为它天然地加入了一点防止过拟合的东西,可能会好一些
一个softmax回归就是一个神经网络
为了减轻噪声样本对SVM的影响,那么就把C调小,使得泛化能力提高
SMO算法
我们根据拉格朗日得到的对偶形式如下:
argαmaxi=1∑Nαi−21i=1∑Nj=1∑Nyiyjαiαj⟨xi,xj⟩s.t. αi≥0i=1∑Nαiyi=0 需要优化的参数就是α=(α1,α2,...,αN),如果直接优化这么多参数的话,会使得计算变得非常复杂,所有我们需要找到其他方法来解决这个问题,这就是SMO算法。
SMO算法的思想是每次只选取一对(αi,αj)进行优化,根据上面的约束条件,其实选定了两个变量,实际上只有一个变量在变化,按照推导来说明。
假设我们现在选择的一对位(α1,α2),那么根据约束条件可以得到如下的等式:
α1y1+α2y2=−i=3∑Nαiyi 在进行一个化简,因为每次只优化两个参数,其余的参数都可以看成常量,所以令等式右边为一个常数γ:
α1y1+α2y2=γ 然后我们按照固定的两个参数写出有优化的式子,将其他与α1,α2无关的常数项写成C:
W(α) =i=1∑Nαi−21i=1∑Nj=1∑Nyiyjαiαj⟨xi,xj⟩W(α1,α2)=α1+α2−21K1,1y12α12−21K2,2y22α22−21K1,2y1y2α1α2 −21K2,1y2y1α2α1−y1α1i=3∑NαiyiKi,1−y2α2i=3∑NαiyiKi,2+C= α1+α2−21K1,1y12α12−21K2,2y22α22−K1,2y1y2α1α2−y1α1i=3∑NαiyiKi,1−y2α2i=3∑NαiyiKi,2+C 于是得到一个二元函数的优化。然后继续化简,由yiyi=1,不管是正例负例二者相乘的结果为1,那么这个时候我们可以根据上面推到的式子中共两边同时乘以y2得到:
α1y1y2+α2y2y2=γy2α2=γy2−α1y1y2 带入α2 的表达式,同时,令v1=∑i=3NαiyiKi,1,v2=∑i=3NαiyiKi,2最终的得到:
W(α1,α2)= γy1−α2y1y2+α2−21K1,1y12(γy1−α2y1y2)2−21K2,2y22α22−K1,2y1y2(γy1−α2y1y2)α2−y1(γy1−α2y1y2)i=3∑NαiyiKi,1−y2α2i=3∑NαiyiKi,2+C=γy1−α2y1y2+α2−21K1,1y12(γy1−α2y1y2)2−21K2,2y22α22−K1,2y1y2(γy1−α2y1y2)α2−y1(γy1−α2y1y2)v1−y2α2v2+C 然后我们的工作是进行求导:
∂α2∂W(α2)=−y1y2+1−K1,1y12(γy1−α2y1y2)y1y2−K2,2y22α2−K1,2y1y2(γy1−α2y1y2)+K1,2y12y22α2−y12y2v1−y2v2(带入yi2=1化简)=−y1y2+1−K1,1γy2−K1,1γα2−K2,2α2−K1,2γy2+K1,2α2+K1,2α2−y2v1−y2v2(合并同类项规范式子)=−(K1,1+K2,2−2K1,2)α2−K1,2γy2−K1,1γy2−y2(v1−v2)−y1y2+1(这里非常重要,把1作为一个等量代换,1=y22)=−(K1,1+K2,2−2K1,2)α2−K1,2γy2−K1,1γy2−y2(v1−v2)−y1y2+y22=0 接下来继续进行化简,我们知道SVM对数据的预测最终要计算的表达是:f(x)=i=1∑NαiyiK(xi,x)+b,所以我们对v1和v2的值就可以进行一个代换:
v1v2v1−v2=i=3∑NαiyiK1,i=f(x1)−α1y1K1,1−α2y2K1,2−b=i=3∑NαiyiK2,i=f(x2)−α1y1K2,1−α2y2K2,2−b=f(x1)−f(x2)−α1y1(K1,1−K1,2)−α2y2(K1,2−K2,2)(带入α1=(γ−α2y2)y1)=f(x1)−f(x2)−(γ−α2y2)y1y1(K1,1−K1,2)−α2y2(K1,2−K2,2)(其中y1y1=y12=1)=f(x1)−f(x2)−γ(K1,1−K1,2)+α2y2(K1,1−K1,2)−α2y2(K1,2−K2,2)(其中K1,2=K2,1)=f(x1)−f(x2)−γ(K1,1−K1,2)+α2y2(K1,1+K2,2−2K1,2) 令预测值和真实值的误差为:Ei=f(xi)−yi,η=K1,1+K2,2−2K1,2,同时带入v1−v2,得到:
∂α2∂W(α2)=−ηα2new+K1,2γy2−K1,1γy2−y2[f(x1)−f(x2)−γ(K1,1−K1,2)+α2oldy2η]−y1y2+y22=−ηα2new+K1,2γy2−K1,1γy2−y2[f(x1)−f(x2)]+y2γ(K1,1−K1,2)+α2oldy22η−y1y2+y22=−ηα2new+y2[f(x1)−f(x2)]+α2oldy22η−y1y2+y22=−ηα2new+α2oldη+y2(f(x1)−f(x2)+y2−y1)=−ηα2new+ηα2old+y2(E1−E2)=0 然后我们可以得到的是:
α2new=α2old+ηy2(E1−E2) 下一步我们要对原始解进行裁剪
为什么需要裁剪呢?是因为我们的计算得到的原始解可能会超出上面的限制条件规定的范围:
α1y1+α2y2=−i=3∑Nαiyi=γ0≤αi≤C 左图这边,我们可以的看到,此时y1=y2,此时的限制条件就可以写成α1−α2=k,根据k的正负可以得到不同的上下界,因此可以写成:
下界:L=max(0,α2old−α1old)
上界:H=max(C,C+α2old−α1old)
同样的根据右图的内容,此时y1=y2,此时的限制条件就可以写成α1+α2=k:
下界:L=max(0,α2old+α1old−C)
上界:H=max(C,α2old+α1old)
根据上面的上下界可以得到:
α2new=⎩⎨⎧Hα2new,unclippedLα2new,unclipped>HL≤α2new, unclipped≤Hα2new,unclipped<L 然后根据α1oldy1+α2oldy2=α1newy1+α2newy2得到:
α1new=α1old+y1y2(α2old−α2new) 到这里我们就可以选取一对αi,αj进行优化更新了。
更新阈值b
当0<α1new<C,满足y1(wT+b)=1,此时我们两边同时乘以y1可以得到i=1∑NαiyiKi,1=y1进而可以得到b1new的值:
b1new=y1−i=1∑NαiyiKi,1−α1newy1K1,1−α2newy2K2,1 其中上式中的前两项可以写成:
y1−i=3∑NαiyiKi,1=−E1+α1old y1K1,1+α2old y2K2,1+bold 当0<α2new<C,可以得到:
b2new=−E2−y1K1,2(α1new−α1old)−y2K2,2(α2new−α2old)+bold 当b1和b2都有效的时候他们是相等的,即bnew=b1new=b2new
当α1,α2都在边界上的时候,且L=H时,b1,b2之间的值就是和KKT条件一致的阈值。SMO算法选择他们的中点作为新的阈值:
bnew=2b1new+b2new 至此,关于SVM所需要的参数我们都可以计算出来了。
参考文献
[2]秦曾昌.机器学习算法精讲.小象学院,2018.
[3]李航.统计学习方法[M].北京:清华大学出版社,2012.
[5]Bishop.Pattern Recognition And Machine Learning,