偏差与方差
问题
什么是偏差-方差权衡?过拟合和欠拟合的本质是什么?如何通过正则化等手段找到平衡?
答案
偏差-方差权衡(Bias-Variance Tradeoff) 是理解模型泛化能力的核心框架。模型的总误差可以分解为三部分:
一、偏差与方差的定义
| 概念 | 定义 | 直觉理解 |
|---|---|---|
| 偏差(Bias) | 模型预测值的期望与真实值的偏离程度 | 模型"系统性"地偏离正确答案——学不到 |
| 方差(Variance) | 模型在不同训练集上的预测变化程度 | 模型对训练数据过于敏感——学太多 |
| 不可约误差 | 数据本身的噪声 | 无论模型多好都无法消除 |
射击类比
想象射击打靶:
- 低偏差 + 低方差 = 弹孔都集中在靶心附近 ✅
- 高偏差 + 低方差 = 弹孔集中但偏离靶心(欠拟合)
- 低偏差 + 高方差 = 弹孔散布在靶心周围(过拟合)
- 高偏差 + 高方差 = 弹孔既散又偏(最差情况)
二、过拟合与欠拟合
| 欠拟合(Underfitting) | 过拟合(Overfitting) | |
|---|---|---|
| 表现 | 训练集和测试集都差 | 训练集好、测试集差 |
| 原因 | 模型太简单 | 模型太复杂 |
| 偏差/方差 | 高偏差、低方差 | 低偏差、高方差 |
| 类比 | 用直线去拟合曲线 | 把噪声点都记住了 |
三、应对过拟合的方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| L2 正则化(Ridge) | 在损失函数中加 ,惩罚大权重 | 通用 |
| L1 正则化(Lasso) | 在损失函数中加 ,产生稀疏解 | 需要特征选择 |
| Dropout | 训练时随机丢弃一定比例的神经元 | 深度学习 |
| 早停(Early Stopping) | 验证集 Loss 不再下降时停止训练 | 深度学习 |
| 数据增强 | 通过变换增加训练数据多样性 | 图像、文本 |
| 减小模型 | 减少层数、参数量 | 模型明显过大 |
| 增加数据 | 获取更多训练数据 | 数据量不足 |
| 交叉验证 | 更可靠地评估泛化能力 | 数据量较小 |
| 集成学习 | 多个模型组合(Bagging 降方差) | 通用 |
四、正则化详解
L1 vs L2 正则化
为什么 L1 能产生稀疏解?
L1 的梯度在 处不连续(有"尖角"),优化过程中很容易把某些权重精确地推到 0,从而实现特征选择。L2 的梯度在 处平滑,权重趋近于 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,然后通过可学习的参数恢复表达能力。它的作用:
- 加速训练:减少内部协变量偏移(Internal Covariate Shift)
- 允许更高学习率:归一化后梯度更稳定
- 轻微正则化:每个 batch 的统计量有随机性,类似 Dropout 的效果
- 缓解梯度消失/爆炸
Q4: Early Stopping 的原理是什么?如何设置?
答案: 监控验证集 Loss,当连续 N 个 epoch(patience)验证 Loss 不再下降时,停止训练并回退到验证 Loss 最低的那个 epoch 的模型参数。
关键参数:
- patience:容忍验证 Loss 不下降的轮数,通常 5~20
- min_delta:最小改善量,低于此值视为没有改善
- restore_best_weights:回退到最佳模型参数