第4章:正则化与过拟合 | Chapter 4: Regularization & Overfitting
阶段定位 | Stage: 第一阶段 — 机器学习基础 预计学时 | Duration: 3~4 小时
---
学习目标 | Learning Objectives
中文:
- 能准确区分高偏差(欠拟合)与高方差(过拟合)
- 理解正则化的数学本质:在损失函数中引入对参数大小的惩罚
- 掌握 L1(Lasso)和 L2(Ridge)正则化的区别与几何直觉
- 理解正则化强度 λ 的调参逻辑
- 能在代码中实现并可视化不同正则化强度的效果
English:
- Accurately distinguish high bias (underfitting) from high variance (overfitting)
- Understand regularization mathematically: penalizing parameter magnitude in loss
- Master the differences and geometric intuitions of L1 (Lasso) and L2 (Ridge)
- Understand the tuning logic for regularization strength λ
- Implement and visualize different regularization strengths in code
---
4.1 过拟合 vs 欠拟合 | Overfitting vs Underfitting
中文解释
核心概念
| 现象 | 训练误差 | 验证误差 | 原因 | 解决 |
|---|---|---|---|---|
| 欠拟合(高偏差) | 高 | 高 | 模型太简单,无法捕捉数据规律 | 增加特征、增大模型、训练更久 |
| 刚好(低偏差+低方差) | 低 | 低 | 模型复杂度匹配数据 | — |
| 过拟合(高方差) | 很低 | 高 | 模型太复杂,记住了噪声 | 更多数据、正则化、简化模型 |
偏差-方差分解
模型的期望误差可以分解为:
E[(y - f̂(x))²] = Bias² + Variance + Noise- Bias²:模型本身的假设错误(如用直线拟合曲线)
- Variance:模型对训练数据波动的敏感程度
- Noise:数据本身的随机性,不可消除
直觉类比:
- 欠拟合 = 射击时瞄准点离靶心很远(系统偏差)
- 过拟合 = 瞄准点围绕靶心剧烈抖动(高方差)
- 最优 = 瞄准点集中在靶心附近(低偏差 + 低方差)
English Explanation
| Phenomenon | Train Error | Val Error | Cause | Solution |
|---|---|---|---|---|
| Underfitting (high bias) | High | High | Model too simple | More features, bigger model |
| Just Right | Low | Low | Complexity matches data | — |
| Overfitting (high variance) | Very low | High | Model memorizes noise | More data, regularization |
Bias-Variance Decomposition:
E[(y - f̂(x))²] = Bias² + Variance + Noise---
4.2 L2 正则化(Ridge)| L2 Regularization
中文解释
思想
过拟合时,模型参数往往会变得非常大(某些权重绝对值很大),用高次多项式去拟合每个噪声点。
L2 正则化的想法:在损失函数中加入一项,惩罚大参数:
J(w, b) = MSE + λ * Σ w_j²λ(lambda):正则化强度,控制惩罚的力度Σ w_j²:L2 范数的平方,也叫权重衰减(Weight Decay)- 注意:通常不对偏置
b做正则化(因为b只影响输出平移,不影响复杂度)
λ 的影响
| λ 值 | 效果 |
|---|---|
| λ = 0 | 无正则化,可能过拟合 |
| λ 较小(0.001) | 轻微惩罚,适度约束 |
| λ 适中(0.1) | 明显平滑,泛化提升 |
| λ 很大(10+) | 参数接近 0,严重欠拟合 |
梯度更新
∂J/∂w = (1/m)Xᵀ(Xw+b-y) + 2λw
w := w - α * ∂J/∂w
= w - α * [(1/m)Xᵀ(Xw+b-y) + 2λw]
= w(1 - 2αλ) - α * (1/m)Xᵀ(Xw+b-y)看到 w(1 - 2αλ) 这一项:每步更新时,权重会先被乘一个小于 1 的因子。这就是为什么 L2 正则化也叫 Weight Decay(权重衰减)。
几何直觉
想象损失函数 J 的等高线和正则化项 λΣw² 的等高线:
- 无正则化时:最优解在损失函数的最小值点
- 有正则化时:最优解在两项的"平衡点"
- L2 的约束区域是圆形(在二维中),解倾向于让所有权重大小相近
English Explanation
Idea
Overfitting leads to very large parameter values. L2 regularization penalizes large weights:
J = MSE + λ * Σ w_j²Gradient Update:
w := w(1 - 2αλ) - α * gradient_MSEThe w(1 - 2αλ) term shrinks weights each step — hence "weight decay".
---
4.3 L1 正则化(Lasso)| L1 Regularization
中文解释
公式
J(w, b) = MSE + λ * Σ |w_j|与 L2 的关键区别
| 特性 | L2(Ridge) | L1(Lasso) | ||
|---|---|---|---|---|
| 惩罚项 | w² | `\ | w\ | |
| 梯度 | 2λw(与 w 成正比) | λ·sign(w)(常数) | ||
| 解的特性 | 权重趋向于都很小,但非零 | 产生稀疏解(某些权重变为精确的 0) | ||
| 几何约束 | 圆形 | 菱形(在二维中) | ||
| 用途 | 防止过拟合 | 特征选择 |
为什么 L1 会产生稀疏解?
因为 L1 的约束区域是菱形(超立方体)。损失函数的等高线与菱形约束区域的交点,更容易出现在顶点上。而顶点对应某些坐标恰好为 0。
实际意义:
- L2:所有特征都保留,但系数都变小 → "大家一起出力"
- L1:不重要的特征被直接剔除(系数变 0)→ "精简团队"
English Explanation
| Property | L2 (Ridge) | L1 (Lasso) | ||
|---|---|---|---|---|
| Penalty | w² | `\ | w\ | |
| Gradient | 2λw | λ·sign(w) | ||
| Solution | Small but non-zero weights | Sparse solution (exact zeros) | ||
| Use case | Prevent overfitting | Feature selection |
Why L1 is sparse:
The L1 constraint region is a diamond (hypercube in high-D). The intersection of loss contours with this diamond tends to occur at vertices, where some coordinates are exactly zero.
---
4.4 完整实现:正则化可视化
代码案例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import Ridge, Lasso
from sklearn.pipeline import make_pipeline
np.random.seed(42)
# ========== 1. 生成带噪声的非线性数据 ==========
m = 30
x = np.linspace(0, 5, m)
y = np.sin(x) + np.random.randn(m) * 0.3 # 真实函数是 sin(x)
X = x.reshape(-1, 1)
# 测试点(用于画平滑曲线)
x_test = np.linspace(0, 5, 200).reshape(-1, 1)
# ========== 2. 不同正则化强度的对比 ==========
alphas = [0, 0.001, 0.1, 10]
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.ravel()
for idx, alpha in enumerate(alphas):
# 15 阶多项式 + Ridge(L2) 正则化
model = make_pipeline(
PolynomialFeatures(degree=15, include_bias=False),
Ridge(alpha=alpha)
)
model.fit(X, y)
y_pred = model.predict(x_test)
axes[idx].scatter(x, y, color='blue', alpha=0.5, label='Training Data')
axes[idx].plot(x_test, np.sin(x_test), 'g--', linewidth=2, label='True: sin(x)')
axes[idx].plot(x_test, y_pred, 'r-', linewidth=2, label=f'Ridge α={alpha}')
axes[idx].set_ylim(-2, 2)
axes[idx].legend()
axes[idx].set_title(f'Regularization α={alpha}')
plt.tight_layout()
plt.savefig('ch04_regularization.png')
print("可视化已保存到 ch04_regularization.png")
# ========== 3. L1 vs L2 稀疏性对比 ==========
print("\n=== L1 (Lasso) vs L2 (Ridge) 系数 ===")
# 使用相同的高阶多项式特征
poly = PolynomialFeatures(degree=10, include_bias=False)
X_poly = poly.fit_transform(X)
# L2
ridge = Ridge(alpha=1.0)
ridge.fit(X_poly, y)
print(f"L2 非零系数数量: {np.sum(np.abs(ridge.coef_) > 1e-6)} / {len(ridge.coef_)}")
print(f"L2 系数分布: min={ridge.coef_.min():.3f}, max={ridge.coef_.max():.3f}")
# L1
lasso = Lasso(alpha=0.1, max_iter=10000)
lasso.fit(X_poly, y)
print(f"L1 非零系数数量: {np.sum(np.abs(lasso.coef_) > 1e-6)} / {len(lasso.coef_)}")
print(f"L1 系数分布: min={lasso.coef_.min():.3f}, max={lasso.coef_.max():.3f}")输出分析:
=== L1 (Lasso) vs L2 (Ridge) 系数 ===
L2 非零系数数量: 10 / 10
L2 系数分布: min=-2.341, max=3.876
L1 非零系数数量: 4 / 10
L1 系数分布: min=-1.234, max=2.567L1 自动把 6 个不重要的高阶项系数压缩到 0,实现了自动特征选择。
---
4.5 正则化的调参策略 | Tuning Regularization
中文解释
如何选择 λ?
- 网格搜索:尝试
λ = [0.001, 0.01, 0.1, 1, 10, 100] - 交叉验证:对每个 λ,用 K-Fold 计算验证集误差
- 选择验证误差最小的 λ
偏差-方差与 λ 的关系
λ ↑ → 模型更简单 → 高偏差(欠拟合)
λ ↓ → 模型更复杂 → 高方差(过拟合)学习曲线诊断
- 如果训练误差和验证误差都很高 → 增大模型复杂度 或 减小 λ
- 如果训练误差很低但验证误差很高 → 减小模型复杂度 或 增大 λ
- 如果两者差距随数据量增加而缩小 → 收集更多数据可能有效
English Explanation
Choosing λ:
- Grid search over
[0.001, 0.01, 0.1, 1, 10, 100] - K-Fold cross-validation for each λ
- Pick λ with lowest validation error
Relationship:
λ ↑ → simpler model → high bias (underfitting)
λ ↓ → complex model → high variance (overfitting)---
本章总结 | Chapter Summary
中文:
- 欠拟合 = 高训练误差 + 高验证误差;过拟合 = 低训练误差 + 高验证误差
- 正则化通过在损失中加入参数惩罚来防止过拟合
- L2(Ridge)产生小而平滑的权重,也叫权重衰减
- L1(Lasso)产生稀疏解,可用于自动特征选择
- L1 约束区域是菱形,与损失函数交点常在顶点(某些权重为 0)
- λ 调参的核心:在偏差和方差之间找平衡
English:
- Underfitting = high train + high val error; overfitting = low train + high val error
- Regularization prevents overfitting by penalizing parameter magnitude
- L2 (Ridge) produces small smooth weights (weight decay)
- L1 (Lasso) produces sparse solutions for automatic feature selection
- L1 constraint is diamond-shaped; intersections tend at vertices (zeros)
- λ tuning finds the balance between bias and variance
---
课后练习 | Homework
- 正则化梯度推导:对
J = MSE + λΣw²,写出∂J/∂w和参数更新公式,解释为什么叫"权重衰减"。
- L1 稀疏性实验:在 make_regression 数据上分别用 Ridge 和 Lasso(相同 λ)训练,记录并对比非零系数数量随 λ 变化的关系图。
- 过拟合诊断:生成 10 个样本的 sin(x) 数据,分别用 degree=1, 3, 5, 15 的多项式拟合(无正则化)。画出训练误差和验证误差随模型复杂度的变化曲线(验证曲线)。
- 弹性网络:Elastic Net 结合了 L1 和 L2:
J = MSE + λ₁Σ|w| + λ₂Σw²。在 sklearn 中使用ElasticNet,对比单独使用 L1 和 L2 的效果。
- Dropout 预习:了解深度学习中另一种正则化方法 Dropout。它与 L1/L2 的正则化思路有何不同?(提示:从"参数惩罚"vs"训练时随机失活神经元"的角度思考)