支持向量机原理(Support Vector Machine)

原博客:https://daya-jin.github.io/2018/10/17/SupportVectorMachine/

模型概述

首先回顾一下Logistic Regression,对于一组数据与标签,Logistic Regression的任务是要找到一组参数使得,对于的样本判定为负样本,而对于的样本判定为正样本,其是一个线性分类器。问题在于,如果有一个理想数据集线性可分,那么模型会因为参数的不同而具有不同的决策边界,那么在这些决策边界中如何判定孰优孰劣?

(不支持矢量图,请移步原博客查看)

对于Logistic Regression这种概率模型而言,在给定一个确定的threshold之后,就可以画出其决策边界,空间中的样本点离决策边界越远,说明模型对该样本的判定可信度越高。那么,在若干决策边界中,只需要找到一个决策边界,使得模型对两个类别的判定可信度均最高即可获得一个最优分类器。由此引出支持向量机(Support Vector Machine):

数据集,标签,为了实现分类的目的,需要找到一组参数满足,同时还需要满足中的各样本点离决策边界的距离最远。

SVM模型对未知样本的预测计算如下:

换句话说,SVM模型的决策边界实际上是由两条直线决定的:

在训练数据集中,满足以上直线方程的样本点就被称为支持向量(support vector)。根据平行直线距离公式

得这两条直线之间的距离为:

[图片上传失败...(image-4d76c8-1558875604764)]

对分类任务而言,还需要满足分类的准确性,假设数据是线性可分的,则有:

所以SVM可以用如下表达式来描述:

上式等价于:

容易看出SVM自带参数正则化。

接下来看一下SVM的损失函数,SVM只关心那些被误分的点,而对于正确分类的点是不计入loss的,由几何知识易得,模型对被正确分类的点的输出总是满足:,所以SVM的损失函数可以写成:

以上是数据可分的情况,那么如果数据不可分呢?那么允许某些预测样本不一定要严格在直线外侧,允许某些样本处于直线的内侧,那么这些被“容忍”的样本就不满足了,为了量化这些被“容忍”的样本偏离正轨的程度,为每一个样本引入一个松弛变量(slack variables),这些样本需要满足的条件就变为下式:

很显然,并且该变量体现了模型允许样本越界的程度。那么自然而然地会想到这个越界程度不能是无限制的,所以还要对该变量进行限制,因此SVM问题就变成:

\begin{aligned} \theta^{*}=\arg\min\limits_{\theta} \ \frac{1}{2}||\theta||_{2}+C\sum_{i=1}^{m}\xi_{i}, \qquad s.t.& \ y^{(i)}(x^{(i)}\theta^{T}+\theta_{0})\ge1-\xi_{i},i=1,...m \\ & \ \xi_{i}\ge0,i=1,...m \\ \end{aligned}

其中为样本越界的代价系数,其值越大,对越界的惩罚就越大。

最优解

如果我们有如下优化问题:

那么可以使用拉格朗日数乘法来得到一个拉格朗日函数:

其中。现考虑针对参数最大化该函数:

注意到,,所以在满足原问题约束条件的情况下,有:

所以原优化问题可以写成:

在解优化问题时,如果目标函数是凸函数,那么就可以很容易得到一个全局最优解。拉格朗日问题还有一个对偶问题:

原问题与对偶问题同解的充要条件为KKT条件:

SVM问题是一个带线性不等式约束的最优化问题,可以使用拉格朗日数乘法的对偶问题来解:

\begin{aligned} \lambda^{*},\theta^{*}&=\arg\max\limits_{\lambda}\min\limits_{\theta}L(\theta,\lambda) \\&=\arg\max\limits_{\lambda}\min\limits_{\theta}\frac{1}{2}||\theta||_{2}^{2}-\sum_{i=1}^{m}\lambda_{i}[y^{i}\cdot{}(x^{i}\theta^{T}+\theta_{0})-1], \qquad s.t. \ \lambda_{i}\ge0 \end{aligned}

令得:

\begin{aligned} \frac{\partial{L}}{\partial{\theta}}&=\theta-\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i}=0 \\ \frac{\partial{L}}{\partial{\theta_{0}}}&=-\sum_{i=1}^{m}\lambda_{i}y^{i}=0 \\ \theta^{*}&=\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i} \end{aligned}

将拉格朗日函数展开并代入最优:

\begin{aligned} L(\theta^{*},\lambda)&=\frac{1}{2}||\theta^{*}||_{2}-\sum_{i=1}^{m}\lambda_{i}[y^{i}\cdot{}(x^{i}{\theta^{*}}^{T}+\theta_{0})-1] \\ &=\frac{1}{2}||\theta^{*}||_{2}-(\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i})\cdot{\theta^{*}}^{T}-(\sum_{i=1}^{m}\lambda_{i}y^{i})\cdot\theta_{0}+\sum_{i=1}^{m}\lambda_{i} \\ &=\frac{1}{2}\theta^{*}{\theta^{*}}^{T}-\theta^{*}{\theta^{*}}^{T}+\sum_{i=1}^{m}\lambda_{i} \\ &=\sum_{i=1}^{m}\lambda_{i}-\frac{1}{2}\theta^{*}{\theta^{*}}^{T} \\ &=\sum_{i=1}^{m}\lambda_{i}-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}y^{i}y^{j}x^{i}{x^{j}}^{T} \end{aligned}

最大化上式即可求出最优化参数:

最优的SVM模型输出为:

\begin{aligned} \hat{y}&= \left\{ \begin{aligned} &+1, &\hat{x}(\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}x^{i})^{T}\ge+1\\ &-1, &\hat{x}(\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}x^{i})^{T}\le-1 \\ \end{aligned} \right. \\ &= \left\{ \begin{aligned} &+1, &\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}\langle\hat{x},x^{i}\rangle\ge+1\\ &-1, &\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}\langle\hat{x},x^{i}\rangle\le+1\\ \end{aligned} \right. \end{aligned}

其中表示待预测的样本,表示模型对该样本的预测值。回顾一下拉格朗日函数:

注意到,如果某样本不是支持向量,那么有,为了最大化拉格朗日函数,必定有,即非支持向量对应的均为0,从理论上说明了SVM的决策边界只跟支持向量有关。

核函数

以上讨论都是基于数据集线性可分的假设下,如果数据集在原始维度下线性不可分怎么办?最简单的办法就是为数据集增加高维度特征。假设现在有一个二维数据集:

此数据集二维平面上线性不可分,但是在经一个变换函数作用下生成的新数据集是线性可分的:

对于升维后的新数据集,SVM所做的计算变成了:

\begin{aligned} pred&=\sum_{i=1}^{m}\lambda_{i}y^{(i)}\langle\phi(\hat{x}),\phi(x^{(i)})\rangle \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}\langle(\hat{x}_{1}^2,\sqrt{2}\hat{x}_{1}\hat{x}_{2},\hat{x}_{2}^2),({x_{1}^{(i)}}^2,\sqrt{2}x_{1}^{(i)}x_{2}^{(i)},{x_{2}^{(i)}}^2)\rangle \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}(\hat{x}_{1}^{2}{x_{1}^{(i)}}^{2}+2\hat{x}_{1}x_{1}^{(i)}\hat{x}_{2}x_{2}^{(i)}+\hat{x}_{2}^{2}{x_{2}^{(i)}}^{2}) \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}(\hat{x}_{1}x_{1}^{(i)}+\hat{x}_{2}x_{2}^{(i)})^{2} \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}\langle(\hat{x}_{1},\hat{x}_{2}),(x_{1}^{(1)},x_{2}^{(2)})\rangle^{2} \\ &=\sum_{i=1}^{m}\lambda_{i}y^{(i)}\langle\hat{x},x^{(i)}\rangle^{2} \end{aligned}

通过上面的变换,不难看出,在将数据集升维之后,SVM训练、预测时的计算其实就可以转化为原始特征的计算,那么何必要对数据集进行升维操作呢?

以上述数据集为例,选取一个函数,用它来代替SVM的内积计算:

这样一来,这个SVM模型的训练、预测过程就等同于在高维空间进行,即达到了线性划分数据集的目的,也没有增加复杂的运算,其中被称为核函数(kernel function),这种方法被称为核技巧(kernel trick)。

现实任务中,一般是不知道要对数据应用怎样的升维函数才能使得数据集线性可分,那么自然就难以求得计算高维空间的核函数,甚至不知道某函数是否能被用作核函数。

简单来说,一个函数要能被当做核函数,需要满足Mercer's condition,即对称函数的核矩阵必须满足恒为半正定矩阵。

常用的核函数有如下几种:

核函数 表达式 说明
linear 计算原始空间的内积
polynomial 计算d维空间的内积
Radial Basis Function -
sigmoid -

软间隔SVM

注意:软间隔相当于SVM的正则化

到目前为止,以上讨论都是假设SVM在原始空间或者高维空间将数据集完全线性分割开来,但是将数据完美的线性分开是否会产生或拟合?由此引出软间隔SVM。先前讨论的SVM约束条件为:

这表示的是所有样本都在该类对应的支持向量的外侧,那么,现在允许一定数量的样本不在外侧,而在内侧,需要满足的条件变为:

其中为松弛变量。显然,这个变量不能过大,否则约束就无意义了,需要对它进行限制,将其加入到最小化目标函数中,原SVM的优化问题就变成了:

其中为权衡系数,其值越大对松弛变量的约束越大。此时的拉格朗日函数变为:

\begin{aligned} \max\limits_{\lambda,\gamma}\ \min\limits_{\theta,\xi} L(\theta,\xi,\lambda,\gamma)&=\frac{1}{2}||\theta||_{2}^{2}+C\sum\limits_{i=1}^{m}\xi_{i}-\sum_{i=1}^{m}\lambda_{i}(y^{i}\cdot{}x^{i}\theta^{T}+y^{i}\theta_{0}-1+\xi_{i})-\sum_{i=1}^{m}\gamma_{i}\xi_{i} \end{aligned}

令得:

将最优带入得:

\begin{aligned} L(\lambda,\xi)&=\frac{1}{2}||\theta^{*}||_{2}^{2}+\lambda_{i}\sum_{i=1}^{m}\xi_{i}+\gamma_{i}\sum_{i=1}^{m}\xi_{i}-\sum_{i=1}^{m}\lambda_{i}y^{i}x^{x}{\theta^{*}}^{T}+\sum_{i=1}^{m}\lambda_{i}-\sum_{i=1}^{m}\lambda_{i}\xi_{i}-\sum_{i=1}^{m}\gamma_{i}\xi_{i} \\ &=\frac{1}{2}\theta^{*}{\theta^{*}}^{T}-(\sum_{i=1}^{m}\lambda_{i}y^{i}x^{i})\cdot{\theta^{*}}^{T}+\sum_{i=1}^{m}\lambda_{i} \\ &=\sum_{i=1}^{m}\lambda_{i}-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}y^{i}y^{j}x^{i}{x^{j}}^{T} \end{aligned}

可以看到需要最大化的目标函数是一样的,只不过多了一个约束项,完整写出来如下所示:

\begin{aligned} \max\limits_{\lambda}\ L(\lambda)&=\sum_{i=1}^{m}\lambda_{i}-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}y^{i}y^{j}x^{i}{x^{j}}^{T} \\ s.t. \ & 0\le\lambda_{i}\le{C}, \ \sum\limits\lambda_{i}y^{i}=0 \end{aligned}

SVM的具体优化算法请参阅SMO一章,实现指导也在那一章。这里只放出完整代码:完整代码

SVR

(待补充)

SVM V.S. LR

SVM与LR是经常被用来比较的一对模型。

首先,从数学形式上来作对比,然后再去探究背后的根源。对于机器学习模型而言,最核心的部分就是其损失函数或目标函数,该函数决定了算法的目的与优化方法。

LR的损失函数为:

SVM的损失函数为:

不难发现,SVM中的项,在时为0,即SVM实际上对正确分类的样本是不计入loss的。而反观LR,不难发现LR在数学形式上的loss是无法取得值的,这是因为sigmoid函数的性质就不允许模型精确地输出值,理论上只有在无穷远处才能取得。可以假设一个存在离群点的场景,若SVM对该离群点已能正确分类,那么在训练时就不会再将该点考虑进去,而LR则会收该离群点的影响。所以可以看出,SVM对离群点的抗性要高于LR。而且,LR的决策边界会受两个类别样本分布的影响,而SVM则不会,其决策边界只受支持向量的影响。

同时还在损失函数中发现,SVM自带L2正则项,LR则不带。

然后,两者的出发点就不同。LR是从概率的思想出发,使用一个线性回归去拟合正反事件的对数机率;而SVM的思想是启发性的,直接学习一个最大间隔超平面去将两个类别分开。

然后再看两者的输出函数,LR的预测函数:

SVM的预测函数:

\begin{aligned} \hat{y}_{SVM}&= \left\{ \begin{aligned} &+1, &\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}\langle\hat{x},x^{i}\rangle\ge+1\\ &-1, &\sum_{i=1}^{m}\lambda_{i}^{*}y^{i}\langle\hat{x},x^{i}\rangle\le+1\\ \end{aligned} \right. \end{aligned}

由于SMV的预测函数中存在两训练样本的内积项,所以核技巧能很自然而然的与SVM相结合;除了这个原因之外,SVM中的拉格朗日参数,非支持向量的该参数值是为的,所以在计算决策边界时的计算量并不高,这也是核技巧常用于SVM的原因之一。

最后,两者的优化复杂度不一样,LR由于模型本身简单,可以使用迭代的梯度下降法进行优化;而SVM目前成熟的优化方法就是SMO算法。另外,由于SVM使用了“距离”的概念,所以对数据做归一化处理是有好处的,还由于维度诅咒的原因,在高维空间下距离的概念会变得十分抽象,所以在高维情况下,会更倾向于实用LR。

你可能感兴趣的:(支持向量机原理(Support Vector Machine))