共计 1614 个字符,预计需要花费 5 分钟才能阅读完成。
核心概念
欠拟合与过拟合
- 欠拟合 :模型在训练集和测试集上表现都很差,通常是因为模型太简单,无法捕捉数据中的复杂模式。常见原因包括:
- 模型复杂度不足(如线性模型拟合非线性数据)
- 特征工程不充分(缺少关键特征)
-
训练数据量太少

-
过拟合 :模型在训练集上表现很好但在测试集上表现差,通常是因为模型过于复杂,记住了训练数据的噪声而非学习通用模式。常见原因包括:
- 模型复杂度过高(如深度神经网络层数过多)
- 训练数据不足或缺乏多样性
- 训练迭代次数过多(未及时停止)
偏差 - 方差权衡
- 高偏差 :模型过于简单,导致预测值与真实值差距大(欠拟合)
- 高方差 :模型过于复杂,对训练数据过度敏感(过拟合)
- 理想模型应在偏差和方差之间取得平衡
痛点分析
典型场景
- 欠拟合场景 :
- 训练集和验证集准确率都很低
- 模型预测结果与真实值偏差较大
-
特征重要性分析显示关键特征未被有效利用
-
过拟合场景 :
- 训练集准确率高但验证集准确率低
- 模型在噪声数据上表现异常好
- 不同训练批次间模型表现波动大
技术方案
L2 正则化
- 数学原理 :在损失函数中添加权重向量的 L2 范数作为惩罚项
新损失函数 = 原损失函数 + λ * ||w||² - λ:正则化强度超参数
-
||w||²:所有权重平方和
-
实现效果 :
- 限制权重值过大
-
使模型参数分布更平滑
-
PyTorch 实现 :
import torch import torch.nn as nn model = nn.Sequential(nn.Linear(100, 50), nn.ReLU(), nn.Linear(50, 10) ) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01, weight_decay=0.01) # weight_decay 即 λ
Dropout
- 工作机制 :
- 训练时随机 ” 关闭 ” 部分神经元(置为 0)
- 预测时使用全部神经元但按比例缩小权重
-
相当于对多个子模型进行集成
-
实现要点 :
- 通常设置在 0.2-0.5 之间的关闭概率
-
仅用于全连接层和卷积层
-
TensorFlow 实现 :
import tensorflow as tf model = tf.keras.Sequential([tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.3), # 30% 的神经元会被随机关闭 tf.keras.layers.Dense(10, activation='softmax') ])
数据增强
- 图像数据常用方法 :
- 随机旋转 / 翻转
- 颜色抖动
- 随机裁剪
-
添加噪声
-
文本数据常用方法 :
- 同义词替换
- 随机插入 / 删除
-
回译(翻译成其他语言再译回)
-
PyTorch 图像增强示例 :
from torchvision import transforms transform = transforms.Compose([transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness=0.2, contrast=0.2), transforms.ToTensor()])
性能考量
| 方法 | 训练开销 | 推理开销 | 适用场景 |
|---|---|---|---|
| L2 正则化 | 低 | 无 | 所有模型 |
| Dropout | 中 | 无 | 深度神经网络 |
| 数据增强 | 高 | 无 | 数据不足时 |
| 提前终止 | 可变 | 无 | 训练过程容易过拟合时 |
避坑指南
- 正则化强度选择 :
- λ 过大导致欠拟合
- λ 过小无法抑制过拟合
-
建议使用网格搜索确定最佳值
-
Dropout 使用误区 :
- 不要在测试时忘记关闭 Dropout
-
不要在所有层都使用相同 dropout 率
-
数据增强注意事项 :
- 确保增强操作不会改变数据语义
- 对验证 / 测试集不要使用增强
思考题
- 当你的模型在训练集和验证集上表现都很差时,除了增加模型复杂度,还有哪些可能的改进方向?
- 为什么 Dropout 在测试时需要按比例缩小权重?请从数学期望的角度解释。
- 对于时间序列数据,哪些数据增强方法可能适用?它们需要满足什么约束条件?
正文完
发表至: 未分类
近两天内

