5.2 机器学习 - HPO 算法
超参数优化(Hyperparameter Optimization, HPO)是自动调参的核心技术,其本质是在高维、离散 / 连续混合的超参数空间中,用最低计算成本找到最优参数组合。其流程可拆解为 “定义搜索空间” 和 “选择搜索算法” 两步,不同算法在效率、精度上各有侧重。
一、第一步:定义超参数搜索空间
搜索空间是 HPO 的基础,需明确每个超参数的 “取值范围” 和 “分布类型”,避免无效搜索。若未合理定义,会导致搜索效率骤降(如超参数范围过大)或错过最优解(如范围过小)。
1. 核心超参数的范围与分布示例
不同类型的超参数(如模型结构、训练参数),其取值逻辑和分布特性差异显著,典型配置如下表:
| 超参数类型 | 具体超参数 | 取值范围 | 推荐分布 | 说明 |
|---|---|---|---|---|
| 模型结构 | Backbone(骨干网络) | [mobilenetv2_0.25, mobilenetv3_small, resnet18_v1b, resnet34_v1b] | 离散选择 | 不同骨干网络是互斥选项,需从预设列表中挑选,无法连续取值 |
| 模型结构 | Detector(检测头) | [faster-rcnn, ssd, yolo-v3, center-net] | 离散选择 | 目标检测任务的核心组件,需匹配骨干网络的输出特性,仅支持固定结构选项 |
| 训练参数 | 学习率(Learning Rate) | [1e-6, 1e-1] | 对数均匀分布 | 学习率对性能影响极大,且小值区间(如 1e-6~1e-3)的差异更关键,对数分布可密集采样小值 |
| 训练参数 | 批量大小(Batch Size) | [8, 16, 32, 64, 128, 256] | 离散选择 | 需匹配硬件显存(如 GPU 显存不足时选 8/16),通常为 2 的幂次 |
| 训练参数 | 动量(Momentum) | [0.85, 0.95] | 均匀分布 | 取值范围集中,线性采样即可覆盖有效区间 |
| 正则化参数 | 权重衰减(Weight Decay) | [1e-6, 1e-2] | 对数均匀分布 | 与学习率类似,小值区间(如 1e-6~1e-4)对抑制过拟合更关键,需重点采样 |
2. 搜索空间的核心挑战:维度爆炸
单个超参数的范围可能仅包含 10 个选项,但多个超参数组合后,搜索空间会呈指数级增长。
例如:5 个超参数(各 10 个选项)→ 总组合数 = 10⁵=100000。
若盲目遍历所有组合(如网格搜索),会导致计算成本极高,因此需选择高效的搜索算法降低复杂度。
二、第二步:选择 HPO 搜索算法——平衡精度与效率
HPO 算法按 “是否利用训练过程信息” 分为黑盒优化(Black-box) 和多保真度优化(Multi-fidelity) 两类,前者聚焦 “结果反馈”,后者聚焦 “资源节省”。
1. 黑盒优化(Black-box Optimization):仅关注结果反馈
核心逻辑:不关注模型训练过程(如损失曲线变化),仅将 “超参数组合” 视为 “输入”,“模型最终性能” 视为 “输出”,通过迭代试错找到最优输入。适合数据量小、模型训练快的场景。
(1)网格搜索(Grid Search):暴力遍历,简单但低效
- 核心逻辑:遍历超参数空间中所有预设的组合,训练并评估每个组合,选择性能最优者。
- 优点:逻辑简单,无需调参经验,能找到预设范围内的全局最优;
- 缺点:计算成本极高(随超参数数量指数增长),仅适合超参数少(≤3 个)、每个超参数选项少(≤5 个)的场景,如传统机器学习模型 SVM、随机森林等。
(2)随机搜索(Random Search):随机采样,效率优于网格
-
核心逻辑:在超参数空间中随机采样 N 个组合,训练并评估,选择性能最优者。研究表明,相同计算成本下,随机搜索比网格搜索更易找到最优解 —— 因它能更快覆盖 “高影响超参数” 的有效区间(如学习率),而非浪费资源在 “低影响超参数” 的遍历上。
-
代码逻辑(简化版):
import random def random_search(search_space, train_and_eval, n_samples=100): """ search_space: 超参数搜索空间字典,如{'learning_rate': [1e-5, 1e-4, 1e-3], 'batch_size': [32, 64]} train_and_eval: 训练评估函数,输入超参数配置,输出模型性能(如准确率) n_samples: 随机采样次数 """ best_result = -float('inf') # 初始化最优性能(最大化任务,如分类准确率) best_config = None # 初始化最优超参数配置 for _ in range(n_samples): # 按超参数分布类型随机采样 config = {} for param, info in search_space.items(): if info['type'] == 'discrete': # 离散超参数(如batch_size) config[param] = random.choice(info['values']) elif info['type'] == 'uniform': # 均匀分布超参数(如momentum) config[param] = random.uniform(info['min'], info['max']) elif info['type'] == 'log_uniform': # 对数均匀分布超参数(如learning_rate) log_min = math.log10(info['min']) log_max = math.log10(info['max']) config[param] = 10 ** random.uniform(log_min, log_max) # 训练评估当前配置 current_result = train_and_eval(config) # 更新最优配置 if current_result > best_result: best_result = current_result best_config = config return best_config, best_result -
优点:实现简单,计算成本可控(N 可自定义),效率优于网格搜索;
-
缺点:未利用历史实验结果,采样存在随机性(可能错过最优解,需足够多采样次数)。
-
适用场景:超参数数量中等(3~10 个)、训练速度较快的模型(如轻量深度学习模型、XGBoost)。
(3)贝叶斯优化(Bayesian Optimization,BO):利用历史,智能采样
- 核心逻辑:基于 “高斯过程(Gaussian Process)” 等模型,学习 “超参数→性能” 的映射关系,每次迭代时平衡 “探索(采样未知区域)” 和 “利用(采样历史优区)”,选择 “最可能最优” 的组合,避免盲目采样。
- 关键步骤:
- 初始化:随机采样少量组合(如 5 个),训练后记录 “超参数 - 性能” 数据,作为初始训练集;
- 建模:用高斯过程拟合历史数据,生成 “性能预测分布”—— 包含 “均值(预测性能)” 和 “方差(不确定性)”;
- 采样决策:通过 “采集函数(Acquisition Function)” 选择下一个采样点:
- 探索(Exploration):优先采样方差大的区域(未知区域,可能存在最优解);
- 利用(Exploitation):优先采样均值高的区域(历史优区,大概率性能好);
- 常用采集函数:EI(Expected Improvement,期望改进)、PI(Probability of Improvement,改进概率);
- 迭代更新:训练新采样的组合,将 “超参数 - 性能” 加入历史数据,重复步骤 2~3,直到达到计算预算(如训练次数上限)。
- 优点:利用历史信息,采样更智能,相同计算成本下精度高于随机搜索;
- 缺点:前期性能与随机搜索接近(需足够历史数据建模),超参数数量多时(≥10 个),建模复杂度会显著上升。
- 适用场景:超参数数量中等(3~10 个)、训练成本较高(单次训练≥1 小时)的模型(如中等规模 CNN、Transformer)。
2. 多保真度优化(Multi-fidelity Optimization):节省资源,高效筛选
多保真度优化的核心是 “不浪费资源在差组合上”—— 通过 “低保真度评估”(如小数据集、少 epoch、简化模型)快速淘汰 “明显差的组合”,仅对 “潜力组合” 用 “高保真度评估”(完整数据、全 epoch),大幅降低计算成本,适合 “数据量大、模型训练慢” 的深度学习场景。
(1)Successive Halving(连续减半):逐步淘汰,聚焦潜力组合
-
核心思路:“不靠谱的组合少给资源,靠谱的组合多给资源”,每轮筛选后,保留一半性能好的组合,并加倍其训练资源,最终仅对少数组合用全资源训练。
-
具体步骤:
- 初始化:设定总训练预算(如总 epoch=64),随机采样 N 个超参数组合,每个组合先用 “低保真度” 训练(如 m=2 个 epoch);
- 筛选与加资源:
- 第 1 轮:保留前 N/2 个性能最好的组合,每个组合再训练 m=2 个 epoch(累计 4 个 epoch);
- 第 2 轮:保留前 N/4 个性能最好的组合,每个组合再训练 2m=4 个 epoch(累计 8 个 epoch);
- 第 3 轮:保留前 N/8 个性能最好的组合,每个组合再训练 4m=8 个 epoch(累计 16 个 epoch);
- ……
- 终止:直到仅剩 1 个组合,用剩余资源训练至总预算(如 64 个 epoch),该组合即为最优。
-
关键参数:
-
N(初始采样数):影响 “探索范围”,N 越大越可能覆盖潜力组合,但初始资源消耗越多;
-
m(初始 epoch 数):影响 “筛选效率”,m 越小前期筛选越快,但可能因训练不足误淘汰好组合(推荐 m=2~5);
-
-
适用场景:深度学习模型(如 CNN、RNN),训练 epoch 多且数据量大。
(2)Hyperband:多轮 Successive Halving,降低参数敏感性
- 核心改进:Successive Halving 对 N 和 m 的取值敏感(如 N 太小错过最优组合、m 太小误判),Hyperband 通过 “同时运行多组不同 N 和 m 的 Successive Halving”,覆盖更多 “探索 - 利用” 平衡,降低对参数的依赖。
- 具体逻辑:
- 设定总训练预算 B(如 B=100),对不同的 “资源分配比例”(如 m=1, N=100;m=2, N=50;m=4, N=25),分别运行 Successive Halving;
- 每个 Successive Halving 独立筛选,最终从所有轮次的最优组合中,选择性能最好的一个作为最终结果。
- 优势:无需手动调 N 和 m,通过多轮并行覆盖不同 “探索 - 利用” 平衡,适合对超参数空间不熟悉的场景。
- 适用场景:对超参数空间不熟悉、追求稳定优化结果的深度学习任务(如大模型微调、图像分割)。
三、HPO 算法选择建议
| 场景类型 | 推荐算法 | 选择理由 |
|---|---|---|
| 超参数少(≤3 个)、训练快(≤10 分钟 / 次) | 网格搜索 | 逻辑简单,能确保找到预设范围内的全局最优,计算成本可控 |
| 超参数中(3~10 个)、训练较快(10~60 分钟 / 次) | 随机搜索 / 贝叶斯优化 | 随机搜索实现简单,适合快速验证;贝叶斯优化更智能,需足够采样次数积累历史数据 |
| 超参数多(≥10 个)、训练慢(≥1 小时 / 次) | Successive Halving / Hyperband | 多保真度评估大幅节省计算成本,避免对每个组合全量训练,适配深度学习场景 |
| 对参数敏感性高、追求稳定结果 | Hyperband | 多轮 Successive Halving 覆盖更多可能性,降低对 N 和 m 的依赖,结果更稳健 |
| 资源有限(GPU 数量少)、需快速出结果 | 随机搜索(小 N) | 实现简单且无需前期建模,能在有限资源内快速找到 “较优解” |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)