第9章:深度学习的工程实践
超参数调优
1. 超参数概述
定义:超参数是模型训练前需手动设定的参数(如学习率、批量大小),与模型从数据中自动学习的参数(如权重)形成对比。
重要性:直接影响模型性能、训练速度和收敛性。
常见超参数:
- 学习率(Learning Rate)
- 批量大小(Batch Size)
- 迭代次数(Epochs)
- 网络层数与神经元数量
- 正则化系数(如L2惩罚项λ)
- 优化器参数(如Adam的β₁、β₂)
2. 超参数调优方法
2.1 网格搜索(Grid Search)
- 原理:遍历所有预定义的超参数组合,选择验证集性能最优的组合。
- 优缺点:
✅ 简单直观,适合低维参数空间。
❌ 计算成本高,维度灾难(参数增多时组合数指数增长)。
2.2 随机搜索(Random Search)
- 原理:从参数分布中随机采样组合,优先探索重要参数。
- 优势:比网格搜索更高效,尤其当某些参数对性能影响较小时。
2.3 贝叶斯优化(Bayesian Optimization)
- 原理:基于历史评估结果构建概率模型(如高斯过程),指导下一步参数选择。
- 适用场景:计算资源有限时,快速逼近最优解。
2.4 自动化调优工具
- 主流工具:
- Hyperopt(基于TPE算法)
- Optuna(支持并行化)
- Keras Tuner(集成于TensorFlow生态)
3. 关键超参数调优策略
3.1 学习率调优
- 常用技巧:
- 使用学习率预热(Learning Rate Warmup)
- 动态调整(如余弦退火、周期性学习率)
- 范围建议:
1e-5到1e-1,可通过学习率扫描(LR Finder)确定初始值。
3.2 批量大小选择
- 权衡因素:
- 大批量:训练稳定,但可能陷入局部最优。
- 小批量:噪声更多,可能帮助逃离局部最优,但需要更小的学习率。
- 经验值:常用32/64/128,显存不足时使用梯度累积(Gradient Accumulation)。
3.3 正则化参数
- L2正则化:λ通常从
1e-4到1e-2开始尝试。 - Dropout率:0.2~0.5适用于全连接层,卷积层可更低(如0.1)。
4. 调优流程示例
- 初步范围设定:通过文献或经验确定参数大致范围。
- 粗调:使用随机搜索缩小范围。
- 精调:在最优区域用贝叶斯优化或网格搜索微调。
- 验证:在独立测试集上评估最终模型。
5. 注意事项
- 避免过拟合验证集:调优后需用全新测试集评估。
- 资源分配:优先调优对性能影响大的参数(如学习率、网络深度)。
- 自动化记录:使用工具(如MLflow、Weights & Biases)跟踪实验记录。
### 代码示例(可选)
```python
# 使用Optuna进行超参数优化示例
import optuna
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
def objective(trial):
n_estimators = trial.suggest_int('n_estimators', 50, 200)
max_depth = trial.suggest_int('max_depth', 3, 10)
model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth)
return cross_val_score(model, X_train, y_train, cv=5).mean()
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
print("最佳参数:", study.best_params)