共计 1435 个字符,预计需要花费 4 分钟才能阅读完成。
为什么模型诊断是机器学习的关键环节
模型诊断就像医生的听诊器,能快速定位模型是『学不会』(欠拟合)还是『学过头』(过拟合)。它连接着数据预处理和模型优化,直接影响最终部署效果。掌握诊断技巧,能节省 80% 盲目调参的时间。

问题 1:欠拟合的三大特征与解决方案
- 模型过于简单
当模型连训练数据都难以拟合时(比如用线性模型处理非线性数据),就像小学生做高数题。解决方案: - 换用更复杂的模型架构(如从 LR 切换到 DNN)
-
增加网络层数或神经元数量
-
特征工程不足
如果输入特征不能有效表征问题(比如预测房价却只有面积特征),模型再复杂也徒劳。建议: - 通过 PCA/ 互信息筛选有效特征
-
添加交叉特征(如面积×地段系数)
-
训练时间不足
常见于过早停止训练(观察训练 loss 曲线是否持续下降)。对策: - 增加 epoch 至损失曲线平稳
- 使用学习率 warmup 策略
问题 2:偏差 - 方差分解矩阵图解
通过这个 2×2 矩阵理解模型表现:
| 低方差 | 高方差 | |
|---|---|---|
| 低偏差 | 理想状态(左上) | 过拟合(右上) |
| 高偏差 | 欠拟合(左下) | 最差情况(右下) |
- 高偏差 + 低方差 :模型过于简单,如问题 1 中的情况
- 低偏差 + 高方差 :模型记住了噪声,典型过拟合
问题 3:三大过拟合解决方案对比
L2 正则化(权重衰减)
# PyTorch 实现
optimizer = torch.optim.Adam(model.parameters(),
lr=0.001,
weight_decay=0.01) # λ=0.01
原理:在损失函数中增加权重平方和项($L = L_0 + λ\sum w_i^2$),限制参数值域
Dropout
self.net = nn.Sequential(nn.Linear(784, 256),
nn.Dropout(p=0.5), # 随机丢弃 50% 神经元
nn.ReLU())
原理:前向传播时随机断开神经元连接,相当于训练多个子模型
数据增强
transforms.Compose([transforms.RandomHorizontalFlip(), # 随机水平翻转
transforms.ColorJitter(0.2, 0.2) # 颜色抖动
])
原理:通过几何变换 / 颜色扰动生成『新』样本,本质是增加训练数据多样性
实战代码:联合应用技巧
class Net(nn.Module):
def __init__(self):
super().__init__()
self.layers = nn.Sequential(nn.Linear(784, 512),
nn.Dropout(0.4), # 经验值:隐藏层常用 0.3-0.5
nn.ReLU(),
nn.Linear(512, 10)
)
def forward(self, x):
return self.layers(x)
# 同时使用 L2 正则化和 Dropout
model = Net()
optimizer = torch.optim.SGD(model.parameters(),
lr=0.01,
weight_decay=1e-4) # 小数据集 λ 调小
新手避坑指南
-
过早停止正则化
发现验证集效果下降就取消 Dropout?其实可能是模型正在摆脱局部最优 -
盲目增加数据量
低质量数据反而会引入噪声,先用小样本验证模型容量是否足够 -
忽略学习率影响
过大的学习率会导致 loss 震荡(误判为欠拟合),先用 LR Finder 确定合适范围
思考题
- 当训练 loss 和验证 loss 同步震荡时,除了学习率问题,还可能是什么原因?(提示:检查 batch_size 和梯度裁剪)
- 如何设计对照组实验验证数据增强的有效性?(提示:固定随机种子对比增强前后效果)
正文完
发表至: 未分类
近三天内
