关于 ml-hyperparameter-tuning
面向机器学习从业者的超参数搜索设计与执行指南,强调先建立有效基线和固定评估流程,再选择搜索策略、分析结果并验证配置。
主要功能
- 01比较网格、随机与贝叶斯搜索策略
- 02设计连续、离散及条件搜索空间
- 03使用剪枝和早停控制试验
- 04记录试验并分析搜索结果
适用场景
- 01为模型选择合适的搜索方法
- 02减少无效超参数试验的计算
- 03复核最佳配置并确认泛化表现
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill ml-hyperparameter-tuning安装后在 Claude Code 中输入/ml-hyperparameter-tuning确认已加载。
详细介绍
ML 超参数调优
概述
在设计和执行超参数搜索时使用此技能。调优应在固定评估协议下改进有效的基线。在数据验证、防止数据泄漏的切分、指标选择、可复现训练和简单基线准备就绪之前,不要进行调优。
搜索策略选择
| 策略 | 适用场景 | 备注 |
|---|---|---|
| 基于经验的手动搜索 | 早期调试或预算非常有限 | 有学习曲线和领域知识指导时效果最好 |
| 网格搜索 | 类别型/离散参数较少 | 在高维空间中效率低下 |
| 随机搜索 | 广阔搜索空间的强默认选择 | 仅有部分参数起作用时,通常优于网格搜索 |
| 贝叶斯/TPE | 预算适中且试验成本高 | 适用于结构化的连续/离散空间 |
| Hyperband/ASHA | 有许多可提前观察到效果的深度学习试验 | 需要可比较的学习曲线和合理的提前停止指标 |
| 基于群体的训练 | 调度策略和非平稳超参数 | 更复杂;适用于 RL 和大型训练预算 |
| AutoML | 需要强基线或提升表格数据处理效率 | 验证数据泄漏、可解释性和部署限制 |
Optuna 是灵活的 Python 搜索默认选择。Ray Tune 擅长分布式扫描、调度器和与 Ray Train 的集成。FLAML 强调高性价比的 AutoML。AutoGluon 适用于表格、多模态和时间序列基线,能提高开发效率。W&B sweeps 与实验跟踪集成良好。
带剪枝的 Optuna 目标函数(Python 蓝图)
Optuna 可根据中间验证分数,在训练循环中提前剪枝表现不佳的试验。
import optuna
import torch
import torch.nn as nn
import torch.optim as optim
def train_and_validate(config, trial, model, train_loader, val_loader, device):
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=config["lr"])
for epoch in range(10): # 10 Epochs max
model.train()
for inputs, targets in train_loader:
inputs, targets = inputs.to(device), targets.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
# Validation epoch
model.eval()
val_loss = 0.0
with torch.no_grad():
for inputs, targets in val_loader:
inputs, targets = inputs.to(device), targets.to(device)
outputs = model(inputs)
val_loss += criterion(outputs, targets).item()
val_loss /= len(val_loader)
# Report intermediate value to Optuna for pruning check
trial.report(val_loss, epoch)
# Handle pruning (stop execution of this trial if criteria are met)
if trial.should_prune():
raise optuna.exceptions.TrialPruned()
return val_loss
def objective(trial: optuna.Trial, model_class, train_loader, val_loader, device):
# Search Space Configuration
config = {
"lr": trial.suggest_float("lr", 1e-5, 1e-2, log=True),
"optimizer": trial.suggest_categorical("optimizer", ["Adam", "SGD", "RMSprop"]),
"batch_size": trial.suggest_categorical("batch_size", [16, 32, 64]),
"dropout_rate": trial.suggest_float("dropout_rate", 0.1, 0.5)
}
model = model_class(dropout_rate=config["dropout_rate"]).to(device)
return train_and_validate(config, trial, model, train_loader, val_loader, device)
# Running the study
# study = optuna.create_study(direction="minimize", pruner=optuna.pruners.MedianPruner())
# study.optimize(lambda t: objective(t, MyModel, train_loader, val_loader, device), n_trials=50)
搜索空间设计
选择能反映参数尺度的分布。学习率、权重衰减、正则化强度和树模型的最小子节点权重通常需要对数均匀分布或对数间隔的类别网格。深度、层数、隐藏层大小、批次大小和估计器数量属于离散参数。优化器、调度器、数据增强策略、模型系列和特征集属于类别参数。
避免搜索无效组合。对条件空间进行编码:max_depth 仅用于树模型,LoRA 秩仅用于 PEFT,预热比例仅用于带调度的优化器。首次搜索应范围广、深度浅;然后在有希望的区域内缩小范围。
Weights & Biases(W&B)Sweep YAML 蓝图(sweep.yaml)
W&B Sweeps 可通过多个分布式 Agent 执行超参数搜索。
program: train.py
method: bayes # Search algorithm: bayes, random, grid
metric:
name: val_loss
goal: minimize
parameters:
learning_rate:
distribution: log_uniform_values
min: 1e-5
max: 1e-2
batch_size:
values: [16, 32, 64]
epochs:
value: 20
dropout:
distribution: uniform
min: 0.1
max: 0.5
optimizer:
values: ["adam", "adamw", "sgd"]
early_terminate:
type: hyperband
min_iter: 3
eta: 2
使用 ASHA 调度器进行 Ray Tune 分布式扫描
Ray Tune 可轻松将扫描任务分发到集群,在大规模场景中管理超参数调优。
from ray import tune
from ray.tune.schedulers import ASHAScheduler
def train_fn(config):
# Training routine pulling from config e.g., config["lr"]
for epoch in range(100):
# ... training step ...
val_loss = run_validation()
# Report intermediate score back to Ray
tune.report(loss=val_loss, epoch=epoch)
# Define Async Successive Halving (ASHA) scheduler
asha_scheduler = ASHAScheduler(
time_attr="epoch",
metric="loss",
mode="min",
max_t=100,
grace_period=5,
reduction_factor=2
)
# Run distributed sweep
# analysis = tune.run(
# train_fn,
# resources_per_trial={"cpu": 2, "gpu": 0.5}, # Run two trials per GPU
# config={
# "lr": tune.loguniform(1e-5, 1e-2),
# "batch_size": tune.choice([16, 32, 64])
# },
# num_samples=30,
# scheduler=asha_scheduler
# )
值得调优的参数
深度学习:
- 学习率、预热、调度器、优化器、权重衰减。
- 批次大小或有效批次大小、梯度累积。
- Dropout、标签平滑、数据增强强度。
- 架构宽度/深度、序列长度、图像分辨率。
- 损失参数、类别权重、焦点损失 gamma。
- 微调时的 PEFT 秩/alpha/dropout 和目标模块。
树模型/表格模型:
- 学习率、估计器/迭代次数、最大深度/叶子数。
- 子采样、列采样、最小子节点样本数/权重。
- L1/L2 正则化、最小分裂增益。
- 支持时的类别特征处理和单调约束。
RAG 和嵌入系统:
- 分块大小/重叠量、嵌入模型、top-k、混合权重、重排序器、提示词模板、上下文预算、分数阈值。
提前停止和剪枝
提前停止可避免浪费计算资源,但可能偏向起步较快的配置。应设置耐心值和最小资源阈值。ASHA 和 Hyperband 需要具有单调意义的指标和可比较的训练曲线。对于噪声较大的指标,可进行平滑处理,或要求多次评估。最终选择前,务必让有希望的配置运行至完整预算。
学习率查找器
学习率范围测试可以快速找到适用于神经网络的有效学习率区间。在短时间训练中逐步提高学习率,绘制损失曲线,并选择一个低于发散点、通常也低于下降最陡处的值。之后重新进行正式训练;学习率查找器的输出仅供参考,并非最终实验结果。
可复现性
记录每次试验的参数、随机种子、代码版本、数据版本、硬件、依赖项、指标、产物和失败原因。使用确定性的试验 ID。保存排名前 k 的配置,而不只是最佳配置。对于分布式搜索,请确保正确标记失败或被抢占的试验,并确保恢复的试验不会产生重复结果。
分析结果
搜索结束后,检查参数重要性、平行坐标图、指标分布和学习曲线。留意不稳定区域、对验证集过拟合、无效试验以及参数间的交互作用。在未触碰过的测试集上或使用多个重复种子,确认最佳配置。如果改进处于噪声范围内,优先选择更简单或成本更低的模型。
常见调优错误
- 在测试集或公开排行榜上调参。
- 用过少的试验搜索过多参数。
- 对按对数尺度变化的参数使用线性采样。
- 忽略表明区域不稳定的失败试验。
- 让 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/