共计 1703 个字符,预计需要花费 5 分钟才能阅读完成。
基本概念解析
欠拟合 (Underfitting) 和过拟合 (Overfitting) 是机器学习模型训练过程中最常见的两类问题。从数学角度可以这样定义:
-
欠拟合:模型在训练集和验证集上都表现不佳,表现为高偏差(High Bias)。数学表征为:
$$J_{train}(\theta) \approx J_{val}(\theta) \gg 0$$ -
过拟合:模型在训练集上表现很好但在验证集上表现差,表现为高方差(High Variance)。数学表征为:
$$J_{train}(\theta) \ll J_{val}(\theta)$$
可视化诊断
通过绘制学习曲线可以直观识别这两种问题:
- 欠拟合的典型特征:
- 训练和验证误差曲线都维持在高位
- 两条曲线非常接近
-
增加数据量不会显著改善性能
-
过拟合的典型特征:
- 训练误差很低但验证误差很高
- 两条曲线之间存在明显 gap
- 增加数据量可能改善泛化能力

图:x 轴表示训练样本数量,y 轴表示误差值。蓝色为训练误差,红色为验证误差。左图为欠拟合,右图为过拟合。
解决欠拟合的两种方法
1. 多项式特征扩展
通过增加特征维度提升模型表达能力:
from sklearn.preprocessing import PolynomialFeatures
# 将原始特征转换为二次多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
2. 集成学习方法
使用 Boosting 等算法组合多个弱学习器:
from sklearn.ensemble import GradientBoostingClassifier
# 使用 100 个决策树构建 GBDT 模型
gbdt = GradientBoostingClassifier(n_estimators=100)
gbdt.fit(X_train, y_train)
解决过拟合的两种方法
1. Dropout 正则化
在 PyTorch 中实现 Dropout 层:
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(784, 512)
self.dropout = nn.Dropout(0.5) # 50% 的神经元失活
self.fc2 = nn.Linear(512, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = self.dropout(x) # 只在训练时生效
x = self.fc2(x)
return x
2. 早停法(Early Stopping)
监控验证集性能实现早停:
from pytorch_lightning.callbacks import EarlyStopping
# 当验证损失连续 3 个 epoch 没有下降时停止训练
early_stop = EarlyStopping(
monitor='val_loss',
patience=3,
mode='min'
)
trainer = Trainer(callbacks=[early_stop])
性能考量
- 计算开销对比:
- 多项式特征扩展会增加 O(n^2)的内存消耗
- Dropout 在训练时增加约 10-20% 的计算量
-
早停法实际会减少总训练时间
-
超参数调优策略:
- 使用网格搜索确定最佳组合
- 建议先粗调再细调
from sklearn.model_selection import GridSearchCV
params = {'learning_rate': [0.01, 0.1, 0.5],
'max_depth': [3, 5, 7]
}
gs = GridSearchCV(estimator, params, cv=5)
gs.fit(X, y)
避坑指南
- 验证集划分比例:
- 小数据集(10k 样本):建议 20-30%
-
大数据集(100k+ 样本):5-10% 即可
-
学习率与正则化协同调整:
- 高学习率需要配合更强的正则化
- 使用 Adam 等自适应优化器可降低调参难度
开放性问题
如何设计动态调整正则化强度的算法?一些可能方向:
– 基于验证集性能自动调节 Dropout 率
– 根据梯度大小自适应调整 L2 系数
– 在训练不同阶段采用不同的正则化策略
正文完
发表至: 未分类
近一天内
