Optuna 如何做多目标优化并获取 Pareto 前沿上的最佳试验

发布时间:2026/9/15 10:59:30
Optuna 如何做多目标优化并获取 Pareto 前沿上的最佳试验 Optuna 如何做多目标优化并获取 Pareto 前沿上的最佳试验【免费下载链接】optunaA hyperparameter optimization framework项目地址: https://gitcode.com/GitHub_Trending/op/optuna当一次优化需要同时兼顾两个互相冲突的指标——比如既要模型 FLOPS 低、又要验证准确率高——就没有单一“最优”解而是一批互不支配的解组成的 Pareto 前沿。Optuna 的多目标优化就是围绕这件事展开的给每个目标声明优化方向minimize/maximize用study.optimize跑完试验后通过study.best_trials拿到位于 Pareto 前沿上的试验列表再用optuna.visualization.plot_pareto_front画出前沿图形检查。本文以仓库中 多目标优化教程 为主线说明如何完成这一完整流程。安装与准备安装 Optuna$ pip install optuna教程示例基于 PyTorch 优化 Fashion MNIST 模型还会用到fvcore来测量 FLOPSFlopCountAnalysis。可视化部分需要plotly如果在 Jupyter Notebook 中运行还需要nbformat$ pip install plotly $ pip install nbformat # Required if you are running this tutorial in Jupyter Notebook.定义返回多个目标值的目标函数多目标优化中目标函数直接返回一个包含多个指标值的列表或元组。教程中同时优化 FLOPS 与准确率import optuna # Define multi-objective objective function. # Objectives are FLOPS and accuracy. def objective(trial): train_dataset torchvision.datasets.FashionMNIST( DIR, trainTrue, downloadTrue, transformtorchvision.transforms.ToTensor() ) train_loader torch.utils.data.DataLoader( torch.utils.data.Subset(train_dataset, list(range(N_TRAIN_EXAMPLES))), batch_sizeBATCHSIZE, shuffleTrue, ) val_dataset torchvision.datasets.FashionMNIST( DIR, trainFalse, transformtorchvision.transforms.ToTensor() ) val_loader torch.utils.data.DataLoader( torch.utils.data.Subset(val_dataset, list(range(N_VALID_EXAMPLES))), batch_sizeBATCHSIZE, shuffleTrue, ) model define_model(trial).to(DEVICE) optimizer torch.optim.Adam( model.parameters(), trial.suggest_float(lr, 1e-5, 1e-1, logTrue) ) for epoch in range(10): train_model(model, optimizer, train_loader) flops, accuracy eval_model(model, val_loader) return flops, accuracy其中define_model(trial)通过trial.suggest_int/trial.suggest_float动态构建网络结构层数、每层单元数、dropout 等完整实现见 教程源码。eval_model对验证集计算准确率并用FlopCountAnalysis(model, inputs...).total()得到 FLOPS。用 directions 为每个目标指定优化方向Optuna 要求为每个目标明确指定优化方向。本例中希望 FLOPS 越小越好、准确率越高越好因此directions设为[minimize, maximize]顺序与目标函数返回值一一对应study optuna.create_study(directions[minimize, maximize]) study.optimize(objective, n_trials30, timeout300) print(Number of finished trials: , len(study.trials))optuna.create_study的directions参数接收一个方向序列minimize或maximize且不能与单目标的direction参数同时指定——两者都传会抛出ValueErrorSpecify only one ofdirectionanddirections.源码校验逻辑见 create_study 实现。另外两点若不传storagecreate_study默认使用InMemoryStorageStudy 不持久化跨进程或断点续跑时需要传数据库 URL。教程建议当n_trials 1000时优先用样本效率较高的贝叶斯类采样器TPESampler或GPSampler默认采样器即TPESampler。获取 Pareto 前沿上的最佳试验优化完成后用study.best_trials获取 Pareto 前沿上的试验列表。它是多目标场景下与best_trial对应的入口——best_trial只适用于单目标多目标 Study 调用它时会抛错best_trials的定义见 Study.best_trials# Fetch the list of trials on the Pareto front with study.best_trials. print(fNumber of trials on the Pareto front: {len(study.best_trials)}) trial_with_highest_accuracy max(study.best_trials, keylambda t: t.values[1]) print(Trial with highest accuracy: ) print(f\tnumber: {trial_with_highest_accuracy.number}) print(f\tparams: {trial_with_highest_accuracy.params}) print(f\tvalues: {trial_with_highest_accuracy.values})Pareto 前沿的判定规则文档定义试验t0支配t1当且仅当t0.values在所有维度上都不差于t1.values且至少在一个维度上严格更优best_trials返回的就是不被任何其他试验支配的那批试验。上例从前沿中挑出准确率t.values[1]最高的试验并打印它的number试验编号、params超参数取值和values目标值。按这个选择逻辑你得到的number/params/values会随运行结果不同而变化不能拿固定数值做校验。用 plot_pareto_front 可视化检查前沿拿到试验列表后用 Pareto 前沿图直观检查各个试验的分布optuna.visualization.plot_pareto_front(study, target_names[FLOPS, accuracy])target_names用作坐标轴标题不指定时默认为 Objective {objective_index}。注意该函数在未指定targets时要求目标数为 2 或 3参数说明见 plot_pareto_front目标更多时需要传targets函数来指定要显示的维度。仓库中同样提供基于 matplotlib 的替代实现 optuna.visualization.matplotlib.pareto_front可在不想引入 plotly 时使用。用参数重要性分析进一步定位关键超参数拿到前沿后还可以分析哪些超参数对某个目标影响最大。教程对 FLOPSt.values[0]做参数重要性分析optuna.visualization.plot_param_importances( study, targetlambda t: t.values[0], target_nameflops )限制与进阶目标过多时改用约束教程和best_trials的文档都指出优化目标很多时目标空间的维度灾难会使试验中非支配non-dominated的占比很高事后选择变得困难。文档给出的替代路径是把部分目标建模为约束在目标函数内用trial.set_constraint设置支持约束多目标优化的采样器有NSGAIISampler、NSGAIIISampler、TPESampler和GPSampler。约束优化下best_trials只从所有约束值 ≤ 0.0 的可行试验中选取前沿。下一步想换数据集/模型复用这套流程时可直接修改 tutorial/20_recipes/002_multi_objective.py 中的define_model与eval_model保持objective返回多目标值即可。需要持久化或跨机并行时参考 RDB 教程 给create_study传数据库 URL。更多多目标相关的采样器如NSGAIISampler用法见 NSGA-II 采样器文档。【免费下载链接】optunaA hyperparameter optimization framework项目地址: https://gitcode.com/GitHub_Trending/op/optuna创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询