SVM
感知器能将线性可分数据集准确分割开,但是从损失函数可以看出,只是分割开了,但是没有一个最优解,比如:

Python与机器学习实战——SVM(1)
这样虽然两条直线都将数据集分开了,但是如果出现了一个新的数据点,很有可能这个数据点的分割结果是错误的。比如这样:
Python与机器学习实战——SVM(1)
那么就需要绿色的这个“超平面”作为分类输出才行。这个最有“超平面”就是支持向量机SVM的分类思想。

线性SVM

感知器中有描述到样本点(xi,yi)(x_i,y_i)到超平面Πwx+b=0\Pi:w·x+b=0的相对距离为:
d(xi,Π)=wxi+bd^*(x_i,\Pi)=|w·x_i+b|这个也被称为函数间隔(Functional Margin),当wwbb等比例变大变小时候,超平面不会发生变化,但是dd^*却在变大变小,为了解决这个问题,引出了几何间隔(Geometric Margin):
d(xi,Π)=1wwxi+b=1wd(xi,Π)d(x_i,\Pi)=\frac{1}{||w||}|w·x_i+b|=\frac{1}{||w||}d^*(x_i,\Pi)其中,w||w||ww的欧式范数。SVM是让超平面到点集的距离最大化,也就是需要最大化几个间隔d(xi,Π)d(x_i,\Pi),使得:
1w(wxi+b)yid(i=1,..,N)\frac{1}{||w||}(w·x_i+b)y_i\geqslant d(i=1,..,N)这里,由于在超平面两边的样本点分别分别计算wxi+bw·x_i+b是有正有负的,而yi{1,+1}y_i\in\{-1,+1\},所以能使得(wxi+b)yi(w·x_i+b)y_i都是正数。yiy_i在这个表示的是符号。
由于d=wdd^*=||w||d,所以上式两边同时乘以w||w||,问题等价为最大化d=dwd=\frac{d^*}{||w||},并使得:
(wxi+b)yid(i=1,..,N)(w·x_i+b)y_i\geqslant d^*(i=1,..,N)可以发现dd*的取值对优化问题的解(超平面的位置)没有影响,比如,当dd^*变成了λd\lambda d^*,那么wwbb也变成了λw\lambda wλb\lambda b,但是超平面并没有变化。不妨假设d=1d^*=1,问题转化为了最大化1w\frac{1}{||w||}使得:
(wxi+b)yi1(i=1,..,N)(w·x_i+b)y_i\geqslant 1(i=1,..,N)由于1w\frac{1}{||w||}是非负的,最大化1w\frac{1}{||w||},就是要最小化w||w||,为了方便数学表达和计算,将优化问题写成最小化12w2\frac{1}{2}||w||^2使得:
(wxi+b)yi1(i=1,..,N)(w·x_i+b)y_i\geqslant 1(i=1,..,N)这就是SVM最原始的形式,如果数据集D是线性可分的,那么SVM的解就存在且唯一。

假设最优化的解为ww^*bb^*,那么称超平面:
Π:wx+b=0\Pi^*:w^*·x+b^*=0为最大硬间隔分离超平面。考虑到不等式的约束条件可以知道在两个平面:
Π1:wx+b=1Π2:wx+b=+1\Pi^*_1:w^*·x+b^*=-1\\\Pi^*_2:w^*·x+b^*=+1中间是没有点的,因为(wxi+b)yi<1(w·x_i+b)y_i<1了,但是在Π1\Pi^*_1Π2\Pi^*_2上是有样本点的,通常称Π1\Pi^*_1Π2\Pi^*_2为间隔边界,而边界上的点就是支持向量。

那么对于线性不可分的数据集呢?无法找到超平面完全分割数据集,更不用说要间隔最大化。就需要做出一定妥协,将“硬”间隔转化为“软”间隔,就是将不等式的条件放宽。
(wxi+b)yi1(wxi+b)yi1ξi(w·x_i+b)y_i\geqslant 1\rightarrow (w·x_i+b)y_i\geqslant 1-\xi_i其中,ξi\xi_i被称为松弛变量,不小于0。加入这个松弛变量后,损失函数需要加入一个惩罚项:
L(w,b,x,y)=12w2+Ci=1Nξi\mathbf{L}(w,b,x,y)=\frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_iC被称为惩罚因子,C越大,最终SVM的模型越不能容忍误分类的点,反之越小。
到现在,SVM算法的最优化问题变为了最小化L(w,b,x,y)\mathbf{L}(w,b,x,y),并使得:
(wxi+b)yi1ξi(i=1,..,N)(w·x_i+b)y_i\geqslant 1-\xi_i(i=1,..,N)其中ξi0\xi_i\geqslant0,所以可以定义:
ξi=l(w,b,x,y)=max(0,1y(wx+b))\xi_i=l(w,b,x,y)=\max(0,1-y(w·x+b))其中y{1,+1}y\in \{-1,+1\},所以当模型判断不正确时候,就会有惩罚,而判断正确了就没有惩罚了。损失函数可以写为:
L(w,b,x,y)=12w2+Ci=1Nl(w,b,xi,yi)\mathbf{L}(w,b,x,y)=\frac{1}{2}||w||^2+C\sum_{i=1}^Nl(w,b,x_i,y_i)同样也是使用梯度下降法进行训练的,所以有偏导数:
L(w,b,x,y)w=w+{0,yi(wxi+b)1Cyixi,yi(wxi+b)<1L(w,b,x,y)b={0,yi(wxi+b)1Cyi,yi(wxi+b)<1\begin{array}{c}\frac{\partial L(w,b,x,y)}{\partial w}=w+\left\{\begin{array}{l}0,y_i(wx_i+b)\geqslant1\\-Cy_ix_i,y_i(wx_i+b)<1\end{array}\right.\\\frac{\partial L(w,b,x,y)}{\partial b}=\left\{\begin{array}{l}0,y_i(wx_i+b)\geqslant1\\-Cy_i,y_i(wx_i+b)<1\end{array}\right.\end{array}这样就可以写出线性SVM的算法实现过程:
输入:训练集D={(x1,y1),...,(xn,yn)}D=\{(x_1,y_1),...,(x_n,y_n)\},迭代次数M,学习率α\alpha,其中:xiXRn,yi{1,+1}x_i\in \bold{X}\subseteq\mathbb{R^n} ,y_i\in\{-1,+1\}过程:
(1)初始化参数:w=(0,...,0)TRN,b=0w=(0,...,0)^T\in \mathbb{R^N},b=0(2)对j=1,...,Mj=1,...,M:
(a)算出误差向量e=(e1,...,en)Te=(e_1,...,e_n)^T,其中:
ei=1yi(wxi+b)e_i=1-y_i(w·x_i+b)(b)取出误差最大的一项:
i=arg maxieii=\underset{i}{\argmax}e_i(c)若ei0e_i\leqslant 0则退出循环。否则取对应样本来进行随机梯度下降:
w(1α)w+αCyixibb+αCyiw\leftarrow (1-\alpha)w+\alpha Cy_ix_i\\b\leftarrow b+\alpha Cy_i输出:线性SVM模型g(x)=sign(f(x))=sign(wx+b)g(x)=sign(f(x))=sign(w·x+b)

SVM算法的对偶形式

SVM的问题为:
minw,bL(w,b,x,y)=12w2+Ci=1Nξi\underset{w,b}{\min}L(w,b,x,y)=\frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i使得:
yi(wxi+b)1ξiy_i(w·x_i+b)\geqslant1-\xi_i其中:ξi0\xi_i\geqslant0。那么原始问题的拉格朗日函数可以表达为(这里的α\alpha不是学习率):
L(w,b,ξ,α,β)=12w2+Ci=1Nξii=1Nαi[yi(wxi+b)1+ξi]i=1NβiξiL(w,b,\xi,\alpha,\beta)=\frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i-\sum_{i=1}^N\alpha_i[y_i(w·x_i+b)-1+\xi_i]-\sum_{i=1}^N\beta_i\xi_i为求解L的极小值,需要对α,β,ξ\alpha,\beta,\xi求偏倒,并令为0。就有:
wL=wi=1Nαiyixi=0bL=i=1Nαiyi=0ξiL=Cαiβi\nabla_wL=w-\sum_{i=1}^N\alpha_iy_ix_i=0\\\nabla_bL=-\sum_{i=1}^N\alpha_iy_i=0\\\nabla_{\xi_i}L=C-\alpha_i-\beta_i解得:
w=i=1Nαiyixii=1Nαiyi=0w=\sum_{i=1}^N\alpha_iy_ix_i\\\sum_{i=1}^N\alpha_iy_i=0以及对j=1,...,Nj=1,...,N都有:
αi+βi=C\alpha_i+\beta_i=C带入计算可以得到拉格朗日函数为:
L(w,b,ξ,α,β)=12i=1Nj=1Nαiαjyiyj(xixj)+i=1NαiL(w,b,\xi,\alpha,\beta)=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i·x_j)+\sum_{i=1}^N\alpha_i所以原始函数的对偶问题就是求上式的最大值:
maxα(12i=1Nj=1Nαiαjyiyj(xixj)+i=1Nαi)\underset{\alpha}{max}(-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i·x_j)+\sum_{i=1}^N\alpha_i)约束条件为
i=1Nαiyi=0\sum_{i=1}^N\alpha_iy_i=0以及对j=1,...,Nj=1,...,N都有:
αi0βi0αi+βi=C\alpha_i\geqslant0\\\beta_i\geqslant0\\\alpha_i+\beta_i=C由于和是常数,所以上述约束条件可以简化为:
0αiC0\leqslant\alpha_i\leqslant C假设对偶形式的解为:α=(α1,...,αN)T\alpha^*=(\alpha_1,...,\alpha_N)^T,那么:
w=i=1Nαiyixib=yji=1Nαiyi(xixj)w^*=\sum_{i=1}^N\alpha^*_iy_ix_i\\b^*=y_j-\sum_{i=1}^N\alpha^*_iy_i(x_i·x_j)其中bb^*中出现的jj是满足0αiC0\leqslant\alpha_i\leqslant C的下标。

相关文章: