假设你刚搬到一个陌生城市,听说某条巷子里藏着全城最好吃的牛肉面。怎么找?第一种办法,把每一条街、每一家面馆都吃一遍——精确但可能吃上一年;第二种办法,闭着眼随便进几家——全凭运气;第三种办法,像一位挑剔的老饕:每吃一家就记下汤底、面条软硬、辣椒香度,然后推断:“汤头鲜的店似乎集中在老城区,下次往那边走。”第三种,就是贝叶斯优化的核心思路:不盲试,边吃边学,把每一次尝试都变成判断下一次该去哪的线索。 Optuna 就是帮你干这件事的智能助手。你只需定义“怎么给一碗面打分”(目标函数)和“去哪些区域找”(搜索空间),Optuna 就用 TPE 采样器自动决定下一组参数试什么;如果面刚端上来尝一口就觉得难吃(训练中间 loss 很差),它还会提前结账走人——这叫剪枝。本教程从零跑通整套流程,让你告别手动调参的苦日子。

岗位关联

对 AI 从业者而言,Optuna 贝叶斯优化能帮你把模型调参时间压缩一半以上,是从“手动调参民工”进化为“自动化训练工程师”的必备技能。

目录
  1. 可视化演示
  2. 参数搜索演进:从穷举到有记忆的搜索
  3. 核心流程设计:目标函数、搜索空间与采样器
  4. TPE采样原理:老饕的两个笔记本
  5. 剪枝加速机制:难吃就早点走
  6. 可视化调参:用图表复盘探店地图
  7. 实战场景应用:深度学习与树模型调优
  8. 多目标优化:好吃与便宜兼得
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示TPE采样器好/差分布建模与采样原理、剪枝器提前终止无望试验机制及多目标优化Pareto前沿,帮助理解智能超参数搜索的核心算法。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+captions.tpe+'

参数搜索演进:从穷举到有记忆的搜索

找面馆的三种策略,恰好对应超参数搜索的三个代表。网格搜索像“把全城每条街每家店都吃一遍”:把学习率取 10 个值、隐藏层数取 5 个值、dropout 取 5 个值,然后 10×5×5 组合全部训练一遍。稳妥,但代价恐怖。随机搜索是“闭着眼碰运气”:从组合里随机抽几十组去试,成本低,但完全没有方向感。贝叶斯优化则是“老饕策略”:每吃一家记一笔,越吃越懂这座城市的'口味地图',把预算花在最有希望的地方。

残酷的现实是,网格搜索的组合数会指数爆炸。假设有 k 个超参数,第 i 个取 $n_i$ 个候选值,总训练次数就是它们的乘积——这也就是为什么深度学习场景下网格搜索几乎不可行。

正因如此,老饕们才不搞“全城吃遍”。贝叶斯优化把每次训练当成一次探店,用记忆替代盲试——同样的预算,它吃到的好面就是比网格和随机更多。这就是效率对比的结论:训练成本越高、参数越多,有记忆的搜索越划算。

N=∏i=1kni=n1×n2×⋯×nk\displaystyle N = \prod_{i=1}^{k} n_i = n_1 \times n_2 \times \cdots \times n_k
你的“面馆拜访次数”等于所有超参数候选个数的乘积,每多一个参数或候选值,总次数就翻倍。
  1. 总次数 N把所有超参数的候选值数量乘在一起,就是网格搜索需要训练的模型总数。
    NN
  2. 连乘符号 $\prod$把 i 从 1 到 k 的所有 $n_i$ 依次相乘。
    ∏i=1kni\prod_{i=1}^{k} n_i
  3. 逐个乘开展开后就是 $n_1 \times n_2 \times \dots \times n_k$,任何一项变大,整体成倍增长。
    n1×n2×⋯×nkn_1 \times n_2 \times \cdots \times n_k

核心流程设计:目标函数、搜索空间与采样器

探店之前,老饕要定三件事:怎么打分、去哪片区域找、下一步去哪家。Optuna 里对应三件套:目标函数决定“一碗面得几分”,搜索空间划定“允许去哪几条街”,采样器负责“下一家去哪”。此外还有一个叫 Study 的总账本,记录所有试过的店和得分,供采样器参考。

目标函数是打分标准。在机器学习里,它通常长这样:给定一组超参数,训练一个模型,返回验证集损失。Optuna 的目标就是找到让这个分数最小的那组参数。

在代码里,这套流程被拆成 clear 的接口:定义好目标函数后,create_study 建账本,study.optimize 启动探店之旅。搜索空间用 suggest_float、suggest_int、suggest_categorical 声明,采样器默认就用 TPE。新手最常犯的错是“先写模型再想怎么调”,而正确姿势是先把打分标准和搜索范围想清楚——跟老饕一样,先想明白什么算好吃,再出门。

θ∗=arg⁡min⁡θ∈ΘLval(train(θ))\displaystyle \theta^* = \arg\min_{\theta \in \Theta} \mathcal{L}_{\text{val}}\bigl(\text{train}(\theta)\bigr)
在搜索空间 $\Theta$ 中,找到那组让“验证集损失”最小的超参数 $\theta$——就像在所有街区里找到评分最高的那家面馆。
  1. 超参数组 $\theta$一组待搜索的超参数,比如学习率、层数、dropout。
    θ=(lr,layers,dropout)\theta = (\text{lr}, \text{layers}, \text{dropout})
  2. 训练函数 train(θ)用这组参数训练一个模型,得到训练好的权重。
    train(θ)\text{train}(\theta)
  3. 验证损失 $\mathcal{L}_{\text{val}}$训练完在验证集上算出的损失,越小代表模型越好。
    Lval\mathcal{L}_{\text{val}}
  4. argmin 求最优在搜索空间里遍历候选,选出让验证损失最小的那一组。
    arg⁡min⁡θ∈Θ\arg\min_{\theta \in \Theta}

TPE采样原理:老饕的两个笔记本

一位有经验的老饕口袋里有两只笔记本:“好吃本”记录所有惊艳面馆的共性——汤头浓、面条筋道、巷子窄;“难吃本”记录踩雷店的共性——汤淡、面软、开在广场。遇到新面馆,他先看它更像哪本笔记。TPE 采样器(Tree-structured Parzen Estimator,树结构帕曾估计器)干的就是这件事,只不过它的“共性”是用概率密度函数表示的。

怎么判断“更像好吃本”?TPE 先设定一个分位阈值 $y^*$,把历史试验分成两组:目标值优于 $y^*$ 的进“好吃组”,其余的进“难吃组”。然后分别估计两组参数的概率密度,最终用密度比值指导采样——比值大的位置,说明“像好吃的、不像难吃的”,优先去试。

迭代策略也由此而来:每完成一次试验,笔记本就充实一点,密度估计更准,下一轮推荐更聪明。这就是“越试越准”的数学根源。比起直接拟合一条复杂的损失函数曲面,TPE 只需分别估计两组密度——这正是它实现简单、对混合型参数友好的原因。

ℓ(x)=p(x∣y<y∗),g(x)=p(x∣y≥y∗),EI(x)∝ℓ(x)g(x)\displaystyle \ell(x) = p(x \mid y < y^*), \qquad g(x) = p(x \mid y \ge y^*), \qquad \text{EI}(x) \propto \frac{\ell(x)}{g(x)}
$\ell(x)$ 是“好吃笔记本”里参数 x 出现的密度,$g(x)$ 是“难吃笔记本”里的密度。两者比值越大,这个位置越可能藏着好参数。
  1. 分位阈值 $y^*$把历史试验的目标值排序,$y^*$ 取某个分位数(如 25% 处),作为好坏分界线。
    y∗y^*
  2. 好吃组密度 $\ell(x)$目标值小于 $y^*$ 的试验里,参数取到 x 的密集程度。
    ℓ(x)=p(x∣y<y∗)\ell(x) = p(x \mid y < y^*)
  3. 难吃组密度 $g(x)$目标值不小于 $y^*$ 的试验里,参数取到 x 的密集程度。
    g(x)=p(x∣y≥y∗)g(x) = p(x \mid y \ge y^*)
  4. 期望改进 EI下一轮采样优先选 $\ell(x)/g(x)$ 大的点,既利用已知好区域,又保留探索可能。
    EI(x)∝ℓ(x)g(x)\text{EI}(x) \propto \frac{\ell(x)}{g(x)}

剪枝加速机制:难吃就早点走

吃面有个聪明做法:先点一碟小菜。小菜都难以下咽,主菜八成也悬,趁早结账去下一家。深度学习训练同理:不必每次 trial 都跑满 100 个 epoch,前几个 epoch 的 loss 已经能预报结局。Optuna 的剪枝器(Pruner)就是那个“尝小菜”的服务员。

具体流程是:训练每过一定轮数,调用 trial.report(loss, epoch) 上报中间指标;随后 trial.should_prune() 询问剪枝器“这碗面还有救吗”。最常用的中位数剪枝器(MedianPruner)会翻看历史账本:已完成试验在同一轮(epoch)的 loss 中位数是多少。当前试验明显差于中位数,就建议掐掉。

剪枝省下的算力不是小数目:trial 越多、单次训练越贵,收益越明显。实现上要小心两件事:一是给足“启动试验数”(如 n_startup_trials=5),让中位数参考线先站稳脚跟;二是数据异构时要考虑用集成剪枝器(如 SuccessiveHalving)做更鲁棒的判断。本质上,剪枝把预算从“陪烂店吃完主菜”转向“多试几家新店”——这才是贝叶斯优化效率的另一个引擎。

终止(剪枝)  ⟺  st<median(st(1),st(2),…,st(m))\displaystyle \text{终止(剪枝)} \iff s_t < \text{median}\Bigl(s_t^{(1)}, s_t^{(2)}, \dots, s_t^{(m)}\Bigr)
当前试验第 t 轮的损失,低于历史已完成试验同一轮损失的中位数,就判定“没希望”,提前终止。
  1. 第 t 轮指标 $s_t$当前试验训练到第 t 轮时的中间损失值。
    sts_t
  2. 中位数参考线把 m 个已完成试验第 t 轮的损失排序,取中间那个值作为参考。
    median(st(1),…,st(m))\text{median}\left(s_t^{(1)}, \dots, s_t^{(m)}\right)
  3. 判定剪枝$s_t$ 低于中位数,说明这组参数大概率走不远,提前终止省下算力。
    st<median(⋅)s_t < \text{median}(\cdot)

可视化调参:用图表复盘探店地图

探店 20 家后,老饕会摊开地图复盘:哪些街区出高分?哪条巷子最值得深耕?Optuna 自带的可视化工具就是这张地图,帮你回答三个问题:我收敛了吗、什么参数最关键、参数之间怎么影响结果。

历史曲线(history)画出“每次试验的最优值”随试验次数下降的过程,像贴在墙上的成绩单:曲线陡峭说明见效快,平台期说明该收手或扩大空间了。参数重要性(param importance)用 fANOVA 思想计算每个参数对目标值波动的贡献:学习率占 60%、层数占 25%,那下一轮就把预算压在学习率上。等高线图(contour)看两个参数的交互,平行坐标(parallel coordinate)一条线串起一组参数,颜色越深代表效果越好。

复盘地图的价值不在于好看,而在于指引下一轮操作:重要性高但还没搜细的参数,缩小范围加密采样;重要性极低的参数,干脆固化成常数。老饕常说“地图画得越清楚,下一次出门越有底气”——可视化就是给下一次贝叶斯迭代喂的养料。

Ii=1−Eθi[Var(y∣θi)]Var(y)\displaystyle I_i = 1 - \frac{\mathbb{E}_{\theta_i}\bigl[\text{Var}(y \mid \theta_i)\bigr]}{\text{Var}(y)}
第 i 个参数的重要性,等于“把它固定后,目标值还能有多大的波动”相对于总波动的减少比例。
  1. 总波动 Var(y)所有试验目标值的方差,相当于成绩单整体的分散程度。
    Var(y)\text{Var}(y)
  2. 固定 $\theta_i$ 后的条件方差把第 i 个参数钉死,只看其他参数变化带来的波动。
    Eθi[Var(y∣θi)]\mathbb{E}_{\theta_i}\bigl[\text{Var}(y \mid \theta_i)\bigr]
  3. 重要性占比用 1 减去比值,得到“被 $\theta_i$ 解释掉”的波动比例,越接近 1 越关键。
    Ii=1−Eθi[Var(y∣θi)]Var(y)I_i = 1 - \frac{\mathbb{E}_{\theta_i}[\text{Var}(y \mid \theta_i)]}{\text{Var}(y)}

实战场景应用:深度学习与树模型调优

不同“胃”的模型,探店策略也不同。深度学习像高端日料:预约贵、上菜慢(一次训练几小时到几天),容错率低,必须靠贝叶斯优化把 trial 次数压到最少。XGBoost 这类树模型像平价快餐:单次训练快,但参数多(n_estimators、max_depth、learning_rate、subsample、colsample_bytree 等),交互复杂,手动调像无头苍蝇,贝叶斯优化收益巨大。

实战中,搜索空间的设计决定成败。学习率这类跨数量级的参数,必须用 log=True 在对数刻度上采样——否则 0.1 和 0.001 之间的“潜在好店”会被线性采样漏掉。推荐流程是两阶段:先给一个较宽的范围粗搜 20-30 次定位优质区域,再在最优值附近缩小范围细搜 10-20 次。这就像先扫一遍全城锁定三个街区,再回头把每个街区的巷子逛透。

实操中还有几个“避坑”习惯:在目标函数里加 trial.report 并配 MedianPruner;用 study.best_params 一键捞出最优配置;对不确定的参数宁窄勿宽。记住老饕的话:“预算有限,先吃最可能好吃的店,再谈尝鲜。”贝叶斯优化的意义就是把每一块钱 GPU 都花在刀刃上。

Ttotal=n×tˉ,Tactual=(1−rpruned)×Ttotal\displaystyle T_{\text{total}} = n \times \bar{t}, \qquad T_{\text{actual}} = (1 - r_{\text{pruned}}) \times T_{\text{total}}
调参总成本 = 试验次数 × 单次训练平均时长;引入剪枝后,只有没被剪掉的试验会跑完全程。
  1. 总成本 $T_{\text{total}}$n 次试验各跑完全程所需的时间总和。
    Ttotal=n×tˉT_{\text{total}} = n \times \bar{t}
  2. 剪枝比例 $r_{\text{pruned}}$被剪掉的试验占总试验数的比例。
    rprunedr_{\text{pruned}}
  3. 实际花费 $T_{\text{actual}}$只有 $(1-r)$ 比例的试验跑完,剩余算力被省下。
    Tactual=(1−rpruned)×TtotalT_{\text{actual}} = (1 - r_{\text{pruned}}) \times T_{\text{total}}

多目标优化:好吃与便宜兼得

现实里探店不只看好吃:还要看排队时间、人均价格、环境分。单目标优化只能把“好吃”拉满,可能找到的是一家天价神店。多目标优化(Optuna 中设置 directions=["minimize", "minimize"])同时优化两个及以上指标,回答“有没有又好吃又不贵的店”。

多指标天然冲突:更准的模型往往更慢、更大。Optuna 的 MOTPE 采样器(多目标 TPE)在采样时会综合考虑多个目标,最后给出一组帕累托最优解(Pareto frontier)。解集中的每个点都“不可被支配”:不存在另一个解在所有指标上不差、且至少一个指标更好。怎么理解“支配”?数学定义如下。

拿到前沿后,“选哪家”就交给业务了:要极致精度就选右上角,要轻量部署就选左下角。这也回答了一个常见疑问:为什么 Optuna 的多目标优化返回的不是“一个最优解”,而是一个集合。探店到最后,老饕心里装的不再是“唯一神店”,而是一张经过验证的候选清单——把取舍的智慧留给决策者。

x⪯y  ⟺  ∀ i:  fi(x)≤fi(y)    且    ∃ j:  fj(x)<fj(y)\displaystyle x \preceq y \iff \forall\, i:\; f_i(x) \le f_i(y) \;\; \text{且} \;\; \exists\, j:\; f_j(x) < f_j(y)
解 x 支配解 y:x 在所有指标上不输给 y,且至少在一个指标上严格更好。不被任何解支配的点,组成帕累托前沿。
  1. 支配符号 $\preceq$表示“x 全面不弱于 y 且有亮点”,是帕累托理论的核心关系。
    x⪯yx \preceq y
  2. 全部不差(∀i)对每个目标,x 的值都小于等于 y 的值。
    ∀ i:  fi(x)≤fi(y)\forall\, i:\; f_i(x) \le f_i(y)
  3. 至少一项更优(∃j)存在某个目标 j,x 严格小于 y。
    ∃ j:  fj(x)<fj(y)\exists\, j:\; f_j(x) < f_j(y)
  4. 帕累托前沿集合所有不被其他解支配的解构成了前沿上的“待选名单”。
    P={x∣∄ y 能支配 x}\mathcal{P} = \{ x \mid \nexists\, y \text{ 能支配 } x \}

AI 应用场景

深度学习模型的智能调参

阶段:模型选择与超参数优化

解决的问题:传统手动调参或网格搜索在 CV/NLP 任务上需要训练几十个模型,每个在 GPU 上跑数小时甚至数天,人力与算力双重浪费。Optuna 用 TPE 采样器 + 中位数剪枝,把 trial 次数压缩到 15-20 次,同时自动跳过明显没希望的训练,显著减少 GPU 占用。

具体案例:某 OCR 团队训练文本检测模型,使用 Optuna 搜索学习率、backbone 层数、数据增强概率和 batch size。原本手动调参要跑 72 次完整训练,换成 Optuna 后只跑 20 次就达到同等精度,训练时间从 3 天缩短到 1 天。

XGBoost 表格数据竞赛调优

阶段:特征工程完成后的模型调优

解决的问题:树模型超参众多(n_estimators、max_depth、learning_rate、subsample、colsample_bytree),且相互影响,人工逐个尝试既慢又容易遗漏组合。贝叶斯优化显式利用历史试验信息,在少量试验内定位优质参数组合。

具体案例:数据科学家在 Kaggle 风控评分卡比赛中用 Optuna 对 XGBoost 做 30 次贝叶斯搜索,AUC 超过此前手动尝试 50 组参数的方案,还顺手用可视化发现 max_depth 重要性远高于 subsample,据此精简了后续搜索空间。

推荐系统的多目标模型优化

阶段:模型服务与线上指标持续优化

解决的问题:推荐排序模型要同时优化点击率(CTR)、停留时长、内容多样性,单目标调参会顾此失彼。用 Optuna 的 MOTPE 多目标优化直接得到帕累托前沿,再按业务偏好选点。

具体案例:某资讯 App 推荐团队设置 directions=["maximize", "maximize"] 同时优化 CTR 与人均阅读时长,30 次试验产出 10 个帕累托前沿点,最终选定“CTR 微降 0.3% 但时长提升 8%”的方案,整体收益显著。

Python 演示

python31 行
import optuna  def train_model(trial):    """模拟一次深度学习训练, 返回验证损失(越小越好)"""    lr = trial.suggest_float("lr", 1e-4, 1e-1, log=True)    layers = trial.suggest_int("layers", 1, 5)    dropout = trial.suggest_float("dropout", 0.0, 0.6)    batch = trial.suggest_categorical("batch", [16, 32, 64])     loss = 0.9 - 0.35 * (lr ** 0.2) - 0.05 * layers + 0.2 * dropout    for epoch in range(8):        loss *= 0.93        trial.report(loss, epoch)        if trial.should_prune():            raise optuna.TrialPruned()    return loss  study = optuna.create_study(    direction="minimize",    sampler=optuna.samplers.TPESampler(seed=42),    pruner=optuna.pruners.MedianPruner(n_startup_trials=5),)study.optimize(train_model, n_trials=30) print("最佳超参数:", study.best_params)print("最佳损失:", round(study.best_value, 4))completed = sum(1 for t in study.trials if t.state == optuna.trial.TrialState.COMPLETE)pruned = sum(1 for t in study.trials if t.state == optuna.trial.TrialState.PRUNED)print("完成试验:", completed, "被剪枝:", pruned)
目的:完整演示 Optuna 贝叶斯优化调参的标准姿势——定义目标函数、声明搜索空间、配置 TPE 采样器与中位数剪枝器,跑完 30 次试验后输出最优参数与剪枝统计。
  1. lr = trial.suggest_float("lr", 1e-4, 1e-1, log=True)在对数刻度上声明学习率搜索范围,避免小数量级被线性采样漏掉。
  2. batch = trial.suggest_categorical("batch", [16, 32, 64])用枚举方式声明类别型参数,Optuna 会当作离散候选处理。
  3. trial.report(loss, epoch)每个 epoch 上报中间损失,让剪枝器能“尝到小菜”。
  4. if trial.should_prune(): raise optuna.TrialPruned()询问剪枝器是否该提前终止,是则抛出专用异常优雅退出。
  5. sampler=optuna.samplers.TPESampler(seed=42)显式指定 TPE 采样器并固定随机种子,保证实验可复现。
  6. pruner=optuna.pruners.MedianPruner(n_startup_trials=5)前 5 次试验不剪枝,等中位数参考线稳定后再生效。
  7. study.optimize(train_model, n_trials=30)启动 30 次试验的自动搜索,全程无需人工干预。

常见误区

误区反正只要把 `n_trials` 设得足够大,贝叶斯优化总会收敛到全局最优解,所以预算往大了开准没错。

正解贝叶斯优化是“有限预算下的聪明搜索”,不是全局最优化器。TPE 的采样会偏向历史好区域,可能在某处局部最优附近反复打转,尤其在搜索空间大、目标函数噪声高的场景。它真正保证的是:同样预算下,大概率比网格/随机搜索找到的解更好,而非“一定找到全局最优”。看到试验数翻倍但收益趋平时,就该收手或换空间了。

为何常见:“优化”加“贝叶斯”两个词都自带数学准确感,加上精度确实在提升,人就容易脑补出“收敛到全局最优”的结论。

误区看 `suggest_float` 每次返回的数值都带随机性,觉得 TPE 跟随机搜索没什么本质区别,就是包装得高级一点。

正解TPE 的随机是“被历史结果改造过的随机”——它把所有已完成的试验按目标值分成好坏两组,分别拟合密度 $\ell(x)$ 和 $g(x)$,再用比值 $\ell/g$ 偏置采样。新的参数点大概率落在“好参数曾经出现过的区域”。随机搜索没有任何记忆,TPE 每一步都在利用记忆,这正是二者效率差异的来源。

为何常见:只看到 suggest 接口的随机返回值,没深入内部的好坏密度对比机制,容易被表面现象迷惑。

误区训练曲线先差后好的配置很常见,剪枝器提前把试验掐掉,肯定会把“后期逆袭”的好参数误杀,所以不如不剪。

正解MedianPruner 不是拍脑袋砍试验,而是拿当前试验某一轮的中间指标与“同一轮已完成试验的中位数”对比。只有明显差于中位数才建议剪。诚然存在极少数前期差后期爆发的配置,但这类配置在随机初始化下本就是少数。而且 n_startup_trials 保证了参考线稳定后才生效。剪枝省下的算力可以转化为更多新试验,整体收益通常大于误伤损失。

为何常见:把剪枝想象成“无条件砍掉最差的试验”,忽略了它本质是基于已完成试验的统计对比,而非主观一刀切。

误区超参范围越大,越不容易漏掉最优解,所以把学习率从 1e-10 到 1.0 全圈进来,范围越宽机会越多。

正解搜索空间越大,固定预算下的采样密度越低,TPE 需要学习的“参数地形”越复杂,收敛越慢。正确做法:先用较宽范围粗搜 20-30 次定位优质区域,再缩小范围细搜;学习率这类跨数量级的参数用 log=True 压缩有效空间。范围宽不等于概率高,稀疏采样反而可能错过好店。

为何常见:把“可能性”等同于“概率”,忽略了固定试验次数下采样密度会被空间体积稀释这一关键事实。

面试题

Q1. Optuna 创建 Study 时若不显式指定采样器,默认使用哪种采样方式?

单选题 · easy

  • A.默认使用网格搜索方法进行采样
  • B.默认使用TPE采样器做贝叶斯优化← 正确答案
  • C.默认使用完全随机的搜索采样方法
  • D.默认使用遗传算法进行进化搜索

答案:B。Optuna 的 create_study 不指定 sampler 时默认使用 TPESampler。网格搜索需要显式传入 GridSampler,随机搜索需要传 RandomSampler,遗传算法并非内置默认选项。这体现了 Optuna 开箱即用贝叶斯优化的设计理念。

Q2. trial.suggest_float("lr", 1e-4, 1e-1, log=True) 中 log=True 的作用是什么?

单选题 · easy

  • A.在对数刻度上均匀采样,照顾小数量级← 正确答案
  • B.在线性刻度上均匀采样,分布更直观
  • C.让每次取值都固定在 0.001 附近波动
  • D.让采样结果服从正态分布而非均匀分布

答案:A。log=True 把搜索范围映射到对数空间再均匀采样,相当于在 1e-4 到 1e-1 的“数量级刻度”上等概率取点,避免线性采样几乎集中在 0.1 附近而漏掉 0.001 量级的好值。这对学习率这类跨数量级超参至关重要,也是搜索空间设计的常见技巧。

Q3. 关于网格搜索的核心特点,下列说法正确的是?

单选题 · easy

  • A.利用历史试验结果指导下一轮参数选择
  • B.在全部参数组合中随机抽取若干组去试验
  • C.对每个参数所有取值做笛卡尔积后逐个穷举← 正确答案
  • D.用贝叶斯公式估计参数的后验概率分布

答案:C。网格搜索的本质是对各参数候选值做笛卡尔积后穷举全部组合,组合数随参数个数指数爆炸。A 是贝叶斯优化的特征,B 是随机搜索,D 是更广义的贝叶斯推断,均与网格搜索的定义不符。

Q4. TPE 采样器把已完成试验分成“好”与“坏”两组,划分依据是什么?

单选题 · mid

  • A.按试验完成时间的先后,先完成的就是好
  • B.按目标值是否优于某个分位数阈值来划分← 正确答案
  • C.按参数取值是否靠近搜索空间的边界来划分
  • D.按试验是否被剪枝器提前终止来判断好坏

答案:B。TPE 先对历史试验的目标值排序,取一个分位点 $y^*$(如 25%),目标值好于 $y^*$ 的进“好”组 $\ell(x)$,其余进“坏”组 $g(x)$。“先完成就更优”“靠近边界更好”“被剪枝就是坏”都是与算法无关的干扰表述。

Q5. 下列哪些是贝叶斯优化相比网格搜索的显著优势?

多选题 · mid

  • A.显式利用历史试验结果指导后续搜索方向← 正确答案
  • B.能处理目标函数为黑盒的复杂优化场景← 正确答案
  • C.在试验预算较少时往往能更快找到更优解← 正确答案
  • D.在数学上严格保证一定能找到全局最优解

答案:ABC。贝叶斯优化的核心优势正是用历史试验构建概率模型、适用于黑盒目标函数、在低预算下更高效,对应 A、B、C。D 是常见误区:贝叶斯优化是有限预算下的聪明搜索,并不提供全局最优的理论保证,因此不选。

Q6. 在多目标优化中,帕累托最优解集中的点具有什么含义?

单选题 · mid

  • A.在单个指标上达到全局最优的所有解的组合
  • B.不存在其他解在所有指标上不差且某一项更优← 正确答案
  • C.把多个目标加权求和一个标量后最小的解集合
  • D.从所有可行解中随机挑选出的一组代表性解集

答案:B。帕累托前沿上的点“不可被支配”:没有任何其他解在所有指标上不输于它、且至少一个指标严格更好。A 是单目标思维,C 是加权求和法(并非帕累托定义),D 与随机采样混淆,均不正确。

Q7. 在 Optuna 中,一个 trial 被剪枝器提前终止后,其状态(state)是?

单选题 · mid

  • A.COMPLETE 表示该试验已完整正常地跑完
  • B.PRUNED 表示该试验被剪枝器提前终止← 正确答案
  • C.FAIL 表示该试验运行时发生了异常错误
  • D.RUNNING 表示该试验目前仍在进行当中

答案:B。被剪枝的试验状态为 PRUNED。COMPLETE 表示完整跑完并返回目标值,FAIL 表示代码抛异常,RUNNING 表示进行中。区分这些状态对统计试验成本、评估剪枝收益很重要——被剪的试验也要算进总预算。

Q8. 关于 Optuna 中 trial 的用法,下列说法正确的是?

多选题 · mid

  • A.目标函数内可以用 trial.report 上报中间指标← 正确答案
  • B.trial.should_prune 返回 True 时建议提前终止← 正确答案
  • C.trial.suggest_int 只能生成均匀分布的整数
  • D.trial.suggest_categorical 用于枚举型参数的取值← 正确答案

答案:ABD。trial.report 上报中间指标、should_prune 配合剪枝器判断是否提前终止、suggest_categorical 声明枚举型参数,都是正确用法。C 错误:suggest_int 同样支持 log=True 参数,并非只能均匀采样。

Q9. 关于 TPE 与高斯过程(GP)贝叶斯优化的对比,下列说法正确的是?

多选题 · hard

  • A.TPE用好坏两组密度比值近似期望改进量← 正确答案
  • B.高斯过程更适合低维连续参数的建模场景← 正确答案
  • C.高斯过程比TPE更适合混合类型离散参数
  • D.TPE也必须记录全部历史试验的结果信息← 正确答案

答案:ABD。TPE 的核心是用 $\ell(x)/g(x)$ 比值近似 EI 而非直接拟合目标函数(A 对);GP 在低维连续空间建模精确但难处理高维离散混合参数,TPE 对各维度分别建模更灵活(B 对、C 说反了);TPE 每次采样都要参考全部历史试验来更新两组密度(D 对)。

Q10. 关于 Optuna 的使用,下列说法错误的是?

单选题 · hard

  • A.目标函数内可以用 trial.report 上报中间指标
  • B.MedianPruner 需要积累一些完成试验才生效
  • C.create_study 的 direction 决定优化的方向
  • D.抛出 TrialPruned 异常会导致整个 study 失败← 正确答案

答案:D。TrialPruned 是 Optuna 设计的“正常中止信号”,被剪枝的 trial 只是以 PRUNED 状态收尾,整个 study 会继续跑其他试验,绝不会因此失败。A、B、C 都是正确描述。这个题考的是对剪枝机制“优雅退出”的理解,而不是把它当成程序崩溃。