跳到主要内容

偏差与方差

问题

什么是偏差-方差权衡?过拟合和欠拟合的本质是什么?如何通过正则化等手段找到平衡?

答案

偏差-方差权衡(Bias-Variance Tradeoff) 是理解模型泛化能力的核心框架。模型的总误差可以分解为三部分:

Total Error=Bias2+Variance+Irreducible Error\text{Total Error} = \text{Bias}^2 + \text{Variance} + \text{Irreducible Error}

一、偏差与方差的定义

概念定义直觉理解
偏差(Bias)模型预测值的期望与真实值的偏离程度模型"系统性"地偏离正确答案——学不到
方差(Variance)模型在不同训练集上的预测变化程度模型对训练数据过于敏感——学太多
不可约误差数据本身的噪声无论模型多好都无法消除
射击类比

想象射击打靶:

  • 低偏差 + 低方差 = 弹孔都集中在靶心附近 ✅
  • 高偏差 + 低方差 = 弹孔集中但偏离靶心(欠拟合)
  • 低偏差 + 高方差 = 弹孔散布在靶心周围(过拟合)
  • 高偏差 + 高方差 = 弹孔既散又偏(最差情况)

二、过拟合与欠拟合

欠拟合(Underfitting)过拟合(Overfitting)
表现训练集和测试集都差训练集好、测试集差
原因模型太简单模型太复杂
偏差/方差高偏差、低方差低偏差、高方差
类比用直线去拟合曲线把噪声点都记住了

三、应对过拟合的方法

方法原理适用场景
L2 正则化(Ridge)在损失函数中加 λwi2\lambda\sum w_i^2,惩罚大权重通用
L1 正则化(Lasso)在损失函数中加 λwi\lambda\sum\|w_i\|,产生稀疏解需要特征选择
Dropout训练时随机丢弃一定比例的神经元深度学习
早停(Early Stopping)验证集 Loss 不再下降时停止训练深度学习
数据增强通过变换增加训练数据多样性图像、文本
减小模型减少层数、参数量模型明显过大
增加数据获取更多训练数据数据量不足
交叉验证更可靠地评估泛化能力数据量较小
集成学习多个模型组合(Bagging 降方差)通用

四、正则化详解

L1 vs L2 正则化

LRidge=MSE+λi=1nwi2(L2:权重衰减)L_{\text{Ridge}} = \text{MSE} + \lambda \sum_{i=1}^n w_i^2 \quad \text{(L2:权重衰减)} LLasso=MSE+λi=1nwi(L1:稀疏化)L_{\text{Lasso}} = \text{MSE} + \lambda \sum_{i=1}^n |w_i| \quad \text{(L1:稀疏化)} LElastic Net=MSE+λ1wi+λ2wi2(两者结合)L_{\text{Elastic Net}} = \text{MSE} + \lambda_1 \sum |w_i| + \lambda_2 \sum w_i^2 \quad \text{(两者结合)}

为什么 L1 能产生稀疏解?

L1 的梯度在 wi=0w_i = 0 处不连续(有"尖角"),优化过程中很容易把某些权重精确地推到 0,从而实现特征选择。L2 的梯度在 wi=0w_i = 0 处平滑,权重趋近于 0 但不会精确等于 0。

Dropout

在训练的每个 batch 中,随机将一定比例(如 50%)的神经元输出置为 0。这迫使网络不能依赖任何单个神经元,形成更鲁棒的特征表示。

推理时的行为

训练时使用 Dropout,推理时不使用——所有神经元都参与计算,但输出会乘以保留概率(如 0.5)来补偿。现代框架(PyTorch 的 model.eval())会自动处理这一点。

五、偏差-方差与模型选择

模型偏差方差说明
线性回归简单模型,容易欠拟合
多项式回归(高次)复杂模型,容易过拟合
单棵决策树(深)易过拟合
随机森林Bagging 降低方差
Boosting(如 XGBoost)较低逐步降低偏差
深度神经网络需要正则化控制
集成学习的偏差-方差视角
  • Bagging(如随机森林):降低方差不影响偏差——多个高方差模型平均后更稳定
  • Boosting(如 XGBoost):降低偏差——逐步修正前一个模型的残差

常见面试问题

Q1: 如何判断模型是过拟合还是欠拟合?

答案

情况训练集表现验证/测试集表现诊断
两个都差欠拟合
训练好测试差过拟合
两个都好理想状态

还可以通过学习曲线(Learning Curve)——画训练集/验证集 Loss 随 epoch 的变化:过拟合表现为训练 Loss 持续下降但验证 Loss 先降后升。

Q2: 为什么集成学习能同时降低偏差和方差?

答案

  • Bagging(随机森林):多个模型独立训练后平均,降低方差但偏差不变(多个不相关预测的平均值方差更小)
  • Boosting(XGBoost):每个新模型专门拟合前一个模型的残差(错误),逐步降低偏差
  • Stacking:用元学习器组合多个不同类型的模型,同时优化偏差和方差

Q3: 神经网络为什么需要 Batch Normalization?

答案: Batch Normalization 将每层的输入归一化到均值 0、方差 1,然后通过可学习的参数恢复表达能力。它的作用:

  1. 加速训练:减少内部协变量偏移(Internal Covariate Shift)
  2. 允许更高学习率:归一化后梯度更稳定
  3. 轻微正则化:每个 batch 的统计量有随机性,类似 Dropout 的效果
  4. 缓解梯度消失/爆炸

Q4: Early Stopping 的原理是什么?如何设置?

答案: 监控验证集 Loss,当连续 N 个 epoch(patience)验证 Loss 不再下降时,停止训练并回退到验证 Loss 最低的那个 epoch 的模型参数。

关键参数:

  • patience:容忍验证 Loss 不下降的轮数,通常 5~20
  • min_delta:最小改善量,低于此值视为没有改善
  • restore_best_weights:回退到最佳模型参数

相关链接