JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

支持向量机与核技巧

一个分类器如何在两类之间画出唯一一条最有底气的分界线,以及一个巧妙的技巧如何让这条直线在看似无法分开的纠缠数据中弯曲穿行。

在所有能用的分界线里,哪一条最好?

几篇指南之前你认识了逻辑回归:它会找到*一条*能把两类分开的线。但如果两类本来就能干净地分开,能完成任务的线有无穷多条——有的紧贴着一团数据,有的紧贴着另一团。逻辑回归并不太在意选哪条,它只要求数据落在正确的一侧。而支持向量机(SVM)问了一个更尖锐的问题:在所有能分开两类的线里,究竟哪一条最*稳妥*?

想象在两类之间刷出一条宽阔的街道。SVM 给出的答案,就是那条恰好位于*尽可能最宽*街道正中央的线——在你碰到任何一个数据点之前,两侧留白最多的那条。这片留白叫作间隔(margin),而 SVM 的设计目标正是把它最大化。这个直觉既诚实又有力:一条留有大量余地的边界,在面对略带噪声的新样本时,比一条紧贴最近样本擦身而过的边界更不容易分错。

这就是最大间隔(maximum-margin)原则,它呼应了前面阶梯里的概念。一个宽厚的间隔本身就是一种归纳偏置——一种对简单、自信的边界的内在偏好——它往往有助于对未见数据的泛化。在长达十多年里,SVM 一直是难以击败的算法,正是因为这种偏好拿捏得恰到好处。

支持向量:决定一切的少数几个点

这是关于 SVM 最出人意料、也最优雅的事实。一旦你找到了最宽的街道,这条边界的精确位置,只由少数几个*恰好落在间隔边缘*的点钉死——也就是分别贴在两侧路缘上的那些点。它们就是支持向量(support vectors)。其余所有的点,无论离得多远,即便删掉,边界也分毫不动。

这正是支持向量机名字的由来,也是它优雅的很大一部分。这个模型是*稀疏*的:它忽略你的绝大部分数据,只记住那些困难的、处于临界的样本。把它和k 近邻对比一下——后者必须永远保留每一个训练点。SVM 则把决策提炼成了关键的少数几个点。

不过真实数据很少能被完美分开。在严格版本里,只要有一个标注错误的点,或一个深入敌方阵地的离群点,就会让*任何*有效街道都不存在。因此现代 SVM 采用软间隔(soft margin):它允许一些点违反间隔——甚至落到错误的一侧——但对每次违反收取一笔罚款。一个叫 *C* 的超参数决定罚款有多重。C 大意味着"几乎不容忍任何错误"(一条狭窄、挑剔的间隔);C 小意味着"更宽的间隔值得犯几个错"。调节 C 是核心的取舍,而它其实只是换了身行头的偏差—方差权衡

核技巧:让直线弯曲

到目前为止,SVM 画的是一条*直*边界。但如果数据纠缠得无可救药呢——比如一类围成一个环,套住另一类?没有任何直线能把靶心和外圈的甜甜圈分开。正是在这里,SVM 完成了它著名的飞跃。

思路是:把数据抬升到一个更高维的空间,在那里它*真的*能被直线分开。对于这个靶心,我们增加第三个维度,等于每个点到中心的距离。这样内圈像小山一样隆起,外圈则保持低平——一个平面就能在两者之间干净地切过。把这个平面投影回原来的二维图像,它看起来就是一个圆。我们用高维空间里的一刀直切分开了数据;只是回到原处它*看起来*是弯的。

问题在于,显式地计算这些高维坐标代价高昂——而且有时有用的空间有*无穷多*个维度。核技巧(kernel trick)正是拯救我们的洞见。事实证明,SVM 的整个训练过程,只需要知道成对样本之间的点积,而根本不需要它们的原始坐标。核函数(kernel)就是这样一个函数:它直接从原始的低维输入,算出在高维空间里那个点积*本应是*多少——全程不必踏入高维空间一步。

这就是核技巧的全部魔法:你以在原始小空间里运算的计算代价,换来了一个巨大(乃至无穷)特征空间的威力。换一个不同的核函数,你就改变了 SVM 能画出的边界*形状*——而不必重写算法的任何一行。

# A kernel just replaces the dot product x . z
# with k(x, z) = (feature-space dot product), computed cheaply.

linear(x, z)  = x . z                 # plain straight boundary
poly(x, z)    = (x . z + 1) ** d       # curved, degree-d boundary
rbf(x, z)     = exp(-gamma * ||x - z||^2)  # local, infinitely-flexible

# RBF: similarity fades with distance. 'gamma' sets how fast.
# small gamma -> smooth, broad influence (simpler boundary)
# large gamma -> tight, wiggly influence (risk of overfitting)
三种常见的核函数。RBF(高斯)核是常用的默认选择;gamma 控制每个点的影响有多局部。

选择并调节核 SVM

最常用的核是 RBF(径向基函数,即高斯)核。它衡量一种随距离平滑衰减的相似度,几乎能刻画出任何平滑的边界,因此在你对数据结构没有特别预设时,它是个有力的首选。多项式核适合特征*交互*重要的问题;而最朴素的线性核,则在你特征很多、数据不多时表现最好——这在文本中很常见,那里一条直线边界往往已经能把东西分得很好。

  1. 先把特征标准化——在未缩放的数据上跑 SVM 几乎总是有问题的。
  2. 以 RBF 核作为合理的默认起点;如果特征很多,也试试线性核。
  3. 对两个关键旋钮——C(间隔的软硬)和 gamma(核的局部性)——一起搜索,因为它们相互影响。
  4. 用交叉验证(而非训练集得分)来选定这对参数——高 gamma 加高 C 可能把训练集背下来。

SVM 何时出彩,何时失色

SVM 在中小规模、结构清晰干净的数据集上最能体现价值:几千个样本、精心设计的特征、两个类别(或少数几个,通过训练多个 SVM 来处理)。多年来,配上线性核的 SVM 一直是占主导地位的文本分类器;当正确标签稀缺且昂贵时,它格外出彩——而这恰恰是数据饥渴的深度学习往往力不从心的地方。作为一种监督学习方法,一个调好的 SVM 常常是个难以击败的基线

但要诚实面对它的局限。训练核 SVM 的扩展性很差——大致随样本数在平方到立方之间增长——所以在数百万行数据上它会慢得让人痛苦,这时梯度提升或线性模型通常会胜出。SVM 输出的是"在线的哪一侧"这种硬判决,而非经过校准的概率,除非额外做处理。而在图像、音频这类原始、非结构化的输入上,任何手工挑选的核都比不过深度网络学到的特征——这在很大程度上解释了为什么 SVM 在 2012 年之后淡出了头条。

这一切都没有让 SVM 过时——它只是让 SVM 成了一名专才。没有免费午餐定理提醒我们:对每个问题都没有唯一最优的算法;最大间隔的思想和核技巧,至今仍是机器学习中最优雅的工具之一,而在那种规模适中、表格化、标注良好的问题上,它们往往就是正确的选择——这类问题,你遇到的机会远多于十亿张图片的数据集。懂得*何时*该祭出它,正是这一阶梯要教给你的判断力。