贝叶斯优化:用更少试验调超参
调超参是机器学习的日常痛点:学习率、批量大小、正则系数、网络宽度,每一个组合都对应一次昂贵训练。若候选超参有 d 个、每个取 n 档,网格搜索要试 n^d 次,很快变得不可行。贝叶斯优化(Bayesian Optimization, BO)的核心主张是:与其盲目撒网,不如边试边学,用已经做过的试验去指导接下来该试哪一组。
与网格、随机搜索的对比
- 网格搜索:系统性地遍历所有组合,但当维度升高,所需试验数指数爆炸,且大量试验浪费在明显糟糕的区域。
- 随机搜索:在超参空间随机采样,往往比同预算的网格搜索更早发现较优解,因为它更可能覆盖到关键维度的变化。
- 贝叶斯优化:在随机或少量初始试验的基础上,维护一个「目标函数长什么样」的概率模型,并据此主动挑选下一组超参。它把预算优先投到「既可能好、又不确定」的地方。
简言之,前两者是被动采样,BO 是带模型的主动探索。
两个核心组件
BO 由两部分配合:
- 代理模型(surrogate model):通常用高斯过程(Gaussian Process, GP)拟合「超参到验证指标」的映射,不仅给出预测值,还给出预测的不确定性。也可以用随机森林或深度集成作为替代。
- 采集函数(acquisition function):把代理模型的「预测均值」与「不确定性」合成一个分数,决定下一组试验选哪里。常用期望改进(Expected Improvement, EI):它倾向于选择能让指标预期提升最大的点,同时保留对高不确定区域的探索。
这种「预测加不确定度」的组合,使 BO 在「利用已知好区域」与「探索未知区域」之间取得平衡,而不是二选一。
一个调参流程示例
下面用伪代码展示一轮 BO 的循环:
def bayesian_optimize(objective, space, iters=30):
# objective: 训练并回报验证指标(越贵越需省着用)
# space: 超参搜索空间
X, Y = init_random_samples(objective, space, n=5) # 先随机几组热身
for t in range(iters):
surrogate = fit_gp(X, Y) # 训练高斯过程代理
candidate = argmax_acquisition(surrogate, space, kind="EI") # 选采集分数最高者
y_new = objective(candidate) # 真实评估(昂贵)
X.append(candidate); Y.append(y_new) # 用新结果更新信念
return best_of(X, Y) # 返回历史最优超参
要点在于:每次真实评估后,代理模型与采集函数都会更新,下一轮的选择因此越来越聪明。
适用场景与局限
BO 特别适合目标函数昂贵、每次评估成本高(如训练大模型、跑仿真)且维度不高的场景,例如超参调优、实验设计、自动机器学习(AutoML)的搜索阶段。
但它也有明显边界:
- 计算开销:维护高斯过程在样本数增多时复杂度上升,通常只在数十到数百次试验内高效。
- 维度诅咒:当超参维度很高(例如几十维以上),不确定性估计变弱,BO 的优势被稀释,往往要让位于随机搜索或进化策略。
- 噪声敏感:若目标评估带较大噪声,需要代理模型显式建模噪声,否则采集函数会被误导。
小结
贝叶斯优化用高斯过程等代理模型刻画「超参到效果」的映射,再以期望改进等采集函数在利用与探索间权衡,从而用比网格、随机搜索少得多的试验逼近较优超参。它最适合评估昂贵、维度适中的调参与实验设计,却受困于高维与代理模型本身的计算成本。
参考与延伸阅读
- Snoek, Larochelle, Adams. Practical Bayesian Optimization of Machine Learning Algorithms(NeurIPS 2012)。把 BO 系统引入超参调优的现代奠基工作之一。已核验。
- Shahriari et al. Taking the Human Out of the Loop: A Review of Bayesian Optimization(Proceedings of the IEEE, 2016)。对代理模型、采集函数与理论性质的综述。已核验。
- 高斯过程与采集函数的实现可参考开源库如 BoTorch、Hyperopt、Optuna 的 TPE 模块;具体 API 与版本以各项目文档为准。待核实。
本文累计阅读 — 次