SVM - 数学原理(二)

317 阅读19分钟

根据菜菜的课程进行整理,方便记忆理解

代码位置如下:

sklearn.svm.SVC

class sklearn.svm.SVC (C=1.0,kernel=’rbf’, degree=3, gamma=’auto_deprecated’, coef0=0.0, shrinking=True,probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1,decision_function_shape=’ovr’, random_state=None)

线性SVM用于分类的原理

线性SVM的损失函数详解

要理解SVM的损失函数,我们先来定义决策边界。假设现在数据中总计有N个训练样本,每个训练样本i可以被表示为(xi,yi)(i=1,2,3,...,N)(x_i,y_i)(i = 1,2,3,...,N),其中xix_i(x1i,x2i,...xni)T(x_{1i},x_{2i},...x_{ni})^T,这样的一个特征向量,每个样本总共含有n个特征。二分类标签yiy_i的取值是{-1, 1}。

如果n等于2,则有i=(x1i,x2i,yi)Ti = (x_{1i},x_{2i},y_i)^T,分别由我们的特征向量和标签组成。此时我们可以在二维平面上,以x2x_2为横坐标, x1x_1为纵坐标, y为颜色,来可视化我们所有的N个样本:

image.png

我们让所有紫色点的标签为1,红色点的标签为-1。我们要在这个数据集上寻找一个决策边界,在二维平面上,决策边界(超平面)就是一条直线。二维平面上的任意一条线可以被表示为:

image.png

我们将此表达式变换一下:

image.png

其中[a, -1]就是我们的参数向量W,xW,x 就是我们的特征向量, b是我们的截距。注意,这个表达式长得非常像我们线性回归的公式:

image.png

  • 线性回归中等号的一边是标签,回归过后会拟合出一个标签
  • 决策边界的表达式中却没有标签的存在,全部是由参数,特征和截距组成的一个式子,等号的一边是0。

在一组数据下,给定固定的W和b,这个式子就可以是一条固定直线,在W和b不确定的状况下,这个表达式WTx+b=0W^Tx + b = 0就可以代表平面上的任意一条直线。如果在W和b固定时,给定一个唯一的x的取值,这个表达式就可以表示一个固定的点。在SVM中,我们就使用这个表达式来表示我们的决策边界。我们的目标是求解能够让边际最大化的决策边界,所以我们要求解参数向量w和截距b。

如果在决策边界上任意取两个点xax_axbx_b ,并带入决策边界的表达式,则有:

image.png

将两式相减,可以得到:

image.png

一个列向量的转置乘以另一个列向量,可以获得两个向量的点积(dot product),表示为<w(xaxb)><w · (x_a - x_b)>。两个向量的点击为0表示两个向量的方向式互相垂直的。xax_axbx_b是一条直线上的两个点,相减后的得到的向量方向是由xax_a指向xbx_b,所以xaxbx_a - x_b的方向是平行于他们所在的直线——我们的决策边界的。而w与xaxbx_a - x_b相互垂直,所以参数向量w的方向必然是垂直于我们的决策边界

image.png

此时,我们有了我们的决策边界。任意一个紫色的点xpx_p就可以被表示为:

image.png

由于紫色的点所代表的标签y是1,所以我们规定,p>0。同样的,对于任意一个红色的点xrx_r而言,我们可以将它表示为:

image.png

由于红色点所表示的标签y是-1,所以我们规定,r<0。由此,如果我们有新的测试数据xtx_t,则的xtx_t标签就可以根据以下式子来判定:

image.png

核心误区:p和r的符号

注意,在这里,p和r的符号是我们人为规定的。在一些博客或教材中,会认为p和r的符号是由原本的决策边界上下移动得到。这是一种误解。

如果k和k'是由原本的决策边界平移得到的话,紫色的点在决策边界上方, wx+b=0wx + b = 0应该要向上平移,直线向上平移的话是增加截距,也就是说应该写作 wx+b+一个整数=0wx + b + 一个整数= 0,那p在等号的右边,怎么可能是一个大于0的数呢?同理,向下平移的话应该是截距减小,所以r也不可能是一个小于0的数。所以p和r的符号,不完全是平移的结果。

有人说,“直线以上的点带入直线为正,直线以下的点带入直线为负”是直线的性质,这又是另一种误解。假设我们有穿过圆点的直线y=xy = x,我们取点(x,y) = (0,1)这个在直线上的点为例,如果直线的表达式写作yx=0y - x = 0,则点(0,1)带入后为正1,如果我们将直线的表达式写作xy=0x - y = 0,则带入(0,1)后结果为-1。所以,一个点在直线的上方,究竟会返回什么样的符号,是跟直线的表达式的写法有关的,不是直线上的点都为正,直线下的点都为负。

我们规定了p和r的符号与标签的符号一致,所以有人会说, p和r的符号,由所代表的点的标签的符号决定。这不是完全错误的,但这种说法无法解释,为什么我们就可以这样规定。并且,标签可以不是{-1,1},可以是{0, 1},可以是{1,2},两个标签之间并不需要是彼此的负数,标签的取值其实也是我们规定的。

那r和p的符号,到底是依据什么来定的呢?数学中很多过程,都是可以取巧的,来看以下过程。记得我们的决策边界如果写成矩阵,可以表示为:

image.png

紫色点xpx_p毫无疑问是在决策边界的上方的,此时我将决策边界向上移动,形成一条过xpx_p的直线。根据我们平移的规则,直线向上平移,是在截距后加一个正数,则等号的右边是一个负数,假设这个数等于-3,则有: A image.png

可以注意到,我们的参数向量由[a,-1]变成了[-a,1], b变成了-b,但参数向量依旧可以被表示成w,只是它是原来的负数了,截距依旧可以被表示成b,只是如果它原来是正,它现在就是负数了,如果它原本就是负数,那它现在就是正数了。在这个调整中,我们通过将向上平移时产生的负号放入了参数向量和截距当中,这不影响我们求解,只不过我们求解出的参数向量和截距的符号变化了,但决策边界本身没有变化。所以我们依然可以使用原来的字母来表示这些更新后的参数向量和截距。通过这种方法,我们wx+b=pwx + b = p让中的p大于0。我们让p大于0的目的,是为了它的符号能够与我们的标签的符号一致,都是为了后续计算和推导的简便。

为了推导和计算的简便,我们规定:

标签是{-1,1}

  • 决策边界以上的点,标签都为正,并且通过调整w和b的符号,让这个点在wx+bwx + b上得出的结果为正。
  • 决策边界以下的点,标签都为负,并且通过调整w和b的符号,让这个点在wx+bwx + b上得出的结果为负。
  • 结论:决策边界以上的点都为正,以下的点都为负,是我们为了计算简便,而人为规定的。这种规定,不会影响对参数向量w和截距b的求解。

有了这个理解,剩下的推导就简单多了。我们之前说过,决策边界的两边要有两个超平面,这两个超平面在二维空间中就是两条平行线(就是我们的虚线超平面),而他们之间的距离就是我们的边际。而决策边界位于这两条线的中间,所以这两条平行线必然是对称的。我们另这两条平行线被表示为:

image.png

两个表达式同时除以k,则可以得到:

image.png

这就是我们平行于决策边界的两条线的表达式,表达式两边的1和-1分别表示了两条平行于决策边界的虚线到决策边界的相对距离。此时,我们可以让这两条线分别过两类数据中距离我们的决策边界最近的点,这些点就被称为"支持向量",而决策边界永远在这两条线的中间,所以可以被调整。我们令紫色类的点为xpx_p,红色类的点为xrx_r,则我们可以得到:

image.png

两个式子相减,则有:

image.png

如下图所示,(xpxr)(x_p - x_r) 可表示为两点之间的连线,而我们的边际d是平行于w的,所以我们现在,相当于是得到了三角型中的斜边,并且知道一条直角边的方向。在线性代数中,我们有如下数学性质:

线性代数中模长的运用

  • 向量b除以自身的模长||b||可以得到b方向上的单位向量。
  • 向量a乘以向量b方向上的单位向量,可以得到向量a在向量b方向上的投影的长度。

所以,我们另上述式子两边同时除以b||b||,则可以得到:

image.png

image.png

还记得我们想求什么吗?最大边界所对应的决策边界,那问题就简单了,要最大化d,就求解w的最小值。极值问题可以相互转化,我们可以把w求解的最小值转化为,求解以下函数的最小值:

image.png

只所以要在模长上加上平方,是因为模长的本质是一个距离,所以它是一个带根号的存在,我们对它取平方,是为了消除根号(其实模长的本质是向量w的l2范式,还记得l2范式公式如何写的小伙伴必定豁然开朗)。

我们的两条虚线表示的超平面,是数据边缘所在的点。所以对于任意样本i,我们可以把决策函数写作:

image.png

整理一下,我们可以把两个式子整合成:

image.png

在一部分教材中,这个式子被称为“函数间隔”。将函数间隔作为条件附加到我们的f(w)f(w)上,我们就得到了SVM的损失函数最初形态:

image.png

到这里,我们就完成了对SVM第一层理解的第一部分:线性SVM做二分类的损失函数。

函数间隔与几何间隔

重要定义:函数间隔与几何间隔

每一本机器学习的书或每一篇博客都可能有不同的原理讲解思路,在许多教材中,推导损失函数的过程与我们现在所说的不同。许多教材会先定义如下概念来辅助讲解:

对于给定的数据集T和超平面(w,b),定义超平面(w,b)关于样本点(xi,yi)(x_i,y_i)的函数间隔为:

image.png

这其实是我们的虚线超平面的表达式整理过后得到的式子。

  • 函数间隔可以表示分类预测的正确性以及确信度
  • 再在这个函数间隔的基础上除以的模长来得到几何间隔:

image.png

  • 几何间隔的本质其实是点xix_i到超平面(w,b),即到我们的决策边界的带符号的距离(signed distance)。

为什么几何间隔能够表示点到决策边界的距离?如果理解点到直线的距离公式,就可以很简单地理解这个式子。对于平面上的一个点(x0,y0)(x_0,y_0)和一条直线ax+by+c=0ax + by + c = 0,我们可以推导出点到直线的距离为:

image.png

其中[a,b]就是直线的参数向量w,而a2+b2\sqrt{a^2 + b^2}其实就是参数向量w的模长w||w||。而我们的几何间隔中, yiy_i的取值是{-1, 1},所以并不影响整个表达式的大小,只影响方向。而wx+b=0wx +b = 0是决策边界,所以直线带入xix_i后再除以参数向量的模长,就可以得到点xix_i到决策边界的距离。

点到之间的距离的公式推导

现在有直线L0:ax+by+c=0L_0:ax + by + c = 0,在直线上任意处选取点M(x0,y0)(x_0,y_0),过点M画垂直于直线L0L_0的线L1L_1,两条线的交点为N(xn,yn)(x_n,y_n)。现在MN线段的长度就是点M到直线L0L_0的距离,在求解距离过程中,M点的坐标和直线L0L_0都是已知的,未知数是交点的坐标N(xn,yn)(x_n,y_n),于是我们将求解距离问题转化为求解交点的问题。

image.png

首先将L1L_1稍作变化,写作y=abxcby = -\frac{a}{b}x - \frac{c}{b}。开始证明:

image.png

image.png

求得点N的坐标后,线段MN的长度,即M到N的距离则可表示为:

image.png

证明完毕。

线性SVM的拉格朗日对偶函数和决策函数

有了我们的损失函数过后,我们就需要对损失函数进行求解。这个求解过程异常复杂,涉及到的数学的难度不是推导损失函数的部分可比。并且,在sklearn当中,我们作为使用者完全无法干涉这个求解的过程。因此作为使用sklearn的人,这部分属于进阶内容。

我们之前得到了线性SVM损失函数的最初形态:

image.png

这个损失函数分为两部分:需要最小化的函数,以及参数求解后必须满足的约束条件。这是一个最优化问题

将损失函数从最初形态转换为拉格朗日乘数形态
为什么要进行转换

我们的目标是求解让损失函数最小化的w,但其实很容易看得出来,如果w||w||为0, f(w)f(w)必然最小了。但是,w=0||w|| = 0其实是一个无效的值,原因有简单:首先,我们的决策边界是wx+b=0wx + b = 0,如果w为0,则这个向量里包含的所有元素都为0,那就有b = 0这个唯一值。然而,如果b和都为0,决策边界就不再是一条直线了,函数间隔yi(wx+b)y_i(wx + b)就会为0,条件中的yi(wxi+b)1y_i(wx_i + b) \geq 1就不可能实现,所以w不可以是一个0向量。可见,单纯f(w)=w22f(w) = \frac{||w||^2}{2}让为0,是不能求解出合理的w的,我们希望能够找出一种方式,能够让我们的条件yi(wxi+b)1y_i(wx_i + b) \geq 1 在计算中也被纳入考虑,一种业界认可的方法是使用拉格朗日乘数法(standard Lagrange multiplier method)

为什么可以进行转换

我们的损失函数是二次的(quadratic),并且我们损失函数中的约束条件在参数w和b下是线性的,求解这样的损失函数被称为凸优化问题(convex optimization problem)。拉格朗日乘数法正好可以用来解决凸优化问题,这种方法也是业界常用的,用来解决带约束条件,尤其是带有不等式的约束条件的函数的数学方法。首先第一步,我们需要使用拉格朗日乘数来将损失函数改写为考虑了约束条件的形式:

image.png

这是一个非常聪明而且巧妙的表达式,它被称为拉格朗日函数,其中就叫做拉格朗日乘数。此时此刻,我们要求解的就不只有参数向量w和截距b了,我们也要求解拉格朗日乘数α\alpha,而我们的xix_iyiy_i都是我们已知的特征矩阵和标签。

怎样进行转换

拉格朗日函数也分为两部分。第一部分和我们原始的损失函数一样,第二部分呈现了我们带有不等式的约束条件。我们希望, L(w,b,α)L(w,b,\alpha)不仅能够代表我们原有的损失函数f(w)f(w)和约束条件,还能够表示我们想要最小化损失函数来求解w和b的意图,所以我们要先以α\alpha为参数,求解L(w,b,α)L(w,b,\alpha)的最大值,再以w和b为参数,求解L(w,b,α)L(w,b,\alpha)的最小值。因此,我们的目标可以写作:

image.png

怎么理解这个式子呢?首先,我们第一步先执行max,即最大化L(w,b,α)L(w,b,\alpha),那就有两种情况:

  • yi(wxi+b)>1y_i(wx_i + b) > 1,函数的第二部分i=1N(yi(wxi+b)1)\sum_{i=1}^{N}(y_i(wx_i + b) - 1)就一定为正,式子12w2\frac{1}{2}||w||^2就要减去一个正数,此时若要最大化L(w,b,α)L(w,b,\alpha),则α\alpha必须取到0。
  • yi(wxi+b)<1y_i(wx_i + b) < 1,函数的第二部分i=1N(yi(wxi+b)1)\sum_{i=1}^{N}(y_i(wx_i + b) - 1)就一定为负,式子12w2\frac{1}{2}||w||^2就要减去一个负数,相当于加上一个正数,此时若要最大化L(w,b,α)L(w,b,\alpha),则α\alpha必须取到正无穷。

若把函数第二部分当作一个惩罚项来看待,则yi(wxi+b)y_i(wx_i + b)大于1时函数没有受到惩罚,而yi(wxi+b)y_i(wx_i + b)小于1时函数受到了极致的惩罚,即加上了一个正无穷项,函数整体永远不可能取到最小值。所以第二步,我们执行min的命令,求解函数整体的最小值,我们就永远不能让α\alpha必须取到正无穷的状况出现,即是说永远不让yi(wxi+b)<1y_i(wx_i + b) < 1的状况出现,从而实现了求解最小值的同时让约束条件被满足

现在, L(w,b,α)L(w,b,\alpha)就是我们新的损失函数了,我们的目标是要通过先最大化,在最小化它来求解参数向量w和截距b的值。

将拉格朗日函数转换为拉格朗日对偶函数
为什么要进行转换

要求极值,最简单的方法还是对参数求导后让一阶导数等于0。我们先来试试看对拉格朗日函数求极值,在这里我们对参数向量w和截距b分别求偏导并且让他们等于0。这个求导过程比较简单:

image.png

由于两个求偏导结果中都带有未知的拉格朗日乘数αi\alpha_i,因此我们还是无法求解出w和b,我们必须想出一种方法来求解拉格朗日乘数αi\alpha_i。幸运地是,拉格朗日函数可以被转换成一种只带有αi\alpha_i,而不带有w和b的形式,这种形式被称为拉格朗日对偶函数。在对偶函数下,我们就可以求解出拉格朗日乘数αi\alpha_i,然后带入到上面推导出的(1)和(2)式中来求解w和b。

为什么能够进行转换

对于任何一个拉格朗日函数L(x,α)=f(x)+i=1qαihi(x)L(x,\alpha) = f(x) + \sum_{i=1}^{q}\alpha_ih_i(x),都存在一个与它对应的对偶函数g(α)g(\alpha),只带有拉格朗日乘数α\alpha作为唯一的参数。如果L(x,α)L(x,\alpha)的最优解存在并可以表示为minxL(x,α)\underset {x}{min}L(x,\alpha),并且对偶函数的最优解也存在,并可以表示为minαg(α)\underset {\alpha}{min}g(\alpha),则我们可以定义对偶差异(dual gap),即拉格朗日函数的最优解与其对偶函数的最优解之间的差值:

image.png

如果Δ=0\Delta = 0,则L(x,α)L(x,\alpha)称与其对偶函数之间存在强对偶关系(strong duality property),此时我们就可以通过求解其对偶函数的最优解来替代求解原始函数的最优解。那强对偶关系什么时候存在呢?则这个拉格朗日函数必须满足KKT(Karush-Kuhn-Tucker)条件:

image.png

这里的条件其实都比较好理解

  • 所有参数的一阶导数必须为0
  • 约束条件中的函数本身需要小于等于0
  • 拉格朗日乘数需要大于等于0
  • 约束条件乘以拉格朗日乘数必须等于0,即不同的取值下,两者之中至少有一个为0。

当所有限制都被满足,则拉格朗日函数L(x,α) L(x,\alpha)的最优解与其对偶函数的最优解相等,我们就可以将原始的最优化问题转换成为对偶函数的最优化问题。而不难注意到,对于我们的损失函数L(w,b,α)L(w,b,\alpha)而言,KKT条件都是可以操作的。如果我们能够人为让KKT条件全部成立,我们就可以求解出L(w,b,α)L(w,b,\alpha)的对偶函数来解出α\alpha

之前我们已经让拉格朗日函数上对参数w和b的求导为0,得到了式子:

image.png

并且在我们的函数中,我们通过先求解最大值再求解最小值的方法使得函数天然满足:

image.png

所以接下来,我们只需要再满足一个条件:

image.png

这个条件其实很容易满足,能够让yi(wxi+b)1=0y_i(wx_i + b) - 1 = 0的就是落在虚线的超平面上的样本点,即我们的支持向量。所有不是支持向量的样本点则必须满足αi=0\alpha_i = 0。满足这个式子说明了,我们求解的参数w和b以及求解的超平面的存在,只与支持向量相关,与其他样本点都无关。现在KKT的五个条件都得到了满足,我们就可以使用L(w,b,α)L(w,b,\alpha)的对偶函数来求解α\alpha了。

怎样进行转换

首先让拉格朗日函数对参数和求导后的结果为0,本质是在探索拉格朗日函数的最小值。然后

image.png

image.png

函数LdL_d就是我们的对偶函数。对所有存在对偶函数的拉格朗日函数我们有对偶差异如下表示:

image.png

则对于我们的L(w,b,α)L(w,b,\alpha)LdL_d,我们则有:

image.png

还记得我们推导的第一步是什么吗?是对L(w,b,α)L(w,b,\alpha)求偏导并让偏导数都为0,所以我们求解对偶函数的过程其实是在求解L(w,b,α)L(w,b,\alpha)的最小值,所以我们又可以把公式写成:

image.png

这就是众多博客和教材上写的,对偶函数与原始函数的转化过程的由来。如此,我们只需要求解对偶函数的最大值,就可以求出α\alpha了。最终,我们的目标函数变化为:

image.png

求解拉格朗日对偶函数极其后续过程

到了这一步,我们就需要使用梯度下降,SMO或者二次规划(QP,quadratic programming)来求解我们的α\alpha,数学的难度又进一步上升。考虑到这一过程对数学的要求已经远远超出了我们需要的程度,更是远远超出我们在使用sklearn时需要掌握的程度,如何求解对偶函数中的在这里就不做讲解了。

但大家需要知道,一旦我们求得了α\alpha值,我们就可以使用求导后得到的(1)式求解w,并可以使用(1)式和决策边界的表达式结合,得到下面的式子来求解b:

image.png

当求得特征向量w和b,我们就得到了我们的决策边界的表达式,也就可以利用决策边界和其有关的超平面来进行分类了,我们的决策函数就可以被写作:

image.png

其中xtestx_test是任意测试样本, sign(h)sign(h)h>0h > 0时返回1, h < 0 时返回-1的符号函数。到这里,我们可以说我们完成了对SVM的第二层理解的大部分内容,我们了解了线性SVM的四种相关函数:损失函数的初始形态拉格朗日函数拉格朗日对偶函数以及最后的决策函数。熟练掌握以上的推导过程,对理解支持向量机会有极大的助益,也是对我们数学能力的一种完善。