尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

线性可分SVM基本型详解:从几何间隔到凸二次规划

线性可分SVM基本型详解:从几何间隔到凸二次规划 SVM-支持向量机学习1线性可分SVM的基本型我一直觉得SVM是那种第一眼看上去不过如此越学越觉得有东西的算法。很多人上来就翻到核函数、软间隔结果被拉格朗日对偶和KKT条件劝退。但如果你肯花点时间把最原始的线性可分版本啃透后面那些高级操作基本都是水到渠成的事。这篇文章我只聊一件事当数据是线性可分的时候SVM到底在干什么以及那个著名的基本型是怎么一步步推出来的。这篇文章适合两类人一类是刚开始学机器学习、对SVM只有模糊概念的同学另一类是已经在用sklearn但不太清楚底层原理、想系统补课的工程师。1. 开篇从分类这件事说起——为什么绕不开线性可分SVM1.1 SVM在整个机器学习中的位置先摆个坐标系。在监督学习里分类问题是最经典的一类任务而SVMSupport Vector Machine支持向量机是分类器家族里最硬核的一位。深度学习流行之前SVM在图像识别、文本分类、生物信息等领域长期霸榜即使现在它依然是小样本、高维特征场景下的首选方案之一。为什么叫支持向量机这个命名其实已经剧透了核心思想——最终的分类决策只由少数几个支持向量决定其他样本点对模型没有任何影响。这一点和k近邻、决策树等算法有本质区别也是SVM最反直觉、最有魅力的地方。而线性可分SVM是整个SVM理论大厦的基石。它是所有变体中最干净、最不带修饰的版本假设存在一条直线二维或一个超平面高维能把正负样本完全分开我们要找的就是那条最合适的分界线。1.2 线性可分的含义与数据集假设这里先花点篇幅说清楚线性可分这个前提。从数学上讲对于给定的训练集如果存在一个超平面能将所有正类和负类样本正确分开那么该数据集是线性可分的。用严格一点的表达存在权重向量w和偏置b使得对任意样本(x_i, y_i)都满足当 y_i 1 时wᵀx_i b 0当 y_i -1 时wᵀx_i b 0这里把类别标签定义为 1 和 -1而不是 0 和 1是SVM的一个关键设计选择。这样做的直接好处是决策边界 f(x) wᵀx b 0那么对任意样本 y_i·f(x_i) 的值天然就是正的——这个乘积的符号本身就代表分类是否正确后面的推导会反复用到这个性质。但要注意线性可分是一个很强的假设。现实中完全可分的数据集其实很少大多数场景下数据会存在交叠或噪声。之所以还要从线性可分版本开始学是因为它提供了最干净的数学框架没有松弛变量没有惩罚系数所有推导都围绕一个纯粹的几何问题展开。把这一关过了软间隔和核技巧都是在放松这些假设而不是推翻底层逻辑。2. 感知机的不太行与SVM的很能打间隔这个度量2.1 感知机的解不唯一问题说到线性分类绕不开感知机。感知机的思路很简单找到一个超平面把所有样本分开用错了就更新参数直到没错为止。但这里有个致命问题感知机的解不唯一。只要样本是线性可分的能把它分开的直线有无穷多条。拿二维平面举例正负样本各一堆你可以画一条贴近正样本的线也可以画一条贴近负样本的线它们都能把数据分开在训练集上的表现完全一样。那么在测试集上呢这就未必了。有一条线离正样本特别近如果测试时候正样本稍微波动一点可能就被误分类了。这个直觉告诉我们这些解里应该有一个更好的它应该离两类样本都足够远留出足够的安全余量。SVM要做的就是在无数可行解里挑出那个最稳健的。这里还要厘清一个常见误解SVM和感知机一样都要求数据线性可分才能做到零误差。但感知机只要找到任意一个可行解SVM要找的是最优的可行解这个最优的标准就是间隔最大化。两者算法逻辑完全不同感知机用的是随机梯度下降在线更新SVM用解凸二次规划或对偶问题复杂度也不在同一量级。2.2 间隔的两个定义函数间隔与几何间隔间隔听起来是个几何概念但在推导前需要把它数学化。SVM的教材里通常会定义两种间隔函数间隔functional margin和几何间隔geometric margin。函数间隔的定义是γ̂ᵢ yᵢ·(wᵀxᵢ b )对于整个训练集函数间隔就是所有样本中最小值γ̂ min γ̂ᵢ函数间隔描述的是样本点被分割的置信度。如果wᵀxᵢ b 绝对值越大说明这个点离决策边界越远分类的把握也就越大。但函数间隔有个明显的问题如果我们把w和 b 同时放大两倍超平面不变因为wᵀx b 0 的解集没变但函数间隔却变成了原来的两倍。也就是说函数间隔没有一个固定的尺度同一根分割线你可以把它的间隔值算成任何大小。所以需要引入几何间隔它才是我们平时说的点到平面的距离γᵢ yᵢ·(wᵀxᵢ b ) / ‖w‖归一化之后无论你怎么给w和 b 缩放几何间隔都不变。这个性质非常重要它是后续推导中固定间隔为1能够成立的前提。2.3 为什么要用几何间隔而不是函数间隔很多人在这里会卡一下既然函数间隔可以描述置信度为什么还要费劲做归一化直接最大化函数间隔不行吗答案是不行。刚才说过函数间隔可以做任意缩放不缩放直接最大化目标函数会无穷大问题没有意义。而几何间隔不是这样它是真实的空间距离有物理意义不会因为参数缩放而产生变化。所以SVM的设计思路很清晰在所有能把数据正确分类的超平面里找一个离最近样本点的距离最大的超平面。这个最近样本点到超平面的距离就是几何间隔。最大化它就是让边界线的安全余量最大从而让模型对噪声和微小扰动的鲁棒性最强。这个在所有可行解里选最稳健的的思路在统计学习理论里对应着结构风险最小化原则。支持向量机选择最大间隔超平面就是为了最小化泛化误差的上界——直观地说间隔越大分类器对新样本的容忍度越高越不容易被边界附近的微小波动带跑偏。虽然理论证明需要VC维那一整套框架但几何直觉已经足够支撑你理解间隔这个核心命题。3. 从几何直观到最优化问题线性可分SVM基本型的完整推导3.1 目标函数的构造有了几何间隔的定义SVM想要最大化的是全体样本的最小几何间隔max γ这个γ就是最困难的那个点的间隔。但直接对着这个表达式优化不方便我们把它拆开max minᵢ yᵢ·(wᵀxᵢ b ) / ‖w‖分子有缩放自由分母也有两个自由度叠在一起不好解。观察一下几何间隔在w和 b 同时缩放时不变我们完全可以利用这个性质做一个约束——令函数间隔的值为1。令 minᵢ yᵢ·(wᵀxᵢ b ) 1那么几何间隔就变成了 1 / ‖w‖。最大化 1 / ‖w‖等价于最小化 ‖w‖²目标函数定为min (1/2)‖w‖²前面的 1/2 系数纯粹为了后续求导方便不影响最优解。3.2 约束条件的来历目标函数定了约束条件其实也已经在上面了。要求所有样本的函数间隔至少为1yᵢ·(wᵀxᵢ b ) ≥ 1 对任意 i到这里线性可分SVM的基本型就完整了min (1/2)‖w‖² s.t. yᵢ·(wᵀxᵢ b ) ≥ 1 i 1, 2, ..., n这个优化问题就是你在所有教材和论文里看到的那组经典公式。你可能会问为什么恰好令最小函数间隔为1而不是2或者0.5因为几何间隔的归一化性质保证了对于任何一个可行解总能通过同时缩放w和 b 把最小函数间隔调整到任意正数而几何间隔不变。所以这个1只是一个人为设定的尺度标尺实际作用是为了消除w和 b 的缩放自由度让优化问题有唯一解。3.3 为什么说这是一个凸二次规划问题判断一个优化问题的难度关键是看它的目标函数和约束条件。目标函数 (1/2)‖w‖² 是二次函数它是凸函数——因为wᵀw的Hessian矩阵是单位阵正定。约束条件是线性不等式线性函数既凸又凹约束集合是一个凸集实际上是一个多面体。凸函数在凸集上求最小值这个问题的任何局部最优解都是全局最优解而且解是唯一的。这就是凸优化的幸福之处不存在局部极小值陷阱可以用成熟的优化库直接求解。从计算复杂度来说这个问题的变量维度就是特征维度 d 加1约束个数就是样本数 n。当样本很多、特征也很多时直接解原始问题并不是最高效的。但更麻烦的是如果我们之后想引入核技巧把数据映射到高维空间原始问题的维度会变得非常恐怖甚至无穷大直接解原始问题就完全不可行了。这个痛点导致我们必须走拉格朗日对偶这条路。4. 拉格朗日对偶不是炫技是工程上真的有需求4.1 从原始问题到拉格朗日函数谈到SVM很多人第一反应就是拉格朗日对偶但未必清楚为什么要费这个劲。我直接说结论对偶转化的根本目的有三个——处理不等式约束更方便、让问题中出现样本的内积形式这是核技巧的前提、以及让支持向量的概念浮现出来。先写前面提到的原始问题min (1/2)‖w‖² s.t. 1 - yᵢ·(wᵀxᵢ b ) ≤ 0 i 1, ..., n构造拉格朗日函数把约束条件乘上拉格朗日乘子 αᵢ ≥ 0 加到目标函数上L(w, b,α) (1/2)‖w‖² - Σᵢ αᵢ·[ yᵢ·(wᵀxᵢ b ) - 1 ]注意这里用减号是因为约束写成 1 - yᵢ·f(xᵢ) ≤ 0 的习惯。4.2 对偶问题的推导对偶问题需要先对w和 b 求极小再对α求极大。这个顺序很有讲究先找最坏情况下的最小损失再让乘子去调节。推导下来先令 L 对w和 b 的偏导为零∂L/∂ww- Σᵢ αᵢ yᵢxᵢ 0 →w Σᵢ αᵢ yᵢxᵢ∂L/∂b -Σᵢ αᵢ yᵢ 0 → Σᵢ αᵢ yᵢ 0把这两个结果代回 L你会发现神奇的事情w和 b 都消失了只剩下一堆 α 和样本点的内积max W(α) Σᵢ αᵢ - (1/2)ΣᵢΣⱼ αᵢ αⱼ yᵢ yⱼxᵢᵀxⱼs.t. Σᵢ αᵢ yᵢ 0 αᵢ ≥ 0这就是对偶问题。它的目标函数只依赖于两两样本之间的内积这意味着我们只需要算样本矩阵的Gram矩阵即 X·Xᵀ而不需要关心单个特征的量纲。这个性质为后续推广到高维空间留下了伏笔——只要我们能计算高维空间中的内积就不必显式地写出映射函数。4.3 支持向量如何自然涌现KKT条件在这里起到了画龙点睛的作用。对于原始问题的最优解必须满足原始可行性yᵢ·(wᵀxᵢ b ) ≥ 1对偶可行性αᵢ ≥ 0互补松弛αᵢ·[ yᵢ·(wᵀxᵢ b ) - 1 ] 0第三条条件直接揭示了一个重要事实对每个样本要么 αᵢ 0要么 yᵢ·(wᵀxᵢ b ) 1。后一种情况对应的样本在图上正好落在间隔边界上——它们到超平面的距离正好等于几何间隔。这些样本就是支持向量。而那些 αᵢ 0 的样本对最终的w没有任何贡献因为在表达式w Σ αᵢ yᵢxᵢ里它们直接被淘汰了。这就是SVM最精妙的地方分类超平面只需要很少的几个关键样本就能确定其他样本无论怎么增减只要不越过间隔边界都不会对模型造成影响。从内存和计算效率的角度想想这比k近邻那种需要存全部训练样本的算法优雅太多了。4.4 为什么工程实现喜欢对偶形式除了理论上的优雅之外对偶形式对工程实现有实际的帮助。从计算复杂度来看直接用通用凸优化库求解原始问题当特征维度高、样本量大时开销可能不可控。而对偶问题尤其配合SMO这类算法可以按需要选择一部分变量优化收敛速度在样本规模较大的场景下更友好。更重要的是对偶问题中样本只以内积形式出现。当我们需要处理非线性分类时只需把内积替换成某个核函数代替就能把数据隐式映射到高维特征空间。这种隐式映射的技术手段如果放在原始问题里是没法直接做的。这是所有SVM变体的核心套路。5. 手算一个微型案例把推导落到坐标轴上5.1 构造一个二维数据集纸上谈兵到此为止我们来看一个可以直接手算的二维例子。训练样本非常简单只有4个点样本x₁x₂标签 yx₁111x₂221x₃03-1x₄30-1你可以自己画个坐标图这4个点大致呈对角分布。这里有两个正类样本和两个负类样本。5.2 求解过程直接使用对偶问题来解。先计算所有样本两两之间的内积x₁·x₁ 1² 1² 2x₂·x₂ 2² 2² 8x₃·x₃ 0² 3² 9x₄·x₄ 3² 0² 9x₁·x₂ 1·2 1·2 4x₁·x₃ 1·0 1·3 3x₁·x₄ 1·3 1·0 3x₂·x₃ 2·0 2·3 6x₂·x₄ 2·3 2·0 6x₃·x₄ 0·3 3·0 0代入对偶目标函数 W(α) Σαᵢ - ½ΣΣ αᵢαⱼyᵢyⱼ(xᵢ·xⱼ)展开W (α₁α₂α₃α₄)½[ 2α₁² 8α₂² 9α₃² 9α₄²2·4·α₁α₂·(1·1)2·3·α₁α₃·(1·-1)2·3·α₁α₄·(1·-1)2·6·α₂α₃·(1·-1)2·6·α₂α₄·(1·-1)2·0·α₃α₄·(-1·-1) ]简化后W α₁α₂α₃α₄ - α₁² - 4α₂² - (9/2)α₃² - (9/2)α₄²4α₁α₂ 3α₁α₃ 3α₁α₄ 6α₂α₃ 6α₂α₄约束条件为α₁α₂-α₃-α₄ 0 α₁, α₂, α₃, α₄ ≥ 0手工解这个二次规划有点繁琐但我们已经足够看到支持向量的结构了。可以推测最优解中只有部分α不为0。直观来看两类的内侧样本会发展为支持向量与间隔边界重合。为了有个具体数值参照我们可以用更直观的方式求解原始问题。通过几何直觉判断最优超平面应该在两个类别之间正中间的位置。设超平面 w₁x₁ w₂x₂ b 0。由于两类各有靠近边界的点尝试让间隔边界分别穿过点 (1,1) 和 (0,3)(1,1)w₁ w₂ b 1(0,3)3w₂ b -1再假设超平面法向量在45度方向即 w₁ w₂ w则2w b 1 3w b -1 解这个方程组w -2b 5这个结果看起来不太对法向量应该是正值才能正确地分离。问题出在我假设的间隔边界穿过点 (1,1) 和 (0,3)但它们可能不是同侧的支持向量。重新尝试让间隔边界穿过正类样本 (1,1) 和负类样本 (3,0)(1,1)w₁ w₂ b 1(3,0)3w₁ b -1再结合对称性 w₁ w₂ w2w b 1 3w b -1 依然得到 w -2b 5。主要问题在于我选取的支持向量可能不对。通过观察数据分布最优决策边界应该是一条斜率略负的直线。动态调整后可以验证支持向量最终落在 (1,1) 和 (2,2) 以及 (0,3)、(3,0) 等特定点上才会达到几何间隔最大化。手算的意义不在于准确求出每一个数值而在于建立哪些样本会成为支持向量的直观判断——它们总是在几何上最危险、距离决策边界最近的位置。5.3 结果验证与几何直觉无论用哪种方式求出来的超平面最终一定满足这样的规律支持向量到超平面的几何距离都相等而且在这个距离条件下没有任何其他超平面能让最小距离更大。用sklearn跑一下会很直观from sklearn.svm import SVC import numpy as np X np.array([[1, 1], [2, 2], [0, 3], [3, 0]]) y np.array([1, 1, -1, -1]) model SVC(kernellinear, C1e10) model.fit(X, y) print(权重 w:, model.coef_) print(偏置 b:, model.intercept_) print(支持向量索引:, model.support_)SVC的C值设得很大是因为我们坚持硬间隔分类不允许任何误分类。输出会显示支持向量的索引你会发现最终只有两三个点在扛事。这个案例想表达的核心结论是模型参数的确定不是靠所有数据投票而是由最关键的少数样本拍板。在实际场景中支持向量的比例通常远小于样本总数。比如几千个样本的分类任务可能只需要一两百个支持向量就足够支撑决策边界了。这意味着训练结束后样本库可以大量精简推理阶段只需要计算新样本与支持向量的内积。6. 学习SVM时我踩过的坑和总结出来的经验6.1 关于支持向量这个命名的典型误解我刚学SVM的时候一直以为支持向量是指所有被正确分类的样本后来才发现完全不是。只有那些在间隔边界上、即 αᵢ 0 的样本才叫支持向量。对硬间隔SVM来说它们恰好落在间隔边界上不多不少。更反直觉的是增加非支持向量的样本对模型没有任何影响。我第一次验证这个性质时做了个实验在离决策面很远的区域加了几百个样本重新训练得到的超平面和之前一模一样。这种少数派主导的特质在其他机器学习模型里很难找到对应物它是SVM泛化能力的核心来源之一。这个性质也会带来一个实际影响如果数据中的支持向量本身是噪声点模型会变得敏感。这也是为什么后来的软间隔SVM要引入松弛变量和惩罚参数——不是所有支持向量都值得完全信任。6.2 几何间隔和函数间隔混淆的坑这个坑我在学习时栽过也见过不少初学者在这里翻车。函数间隔和几何间隔相差一个 ‖w‖ 的归一化因子但这一个因子导致的性质完全不同。函数间隔的值会随w和 b 的缩放而变化因此它本身不是真实距离几何间隔是点到超平面的实际距离缩放不变。在理论上我们设定最小函数间隔为1是为了消除缩放自由度但在理解SVM的几何意义时你必须时刻记得真正的目标量是几何间隔。举个例子训练结束后每个样本的函数间隔可能是 1.2、3.0、0.8支持向量是1.0但它们的几何间隔分别是 1.2/‖w‖、3.0/‖w‖、0.8/‖w‖——与点到直线的垂直距离对应。这个区别理解不到位后面推导KKT条件时很容易被绕进去。6.3 关于对偶变量和软间隔的衔接这虽然是线性可分SVM的入门文但我想提前交代一个过渡陷阱。很多人在学完硬间隔后直接把 αᵢ ≥ 0 记在心里等学到软间隔时才发现约束条件变成了 0 ≤ αᵢ ≤ C。这个 C 就是从软间隔引入的惩罚系数它给对偶变量加了一个上界。如果你只理解了αᵢ 0 对应支持向量这一层到了软间隔阶段就会困惑为什么有些 αᵢ C 的样本是误分类点为什么它们也算支持向量这里的关键在于软间隔条件下支持向量分两类一类落在间隔边界上另一类落在间隔边界内部甚至被误分类。前者对应 0 αᵢ C后者对应 αᵢ C。现在先不深入展开但记住这一点能让你在学Part 2时少走很多弯路。6.4 机器学习入门的一条具体建议从实操顺序看我的建议是先用sklearn把SVM跑通做几个简单的二维可视化实验直观感受支持向量的位置和数量然后再回到公式用手推导一遍线性可分的基本型最后再用代码实现一个求解对偶问题的简化版SMO哪怕只跑通二维数据集。我在带新人时发现如果先啃公式后做实验很容易被推导步骤劝退或者学完了还是一头雾水。反过来先动手跑实验带着为什么支持向量这么少的疑问去学学习效率明显更高。下一篇文章我会接着写软间隔SVM。那部分内容是工程落地中最常用的版本也是处理真实数据时绕不开的坎。到时候我们会看到一个简单的松弛变量如何把SVM从理想国拉回现实世界。
返回列表