SilverIce Toolbox
Back to course

Stage 1 / Chapter 4

第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

PhenomenonTrain ErrorVal ErrorCauseSolution
Underfitting (high bias)HighHighModel too simpleMore features, bigger model
Just RightLowLowComplexity matches data
Overfitting (high variance)Very lowHighModel memorizes noiseMore 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_MSE

The 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\
梯度2λw(与 w 成正比)λ·sign(w)(常数)
解的特性权重趋向于都很小,但非零产生稀疏解(某些权重变为精确的 0)
几何约束圆形菱形(在二维中)
用途防止过拟合特征选择

为什么 L1 会产生稀疏解?

因为 L1 的约束区域是菱形(超立方体)。损失函数的等高线与菱形约束区域的交点,更容易出现在顶点上。而顶点对应某些坐标恰好为 0。

实际意义:

  • L2:所有特征都保留,但系数都变小 → "大家一起出力"
  • L1:不重要的特征被直接剔除(系数变 0)→ "精简团队"

English Explanation

PropertyL2 (Ridge)L1 (Lasso)
Penalty`\w\
Gradient2λwλ·sign(w)
SolutionSmall but non-zero weightsSparse solution (exact zeros)
Use casePrevent overfittingFeature 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 完整实现:正则化可视化

代码案例

python
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.567
L1 自动把 6 个不重要的高阶项系数压缩到 0,实现了自动特征选择。

---

4.5 正则化的调参策略 | Tuning Regularization

中文解释

如何选择 λ?

  1. 网格搜索:尝试 λ = [0.001, 0.01, 0.1, 1, 10, 100]
  2. 交叉验证:对每个 λ,用 K-Fold 计算验证集误差
  3. 选择验证误差最小的 λ

偏差-方差与 λ 的关系

λ ↑ → 模型更简单 → 高偏差(欠拟合)
λ ↓ → 模型更复杂 → 高方差(过拟合)

学习曲线诊断

  • 如果训练误差和验证误差都很高 → 增大模型复杂度 或 减小 λ
  • 如果训练误差很低但验证误差很高 → 减小模型复杂度 或 增大 λ
  • 如果两者差距随数据量增加而缩小 → 收集更多数据可能有效

English Explanation

Choosing λ:

  1. Grid search over [0.001, 0.01, 0.1, 1, 10, 100]
  2. K-Fold cross-validation for each λ
  3. 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

  1. 正则化梯度推导:对 J = MSE + λΣw²,写出 ∂J/∂w 和参数更新公式,解释为什么叫"权重衰减"。
  1. L1 稀疏性实验:在 make_regression 数据上分别用 Ridge 和 Lasso(相同 λ)训练,记录并对比非零系数数量随 λ 变化的关系图。
  1. 过拟合诊断:生成 10 个样本的 sin(x) 数据,分别用 degree=1, 3, 5, 15 的多项式拟合(无正则化)。画出训练误差和验证误差随模型复杂度的变化曲线(验证曲线)。
  1. 弹性网络:Elastic Net 结合了 L1 和 L2:J = MSE + λ₁Σ|w| + λ₂Σw²。在 sklearn 中使用 ElasticNet,对比单独使用 L1 和 L2 的效果。
  1. Dropout 预习:了解深度学习中另一种正则化方法 Dropout。它与 L1/L2 的正则化思路有何不同?(提示:从"参数惩罚"vs"训练时随机失活神经元"的角度思考)