用途
该技能用于设计和运行机器学习超参数搜索(调参、sweep、搜索空间优化、AutoML)。其核心原则是:调参应在固定评估协议下改进一个有效基线;在数据验证、防泄漏切分、指标选择、可复现训练和简单基线就绪之前,不应开始调参。
搜索策略选择
资料给出以下策略及其适用场景:
- 手动有依据搜索:早期调试或预算极小时使用,适合由学习曲线和领域知识引导。
- 网格搜索:参数为少量类别/离散值时使用,在高维空间浪费严重。
- 随机搜索:宽泛空间的强默认选择,当只有部分参数重要时往往优于网格搜索。
- 贝叶斯/TPE:中等预算且单次试验昂贵时使用,适合结构化连续/离散空间。
- Hyperband/ASHA:大量深度学习试验且早期有信号时使用,要求学习曲线可比且早停指标合理。
- 基于种群的训练:用于调度和非平稳超参数,更复杂,适用于强化学习和大型训练预算。
- AutoML:需要强基线或表格任务生产力时使用,需验证泄漏、可解释性和部署约束。
工具方面:Optuna 是 Python 搜索的灵活默认选择;Ray Tune 适合分布式 sweep、调度器和 Ray Train 集成;FLAML 强调高性价比 AutoML;AutoGluon 适合表格、多模态和时间序列基线;W&B sweeps 与实验跟踪集成良好。
使用方式
Optuna 带剪枝的目标函数(Python 蓝图)
Optuna 可根据中间验证分数在训练循环早期剪掉无望的试验。资料给出的代码蓝图包括:在训练与验证函数中按 epoch 计算验证损失,通过 trial.report(val_loss, epoch) 上报中间值,并用 trial.should_prune() 判断是否抛出 optuna.exceptions.TrialPruned()。目标函数中定义搜索空间:lr 用 trial.suggest_float("lr", 1e-5, 1e-2, log=True),optimizer 用 trial.suggest_categorical 在 Adam/SGD/RMSprop 中选择,batch_size 在 16/32/64 中选择,dropout_rate 用 trial.suggest_float("dropout_rate", 0.1, 0.5)。运行研究时可用 optuna.create_study(direction="minimize", pruner=optuna.pruners.MedianPruner()) 并调用 study.optimize。
搜索空间设计
使用反映尺度的分布:学习率、权重衰减、正则化强度、树的最小子节点权重通常需要对数均匀或类别对数网格;深度、层数、隐藏大小、批大小、估计器数量为离散值;优化器、调度器、增强策略、模型族、特征集为类别值。避免搜索无效组合,编码条件空间:max_depth 仅用于树模型,LoRA rank 仅用于 PEFT,warmup ratio 仅用于带调度的优化器。首次搜索应宽而浅,再围绕有希望的区域收窄。
W&B Sweep YAML 蓝图(sweep.yaml)
W&B Sweeps 跨多个分布式代理运行超参数搜索。资料给出的配置示例包含:program: train.py、method: bayes、metric 为 val_loss 且 goal 为 minimize;参数中 learning_rate 用 log_uniform_values(1e-5 到 1e-2),batch_size 取值 [16, 32, 64],epochs 固定为 20,dropout 用 uniform(0.1 到 0.5),optimizer 取值 ["adam", "adamw", "sgd"];early_terminate 类型为 hyperband,min_iter 为 3,eta 为 2。
Ray Tune 分布式 Sweep 与 ASHA 调度器
Ray Tune 可将 sweep 分布到集群,管理大规模超参数调优。资料示例定义 train_fn(config),在每个 epoch 调用 tune.report(loss=val_loss, epoch=epoch);定义 ASHAScheduler(time_attr="epoch", metric="loss", mode="min", max_t=100, grace_period=5, reduction_factor=2);运行 tune.run 时设置 resources_per_trial={"cpu": 2, "gpu": 0.5}(每 GPU 运行两个试验)、config 中 lr 用 tune.loguniform(1e-5, 1e-2)、batch_size 用 tune.choice([16, 32, 64])、num_samples=30、scheduler=asha_scheduler。
值得调优的参数
深度学习:学习率、warmup、调度器、优化器、权重衰减;批大小或有效批大小、梯度累积;dropout、标签平滑、增强强度;架构宽度/深度、序列长度、图像分辨率;损失参数、类别权重、focal loss gamma;PEFT 的 rank/alpha/dropout 及目标模块。
树/表格模型:学习率、估计器/迭代次数、最大深度/叶子数;子采样、列采样、最小子节点样本/权重;L1/L2 正则化、最小分裂增益;类别处理及支持时的单调约束。
RAG 与嵌入系统:分块大小/重叠、嵌入模型、top-k、混合权重、重排器、提示模板、上下文预算、分数阈值。
早停与剪枝
早停可避免浪费算力,但可能偏向快速起步的配置。应使用耐心值和最小资源阈值。ASHA 和 Hyperband 需要单调有意义的指标和可比的训练曲线。对噪声指标应平滑或要求多次评估。最终选择前,始终将有望的配置运行到完整预算。
学习率查找
学习率范围测试可快速为神经网络找到有用的 LR 区间:在短运行中逐步提高 LR,绘制损失,选择低于发散点、通常也低于最陡下降点的值。之后重新运行正式训练;LR finder 输出是指导,不是最终实验。
可复现性
记录每个试验的参数、随机种子、代码版本、数据版本、硬件、依赖、指标、产物和失败原因。使用确定性试验 ID。保存 top-k 配置,而不仅是最佳配置。分布式 sweep 中,确保失败或被抢占的试验被正确标记,恢复的试验不重复结果。
分析结果
sweep 后检查参数重要性、平行坐标图、指标分布和学习曲线。寻找不稳定区域、对验证集过拟合、无效试验和交互作用。在未触碰的测试集或重复种子上确认获胜配置。若改进在噪声范围内,优先选择更简单或更便宜的模型。
常见调参错误
在测试集或公开排行榜上调参;参数过多而试验过少;对对数尺度参数使用线性采样;忽略指示不稳定区域的失败试验;让 AutoML 通过预处理泄漏目标派生特征;仅凭最佳验证分数选择而不重训或测试确认;比较使用不同数据快照或预处理代码的试验。
来源
Optuna 文档:https://optuna.readthedocs.io/ Ray Tune 文档:https://docs.ray.io/en/latest/tune/ FLAML 文档:https://microsoft.github.io/FLAML/ AutoGluon 文档:https://auto.gluon.ai/ scikit-learn 超参数调优文档:https://scikit-learn.org/stable/modules/grid_search.html W&B Sweeps 文档:https://docs.wandb.ai/guides/sweeps/