第 6 步 · 欠拟合 vs 过拟合
过拟合与正则化Overfitting & Regularization
模型太强了反而不好——学会"抓规律"而不是"背答案"
10 分钟
阅读 + 实操
1 个
交互演示
中级
难度
过拟合 · 交互演示
训练 MSE--
验证 MSE--
参数 L2 范数--
步数0
次数=1 · 低次
次数=3 · 中次
次数=12 · 高次
为什么学这步?
过拟合是机器学习最常见、最致命的陷阱——模型把训练集"背"得滚瓜烂熟,却对新数据束手无策。本步用三个并排的模型直观对比欠拟合、刚刚好、过拟合,并通过训练集 vs 验证集的损失曲线看清差距。解药是 L2 正则化——给大参数加惩罚,逼模型学"规律"而非"背答案"。这是从"会训练"走向"会调优"的分水岭。
📌 发生了什么
- 低次模型线太直——欠拟合,连训练集都拟合不好。
- 高次模型完美穿过每个训练点——过拟合,验证集反而变差。
- L2 正则化惩罚大参数,限制模型"发疯",提升泛化。
⚠️ 常见陷阱
- 训练损失越低越好?错。趋近 0 往往意味着过拟合,真正该看验证集损失。
- 正则化越强越好?不是。λ 过大会把参数压向 0,模型退化成常数而欠拟合。
- 验证集 = 测试集?不是。验证集用来调参,测试集只在最后评估一次,混用会让评估过于乐观。
✅ 本章小结
- 欠拟合:模型太简单,训练/验证损失都高。
- 过拟合:模型太复杂,背下训练集却在验证集上变差。
- L2 正则化:在损失中加入 λ·‖w‖²,惩罚大参数,提升泛化。
📐 L1/L2 正则化推导
正则化在损失函数中加入参数惩罚项,防止权重过大,从而抑制过拟合。
L2 正则化(岭回归 Ridge)对权重平方和加惩罚:
L1 正则化(Lasso)对权重绝对值加惩罚,产生稀疏解:
L2 的梯度更新相当于权重衰减(weight decay),每步将权重缩小 (1−2ηλ) 倍:
🎛 正则强度 λ 对比
λ 控制正则化强度。λ=0 等于无正则化,λ 过大则所有权重趋零(欠拟合)。
| λ 值 | 表现 | 结果 |
|---|---|---|
| λ = 0 | 无惩罚,权重自由增长,完美拟合训练集 | 过拟合 |
| λ = 0.01 | 轻微惩罚,权重适度收敛,泛化好 | 推荐 |
| λ = 0.1 | 强惩罚,权重偏小,拟合能力下降 | 略欠拟合 |
| λ = 1 | 惩罚过强,所有权重趋近 0 | 严重欠拟合 |
💡 Dropout(Srivastava 2014)是另一种正则化:训练时随机丢弃神经元,等效于集成多个子网络。
💻 L2 正则化梯度下降
在标准梯度下降基础上加入 L2 权重衰减项(Python):
import numpy as np
# L2 正则化梯度下降
lam = 0.01 # 正则强度 λ
lr = 0.01 # 学习率 η
for step in range(max_steps):
grad_w = 0.0
for i in range(n):
error = y[i] - (w * x[i] + b)
grad_w += -2 * x[i] * error
grad_w /= n
# L2 正则化:梯度额外加 2λw
grad_w += 2 * lam * w
# 权重衰减更新
w -= lr * grad_w
b -= lr * grad_b # 偏置通常不正则化
# Dropout(训练时)
def dropout(a, drop_rate):
mask = np.random.rand(len(a)) >= drop_rate
return a * mask / (1 - drop_rate)
📚 参考文献与延伸阅读
- Goodfellow, Bengio & Courville, Deep Learning (2016), §5.2 Capacity, Overfitting and Underfitting — 偏差-方差分解与正则化理论
- Srivastava, N. et al. (2014). Dropout: A Simple Way to Prevent Neural Networks from Overfitting. JMLR — Dropout 正则化的经典论文
- Tibshirani, R. (1996). Regression Shrinkage and Selection via the Lasso. — L1 正则化与稀疏解
- scikit-learn: Ridge & Lasso — L2/L1 正则化的工业实现
📝 课后练习
检验你的理解——答对为止