支持向量机 SVM(非常详细) - 图1
SVM 是一个非常优雅的算法,具有完善的数学理论,虽然如今工业界用到的不多,但还是决定花点时间去写篇文章整理一下。

1. 支持向量

1.1 线性可分

首先我们先来了解下什么是线性可分。

支持向量机 SVM(非常详细) - 图2

在二维空间上,两类点被一条直线完全分开叫做线性可分。
严格的数学定义是:
支持向量机 SVM(非常详细) - 图3支持向量机 SVM(非常详细) - 图4 是 n 维欧氏空间中的两个点集。如果存在 n 维向量 w 和实数 b,使得所有属于 支持向量机 SVM(非常详细) - 图5 的点 支持向量机 SVM(非常详细) - 图6 都有 支持向量机 SVM(非常详细) - 图7 ,而对于所有属于 支持向量机 SVM(非常详细) - 图8 的点 支持向量机 SVM(非常详细) - 图9 则有 支持向量机 SVM(非常详细) - 图10 ,则我们称 支持向量机 SVM(非常详细) - 图11支持向量机 SVM(非常详细) - 图12 线性可分。

1.2 最大间隔超平面

从二维扩展到多维空间中时,将 支持向量机 SVM(非常详细) - 图13支持向量机 SVM(非常详细) - 图14 完全正确地划分开的 支持向量机 SVM(非常详细) - 图15 就成了一个超平面。
为了使这个超平面更具鲁棒性,我们会去找最佳超平面,以最大间隔把两类样本分开的超平面,也称之为最大间隔超平面。

  • 两类样本分别分割在该超平面的两侧;
  • 两侧距离超平面最近的样本点到超平面的距离被最大化了。

    1.3 支持向量

    支持向量机 SVM(非常详细) - 图16
    样本中距离超平面最近的一些点,这些点叫做支持向量。

    1.4 SVM 最优化问题

    SVM 想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面可以用下面这个线性方程来描述:
    支持向量机 SVM(非常详细) - 图17
    二维空间点 支持向量机 SVM(非常详细) - 图18 到直线 支持向量机 SVM(非常详细) - 图19 的距离公式是:
    支持向量机 SVM(非常详细) - 图20
    扩展到 n 维空间后,点 支持向量机 SVM(非常详细) - 图21 到直线 支持向量机 SVM(非常详细) - 图22 的距离为:
    支持向量机 SVM(非常详细) - 图23
    其中 支持向量机 SVM(非常详细) - 图24
    如图所示,根据支持向量的定义我们知道,支持向量到超平面的距离为 d,其他点到超平面的距离大于 d。
    支持向量机 SVM(非常详细) - 图25
    于是我们有这样的一个公式:
    支持向量机 SVM(非常详细) - 图26
    稍作转化可以得到:
    支持向量机 SVM(非常详细) - 图27
    支持向量机 SVM(非常详细) - 图28 是正数,我们暂且令它为 1(之所以令它等于 1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),故:
    支持向量机 SVM(非常详细) - 图29
    将两个方程合并,我们可以简写为:
    支持向量机 SVM(非常详细) - 图30
    至此我们就可以得到最大间隔超平面的上下两个超平面:
    支持向量机 SVM(非常详细) - 图31
    每个支持向量到超平面的距离可以写为:
    支持向量机 SVM(非常详细) - 图32
    由上述 支持向量机 SVM(非常详细) - 图33 可以得到 支持向量机 SVM(非常详细) - 图34 ,所以我们得到:
    支持向量机 SVM(非常详细) - 图35
    最大化这个距离:
    支持向量机 SVM(非常详细) - 图36
    这里乘上 2 倍也是为了后面推导,对目标函数没有影响。刚刚我们得到支持向量 支持向量机 SVM(非常详细) - 图37 ,所以我们得到:
    支持向量机 SVM(非常详细) - 图38
    再做一个转换:
    支持向量机 SVM(非常详细) - 图39
    为了方便计算(去除 支持向量机 SVM(非常详细) - 图40 的根号),我们有:
    支持向量机 SVM(非常详细) - 图41
    所以得到的最优化问题是:
    支持向量机 SVM(非常详细) - 图42

    2. 对偶问题

    2.1 拉格朗日乘数法

    2.1.1 等式约束优化问题
    本科高等数学学的拉格朗日程数法是等式约束优化问题:
    支持向量机 SVM(非常详细) - 图43
    我们令 支持向量机 SVM(非常详细) - 图44 ,函数 支持向量机 SVM(非常详细) - 图45 称为 Lagrange 函数,参数 支持向量机 SVM(非常详细) - 图46 称为 Lagrange 乘子没有非负要求
    利用必要条件找到可能的极值点:
    支持向量机 SVM(非常详细) - 图47
    具体是否为极值点需根据问题本身的具体情况检验。这个方程组称为等式约束的极值必要条件。
    等式约束下的 Lagrange 乘数法引入了 支持向量机 SVM(非常详细) - 图48 个 Lagrange 乘子,我们将 支持向量机 SVM(非常详细) - 图49支持向量机 SVM(非常详细) - 图50 一视同仁,把 支持向量机 SVM(非常详细) - 图51 也看作优化变量,共有 支持向量机 SVM(非常详细) - 图52 个优化变量。
    2.1.2 不等式约束优化问题
    而我们现在面对的是不等式优化问题,针对这种情况其主要思想是将不等式约束条件转变为等式约束条件,引入松弛变量,将松弛变量也是为优化变量。
    支持向量机 SVM(非常详细) - 图53
    以我们的例子为例:
    支持向量机 SVM(非常详细) - 图54
    我们引入松弛变量 支持向量机 SVM(非常详细) - 图55 得到 支持向量机 SVM(非常详细) - 图56 。这里加平方主要为了不再引入新的约束条件,如果只引入 支持向量机 SVM(非常详细) - 图57 那我们必须要保证 支持向量机 SVM(非常详细) - 图58 才能保证 支持向量机 SVM(非常详细) - 图59 ,这不符合我们的意愿。
    由此我们将不等式约束转化为了等式约束,并得到 Lagrange 函数:
    支持向量机 SVM(非常详细) - 图60
    由等式约束优化问题极值的必要条件对其求解,联立方程:
    支持向量机 SVM(非常详细) - 图61
    (为什么取 支持向量机 SVM(非常详细) - 图62 ,可以通过几何性质来解释,有兴趣的同学可以查下 KKT 的证明)。
    针对 支持向量机 SVM(非常详细) - 图63 我们有两种情况:
    情形一支持向量机 SVM(非常详细) - 图64
    由于 支持向量机 SVM(非常详细) - 图65 ,因此约束条件 支持向量机 SVM(非常详细) - 图66 不起作用,且 支持向量机 SVM(非常详细) - 图67
    情形二支持向量机 SVM(非常详细) - 图68
    此时 支持向量机 SVM(非常详细) - 图69支持向量机 SVM(非常详细) - 图70 ,可以理解为约束条件 支持向量机 SVM(非常详细) - 图71 起作用了,且 支持向量机 SVM(非常详细) - 图72
    综合可得: 支持向量机 SVM(非常详细) - 图73 ,且在约束条件起作用时 支持向量机 SVM(非常详细) - 图74 ;约束不起作用时 支持向量机 SVM(非常详细) - 图75
    由此方程组转换为:
    支持向量机 SVM(非常详细) - 图76
    以上便是不等式约束优化优化问题的 KKT(Karush-Kuhn-Tucker) 条件支持向量机 SVM(非常详细) - 图77 称为 KKT 乘子。
    这个式子告诉了我们什么事情呢?
    直观来讲就是,支持向量 支持向量机 SVM(非常详细) - 图78 ,所以 支持向量机 SVM(非常详细) - 图79 即可。而其他向量 支持向量机 SVM(非常详细) - 图80
    我们原本问题时要求: 支持向量机 SVM(非常详细) - 图81 ,即求 支持向量机 SVM(非常详细) - 图82
    支持向量机 SVM(非常详细) - 图83
    由于 支持向量机 SVM(非常详细) - 图84 ,故我们将问题转换为: 支持向量机 SVM(非常详细) - 图85
    支持向量机 SVM(非常详细) - 图86
    假设找到了最佳参数是的目标函数取得了最小值 p。即 支持向量机 SVM(非常详细) - 图87 。而根据 支持向量机 SVM(非常详细) - 图88 ,可知 支持向量机 SVM(非常详细) - 图89 ,因此 支持向量机 SVM(非常详细) - 图90 ,为了找到最优的参数 支持向量机 SVM(非常详细) - 图91 ,使得 支持向量机 SVM(非常详细) - 图92 接近 p,故问题转换为出 支持向量机 SVM(非常详细) - 图93
    故我们的最优化问题转换为:
    支持向量机 SVM(非常详细) - 图94
    出了上面的理解方式,我们还可以有另一种理解方式: 由于 支持向量机 SVM(非常详细) - 图95
    支持向量机 SVM(非常详细) - 图96
    所以 支持向量机 SVM(非常详细) - 图97 ,所以转化后的式子和原来的式子也是一样的。

    2.2 强对偶性

    对偶问题其实就是将:
    支持向量机 SVM(非常详细) - 图98
    变成了:
    支持向量机 SVM(非常详细) - 图99
    假设有个函数 支持向量机 SVM(非常详细) - 图100 我们有:
    支持向量机 SVM(非常详细) - 图101
    也就是说,最大的里面挑出来的最小的也要比最小的里面挑出来的最大的要大。这关系实际上就是弱对偶关系,而强对偶关系是当等号成立时,即:
    支持向量机 SVM(非常详细) - 图102
    如果 支持向量机 SVM(非常详细) - 图103 是凸优化问题,强对偶性成立。而我们之前求的 KKT 条件是强对偶性的充要条件

    3. SVM 优化

    我们已知 SVM 优化的主问题是:
    支持向量机 SVM(非常详细) - 图104
    那么求解线性可分的 SVM 的步骤为:
    步骤 1
    构造拉格朗日函数:
    支持向量机 SVM(非常详细) - 图105
    步骤 2
    利用强对偶性转化:
    支持向量机 SVM(非常详细) - 图106
    现对参数 w 和 b 求偏导数:
    支持向量机 SVM(非常详细) - 图107
    得到:
    支持向量机 SVM(非常详细) - 图108
    我们将这个结果带回到函数中可得:
    支持向量机 SVM(非常详细) - 图109
    也就是说:
    支持向量机 SVM(非常详细) - 图110
    步骤 3
    由步骤 2 得:
    支持向量机 SVM(非常详细) - 图111
    我们可以看出来这是一个二次规划问题,问题规模正比于训练样本数,我们常用 SMO(Sequential Minimal Optimization) 算法求解。
    SMO(Sequential Minimal Optimization),序列最小优化算法,其核心思想非常简单:每次只优化一个参数,其他参数先固定住,仅求当前这个优化参数的极值。我们来看一下 SMO 算法在 SVM 中的应用。
    我们刚说了 SMO 算法每次只优化一个参数,但我们的优化目标有约束条件: 支持向量机 SVM(非常详细) - 图112 ,没法一次只变动一个参数。所以我们选择了一次选择两个参数。具体步骤为:
  1. 选择两个需要更新的参数 支持向量机 SVM(非常详细) - 图113支持向量机 SVM(非常详细) - 图114 ,固定其他参数。于是我们有以下约束:

这样约束就变成了:
支持向量机 SVM(非常详细) - 图115
其中 支持向量机 SVM(非常详细) - 图116 ,由此可以得出 支持向量机 SVM(非常详细) - 图117 ,也就是说我们可以用 支持向量机 SVM(非常详细) - 图118 的表达式代替 支持向量机 SVM(非常详细) - 图119 。这样就相当于把目标问题转化成了仅有一个约束条件的最优化问题,仅有的约束是 支持向量机 SVM(非常详细) - 图120
2. 对于仅有一个约束条件的最优化问题,我们完全可以在 支持向量机 SVM(非常详细) - 图121 上对优化目标求偏导,令导数为零,从而求出变量值 支持向量机 SVM(非常详细) - 图122 ,然后根据 支持向量机 SVM(非常详细) - 图123 求出 支持向量机 SVM(非常详细) - 图124
3. 多次迭代直至收敛。
通过 SMO 求得最优解 支持向量机 SVM(非常详细) - 图125
步骤 4
我们求偏导数时得到:
支持向量机 SVM(非常详细) - 图126
由上式可求得 w。
我们知道所有 支持向量机 SVM(非常详细) - 图127 对应的点都是支持向量,我们可以随便找个支持向量,然后带入: 支持向量机 SVM(非常详细) - 图128 ,求出 b 即可,
两边同乘 支持向量机 SVM(非常详细) - 图129,得 支持向量机 SVM(非常详细) - 图130
因为 支持向量机 SVM(非常详细) - 图131 ,所以: 支持向量机 SVM(非常详细) - 图132
为了更具鲁棒性,我们可以求得支持向量的均值:
支持向量机 SVM(非常详细) - 图133
步骤 5: w 和 b 都求出来了,我们就能构造出最大分割超平面: 支持向量机 SVM(非常详细) - 图134
分类决策函数: 支持向量机 SVM(非常详细) - 图135
其中 支持向量机 SVM(非常详细) - 图136 为阶跃函数:
支持向量机 SVM(非常详细) - 图137
将新样本点导入到决策函数中既可得到样本的分类。

4. 软间隔

4.1 解决问题

在实际应用中,完全线性可分的样本是很少的,如果遇到了不能够完全线性可分的样本,我们应该怎么办?比如下面这个:

支持向量机 SVM(非常详细) - 图138

于是我们就有了软间隔,相比于硬间隔的苛刻条件,我们允许个别样本点出现在间隔带里面,比如:

支持向量机 SVM(非常详细) - 图139

我们允许部分样本点不满足约束条件:
支持向量机 SVM(非常详细) - 图140
为了度量这个间隔软到何种程度,我们为每个样本引入一个松弛变量 支持向量机 SVM(非常详细) - 图141 ,令 支持向量机 SVM(非常详细) - 图142 ,且 支持向量机 SVM(非常详细) - 图143 。对应如下图所示:

支持向量机 SVM(非常详细) - 图144

4.2 优化目标及求解

增加软间隔后我们的优化目标变成了:
支持向量机 SVM(非常详细) - 图145
其中 C 是一个大于 0 的常数,可以理解为错误样本的惩罚程度,若 C 为无穷大, 支持向量机 SVM(非常详细) - 图146 必然无穷小,如此一来线性 SVM 就又变成了线性可分 SVM;当 C 为有限值的时候,才会允许部分样本不遵循约束条件。
接下来我们将针对新的优化目标求解最优化问题:
步骤 1
构造拉格朗日函数:
支持向量机 SVM(非常详细) - 图147
其中 支持向量机 SVM(非常详细) - 图148支持向量机 SVM(非常详细) - 图149 是拉格朗日乘子,w、b 和 支持向量机 SVM(非常详细) - 图150 是主问题参数。
根据强对偶性,将对偶问题转换为:
支持向量机 SVM(非常详细) - 图151
步骤 2
分别对主问题参数w、b 和 支持向量机 SVM(非常详细) - 图152 求偏导数,并令偏导数为 0,得出如下关系:
支持向量机 SVM(非常详细) - 图153
将这些关系带入拉格朗日函数中,得到:
支持向量机 SVM(非常详细) - 图154
最小化结果只有 支持向量机 SVM(非常详细) - 图155 而没有 支持向量机 SVM(非常详细) - 图156 ,所以现在只需要最大化 支持向量机 SVM(非常详细) - 图157 就好:
支持向量机 SVM(非常详细) - 图158
我们可以看到这个和硬间隔的一样,只是多了个约束条件。
然后我们利用 SMO 算法求解得到拉格朗日乘子 支持向量机 SVM(非常详细) - 图159
步骤 3
支持向量机 SVM(非常详细) - 图160
然后我们通过上面两个式子求出 w 和 b,最终求得超平面 支持向量机 SVM(非常详细) - 图161
这边要注意一个问题,在间隔内的那部分样本点是不是支持向量?
我们可以由求参数 w 的那个式子可看出,只要 支持向量机 SVM(非常详细) - 图162 的点都能够影响我们的超平面,因此都是支持向量。

5. 核函数

5.1 线性不可分

我们刚刚讨论的硬间隔和软间隔都是在说样本的完全线性可分或者大部分样本点的线性可分。
但我们可能会碰到的一种情况是样本点不是线性可分的,比如:

支持向量机 SVM(非常详细) - 图163

这种情况的解决方法就是:将二维线性不可分样本映射到高维空间中,让样本点在高维空间线性可分,比如:
支持向量机 SVM(非常详细) - 图164
对于在有限维度向量空间中线性不可分的样本,我们将其映射到更高维度的向量空间里,再通过间隔最大化的方式,学习得到支持向量机,就是非线性 SVM。
我们用 x 表示原来的样本点,用 支持向量机 SVM(非常详细) - 图165 表示 x 映射到特征新的特征空间后到新向量。那么分割超平面可以表示为: 支持向量机 SVM(非常详细) - 图166
对于非线性 SVM 的对偶问题就变成了:
支持向量机 SVM(非常详细) - 图167
可以看到与线性 SVM 唯一的不同就是:之前的 支持向量机 SVM(非常详细) - 图168 变成了 支持向量机 SVM(非常详细) - 图169

5.2 核函数的作用

我们不禁有个疑问:只是做个内积运算,为什么要有核函数的呢?
这是因为低维空间映射到高维空间后维度可能会很大,如果将全部样本的点乘全部计算好,这样的计算量太大了。
但如果我们有这样的一核函数 支持向量机 SVM(非常详细) - 图170支持向量机 SVM(非常详细) - 图171支持向量机 SVM(非常详细) - 图172 在特征空间的内积等于它们在原始样本空间中通过函数 支持向量机 SVM(非常详细) - 图173 计算的结果,我们就不需要计算高维甚至无穷维空间的内积了。
举个例子:假设我们有一个多项式核函数:
支持向量机 SVM(非常详细) - 图174
带进样本点的后:
支持向量机 SVM(非常详细) - 图175
而它的展开项是:
支持向量机 SVM(非常详细) - 图176
如果没有核函数,我们则需要把向量映射成:
支持向量机 SVM(非常详细) - 图177
然后在进行内积计算,才能与多项式核函数达到相同的效果。
可见核函数的引入一方面减少了我们计算量,另一方面也减少了我们存储数据的内存使用量。

5.3 常见核函数

我们常用核函数有:
线性核函数
支持向量机 SVM(非常详细) - 图178
多项式核函数
支持向量机 SVM(非常详细) - 图179
高斯核函数
支持向量机 SVM(非常详细) - 图180
这三个常用的核函数中只有高斯核函数是需要调参的。

6. 优缺点

6.1 优点

  • 有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题;
  • 能找出对任务至关重要的关键样本(即:支持向量);
  • 采用核技巧之后,可以处理非线性分类/回归任务;
  • 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。

    6.2 缺点

  • 训练时间长。当采用 SMO 算法时,由于每次都需要挑选一对参数,因此时间复杂度为 支持向量机 SVM(非常详细) - 图181 ,其中 N 为训练样本的数量;

  • 当采用核技巧时,如果需要存储核矩阵,则空间复杂度为 支持向量机 SVM(非常详细) - 图182
  • 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。

7. 参考

  1. 《机器学习》 周志华
  2. 最优化问题的KKT条件
  3. 一文理解拉格朗日对偶和KKT条件
  4. 支持向量机通俗导论(理解SVM的三层境界)

来自知乎:https://zhuanlan.zhihu.com/p/77750026?utm_source=wechat_session