📑 本页目录(点开跳转)
07 · SVM:最大间隔与对偶
⏱ 30 分钟 | ⭐⭐ 深度学习之前的王者
🎯 一句话
感知机「分对就满意」(第 3 章),SVM 问的是「哪条分界线最好?」—— 答案是离两边都最远的那条。这个"最远"叫间隔,最大化它带来了极好的泛化能力。
📏 一、最大间隔:为什么"最远"是好的
同样能分开数据的三条线:
○ ○ ○ │ ● ● ● ○ ○ ○ │ ● ● ● ○ ○ ○│● ● ●
↑ ↑ ↑
贴着●很近 两边都很远 ⭐ 贴着○很近
哪条最好?中间那条。为什么?
三个角度理解:
| 角度 | 说明 |
|---|---|
| 鲁棒性 | 新数据总有抖动,留的余量越大,抖过界的可能越小 |
| 唯一性 ⭐ | 感知机会停在任意一条可行线上(取决于初始化和数据顺序);最大间隔的那条是唯一确定的 |
| 理论保证 | 泛化界可以用 间隔 而非 VC 维来表述(间隔越大界越紧),这是 SVM 理论优雅之处 |
🔗 这个 γ 就是第 3 章感知机收敛定理里那个 γ—— 在那里它决定收敛速度,在这里它成了优化目标本身。
📐 二、优化问题的形式
目标:最大化间隔 γ = 1/‖w‖
等价:最小化 ‖w‖²
约束:所有点都分对,且距离边界至少 1
min ½‖w‖²
w,b
s.t. yᵢ(w·xᵢ + b) ≥ 1, ∀i
💡 人话:在"所有点都分对且离边界够远"的前提下,让 w 尽可能小。
📐 为什么间隔是 1/‖w‖(想看再点)
点 $x$ 到超平面 $w^\top x + b = 0$ 的距离是 $\frac{|w^\top x + b|}{\|w\|}$。
我们约定支持向量满足 $|w^\top x + b| = 1$(这只是一个缩放选择,不影响超平面本身)。
所以支持向量到超平面的距离 = $\frac{1}{\|w\|}$,两侧总间隔 = $\frac{2}{\|w\|}$。
最大化间隔 ⟺ 最小化 ‖w‖ ⟺ 最小化 ½‖w‖²(平方和系数是为了求导方便)。
🎯 支持向量:只有少数点说了算
○ ○
○ ⊙ ───────────── ← 上边界
margin
──────────────────── ← 决策边界
margin
⊙ ───────────── ← 下边界
● ● ●
⊙ = 恰好落在边界上的点,叫【支持向量】
🔑 SVM 最漂亮的性质:最终模型只由支持向量决定(通常只占样本的一小部分)。 把其他所有点删掉重新训练,得到的分界线一模一样。
三个推论:
| 推论 | 说明 |
|---|---|
| 对远处的离群点鲁棒 | 它们根本不参与决策 |
| 模型天然稀疏 | 预测时只需和支持向量算核 |
| ⚠️ 对边界附近的噪声敏感 | 一个标错的点如果落在边界上,会直接改变结果 |
🔄 三、对偶:为什么要绕这一圈
原问题(primal)已经能解了,为什么还要转成对偶(dual)?
📐 对偶形式(想看再点)
引入拉格朗日乘子 $\alpha_i \ge 0$,原问题等价于:
$$\max_{\alpha} \; \sum_i \alpha_i - \frac{1}{2}\sum_i\sum_j \alpha_i\alpha_j y_i y_j \, \underbrace{x_i^\top x_j}_{\text{⭐ 只有内积!}}$$ $$\text{s.t.}\quad \alpha_i \ge 0,\quad \sum_i \alpha_i y_i = 0$$
解出 α 后:$w = \sum_i \alpha_i y_i x_i$
KKT 条件告诉我们:只有满足 $y_i(w^\top x_i+b)=1$ 的点(即支持向量)才有 $\alpha_i > 0$, 其余点 $\alpha_i = 0$ —— 稀疏性是自动出现的,不是人为设计的。
💡 对偶的两个红利
① 只剩内积 xᵢ·xⱼ ⭐⭐
→ 直接换成核函数 K(xᵢ, xⱼ) 就得到【核 SVM】
→ 这就是第 6 章核技巧的用武之地!
② 支持向量自动浮现
→ 非支持向量的 α = 0,模型天然稀疏
🔑 对偶不是数学炫技,它是让核技巧能用上的那把钥匙。
原问题:$w^\top x$ —— w 和 x 直接相乘,需要显式的高维向量 💀 对偶:$x_i^\top x_j$ —— 只有 x 之间的内积,可以被核替换 ✅
预测时也只用内积:
$$f(x) = \text{sign}\left(\sum_{i\in SV} \alpha_i y_i \,K(x_i, x) + b\right)$$
🩹 四、软间隔:允许犯错
现实数据往往线性不可分(第 3 章感知机的死穴)。 SVM 的解法是允许违规,但要罚:
$$\min_{w,b,\xi}\; \frac{1}{2}\|w\|^2 + C\sum_i \xi_i \qquad \text{s.t. } y_i(w^\top x_i + b) \ge 1 - \xi_i,\ \xi_i \ge 0$$
💡 人话:ξᵢ 是第 i 个点"越界了多少",C 是越界的罚款单价。
ξ = 0 点在边界外,完全合规 ✅
0 < ξ < 1 点越过了边界,但还在正确的一侧
ξ = 1 点正好落在决策边界上
ξ > 1 点被【分错了】 💀
🎚️ C 的含义(最重要的超参)
| C | 含义 | 后果 |
|---|---|---|
| C 大 | 罚款贵,几乎不许犯错 | 间隔窄、边界扭曲、过拟合 |
| C 小 | 罚款便宜,容忍犯错 | 间隔宽、边界平滑、欠拟合 |
🔗 C 其实就是正则化强度的倒数:
min ½‖w‖² + C·误差⟺min 误差 + (1/C)·½‖w‖²对照第 2 章:这就是 λ = 1/C。 SVM 的 C 和岭回归的 λ 是同一个旋钮的两种写法。
💡 软间隔还有一个损失函数视角
原问题可以改写成无约束形式:
$$\min_w \; \underbrace{\sum_i \max(0,\, 1 - y_i(w^\top x_i + b))}_{\text{Hinge 损失}} + \frac{1}{2C}\|w\|^2$$
Hinge 损失:max(0, 1 − y·f(x))
loss ▲
│╲
│ ╲ 分对且间隔 ≥ 1 → 损失 = 0 ⭐
│ ╲ (这就是稀疏性的来源!)
│ ╲____________
└────┴───────────► y·f(x)
1
🔑 和逻辑回归对比:交叉熵损失永远大于 0(哪怕分得很对还想更自信), 所以逻辑回归所有点都参与;Hinge 损失在分对且够远时恰好为 0, 所以那些点的梯度为零,不影响模型 —— 这就是支持向量稀疏性的另一种解释。
🎛️ 五、实用调参
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
# ⭐ SVM 必须标准化(它基于距离/内积)
pipe = make_pipeline(StandardScaler(), SVC(kernel="rbf"))
grid = GridSearchCV(pipe, {
"svc__C": [0.1, 1, 10, 100],
"svc__gamma": [0.001, 0.01, 0.1, 1],
}, cv=5, n_jobs=-1)
C 和 γ 的交互(经典的对角线现象):
γ ▲
│ 过拟合 过拟合
│ (太局部) (太局部+太严)
│ ╲
│ ╲ ⭐ 好的区域在对角线附近
│ ╲
│ 欠拟合 ╲
└──────────────────► C
💡 为什么是对角线:C 和 γ 都在增加模型复杂度。 一个大另一个就该小,总复杂度保持在合适水平。
四个必须知道的实践点:
| 点 | 说明 |
|---|---|
| 必须标准化 ⭐ | SVM 基于内积/距离 |
| 不适合大数据 | n > 10 万就很吃力(第 6 章的 O(n²)) |
| 原生不给概率 | 需要 Platt scaling 校准(probability=True,但会慢很多) |
| 多分类靠拆分 | one-vs-one 或 one-vs-rest,不是原生支持 |
⚖️ 六、SVM 今天还有用吗
| 场景 | 建议 |
|---|---|
| 中小数据(n < 5 万)+ 特征不多 | ✅ 仍然很强,且不太需要调 |
| 高维稀疏(文本 TF-IDF) | ✅ 线性 SVM 至今是强基线 |
| 大数据 | ❌ 用 GBDT 或神经网络 |
| 需要概率输出 | ❌ 要额外校准 |
| 深度学习能用的场景(图像/文本) | ❌ 预训练模型碾压 |
💡 历史地位:1995–2012 年 SVM 是机器学习的绝对主流。 它输给深度学习不是因为想法不好,而是因为 O(n²) 不 scale—— 又一次印证「可扩展性胜过精巧设计」。
但线性 SVM 在高维稀疏数据上至今没被淘汰——因为那种场景下它既快又准。
🔗 七、和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 第 3 章感知机的 γ | 在 SVM 里成了优化目标 |
| 第 6 章核技巧 | 通过对偶形式用上 |
| 第 2 章 λ 正则强度 | SVM 的 C = 1/λ |
| 逻辑回归的交叉熵 | 对比 Hinge:交叉熵永远>0 所以不稀疏 |
| 基础教程第 5 章过拟合 | C 和 γ 都是偏差-方差旋钮 |
🔗 这一章连到哪里
| 去哪 | 为什么 |
|---|---|
| ML基础 03 | 对照着看:逻辑回归最大化似然、SVM 最大化间隔,同样一条直线两种理由 |
| ML基础 04 | 另一条路线的分类器 —— 它不画超平面,也就没有间隔这回事 |
| 上线之后 02 | ⚠️ SVM 的判别值不是概率。要拿分数做阈值或出价,必须先看校准曲线 |
✅ 检查点
- SVM 和感知机的目标有什么不同?最大间隔好在哪(三个角度)?
- 什么是支持向量?删掉非支持向量会怎样?这带来什么优缺点?
- 为什么要转成对偶形式?关键红利是什么?
- C 大和 C 小分别导致什么?C 和 λ 是什么关系?
- Hinge 损失和交叉熵最大的区别是什么?这解释了什么?
- C 和 γ 的最优区域为什么呈对角线?
- SVM 为什么在大数据时代退场了?哪个场景它还活着?
👀 答案
- 感知机只要分对就停;SVM 要找间隔最大的那条。三个角度:鲁棒性(留余量抗抖动)、唯一性(感知机的解取决于初始化,最大间隔解唯一)、理论保证(泛化界可用间隔表述)。
- 恰好落在间隔边界上的点。删掉所有非支持向量重训,分界线完全不变。优点:对远处离群点鲁棒、模型稀疏;缺点:对边界附近的噪声敏感。
- 因为对偶形式里只剩样本间的内积 xᵢ·xⱼ,可以直接替换成核函数。原问题里 w 和 x 直接相乘,需要显式高维向量。
- C 大=罚款贵、几乎不许犯错→间隔窄、过拟合;C 小=容忍犯错→间隔宽、欠拟合。C = 1/λ,和岭回归的正则强度是同一旋钮。
- Hinge 在「分对且间隔≥1」时恰好等于 0(梯度也为 0),交叉熵永远大于 0。这解释了为什么 SVM 稀疏(只有支持向量起作用)而逻辑回归所有点都参与。
- C 和 γ 都在增加模型复杂度,一个大另一个就该小,才能让总复杂度保持在合适水平。
- 核矩阵 n×n,复杂度 O(n²)~O(n³),n 超十万就存不下也算不动。线性 SVM 在高维稀疏数据(如文本 TF-IDF)上至今是强基线。
🛑 可以停在这里
⚡ 走神救援
感知机「分对就满意」,SVM 问⭐「哪条分界线最好」——离两边都最远的那条,这个"最远"叫间隔。三个理由:鲁棒性(新数据有抖动,余量越大越不容易抖过界)、⭐唯一性(感知机的解取决于初始化和数据顺序,最大间隔那条是唯一确定的)、理论保证(泛化界可用间隔而非 VC 维表述,间隔越大界越紧)。这个 γ 就是第 3 章感知机定理里的 γ:那里决定收敛速度,这里成了优化目标。间隔
γ = 1/‖w‖,所以最大化间隔 ⟺min ½‖w‖²,约束yᵢ(w·xᵢ+b) ≥ 1。⭐支持向量=恰好落在边界上的那少数点,模型只由它们决定,其余点全删掉重训分界线一模一样:对远处离群点鲁棒、天然稀疏,但⚠️对边界附近的噪声敏感(一个标错的点落在边界上就会改变结果)。⭐⭐对偶不是数学炫技:原问题wᵀx需要显式的高维向量,对偶展开后只剩内积xᵢ·xⱼ,才能整体换成核函数——这就是对偶存在的理由;KKT 保证只有支持向量αᵢ > 0,稀疏性是自动出现的。软间隔允许违规但要罚:min ½‖w‖² + C·Σξᵢ(ξᵢ 是越界了多少,ξ > 1 才算真的分错)。⭐C 大=罚款贵→间隔窄、过拟合;C 小=容忍犯错→间隔宽、欠拟合,且 C = 1/λ,和岭回归是同一个旋钮。⭐Hinge 损失在分对且间隔 ≥ 1 时恰好为 0(梯度也为 0,那些点不影响模型)——这是稀疏性的另一种解释;交叉熵永远大于 0,所以逻辑回归所有点都参与。实践:⚠️必须标准化、C 与 γ 的好区在对角线上(一个大另一个就得小)、原生不给概率。它输给深度学习不是想法不好,是 O(n²) 不 scale(n 过十万就吃力),但线性 SVM 在高维稀疏数据(文本 TF-IDF)上至今是强基线。
下一节 👉 08-偏差方差分解.md