Optuna 是一个开源的超参数优化框架,Optuna 与框架无关,能够在任何机器学习或深度学习框架中应用它。本文将以表格数据为例,应用 Optuna 对 PyTorch 模型进行超参数调优。
Optuna 能够应用 python pip 装置,如 pip install Optuna。也能够应用 conda install -c conda-forge Optuna,装置基于 Anaconda 的 python 发行版。
正如您所看到的,应用根本 python 语言的几行代码,您能够为任何神经网络创立并执行试验。
OPUTNA 有一个简略的基于 API 的实现,容许用户定义要优化的度量和要考察的超参数空间。只须要调用一个函数来执行优化过程。它反对宽泛的优化算法,包含随机搜寻、网格搜寻和贝叶斯优化。并且它能够反对间断、整数和分类超参数的优化,以及具备简单依赖关系的超参数。
Oputna 的简略介绍
让咱们先理解 Oputna 框架的根本术语,
Trial:-Trial 是评估一个指标函数的过程。该对象传递给指标函数,提供获取参数倡议、治理试用状态和设置 / 获取试用自定义属性的接口。
Study: 一个 Study 对应于一个优化工作,即一组试验。该对象提供了运行新试验、拜访试验历史、设置 / 获取钻研自身的用户定义属性的接口。
Study 中蕴含了一个重要的 create_study 办法,它是创立新的 Study 对象办法重要参数如下:
- Objective : 指标函数是 Optuna 优化超参数抉择的外围。尽管暴力网格搜寻也是寻找最小化指标函数,但它实际上并没有思考到超参数的哪种组合成果好或不好。
- Sampler : 是一个采样器对象,实现了值倡议的后盾算法。如果指定 None,则单指标优化时应用 TPESampler,多指标优化时应用 NSGAIISampler。
- Pruner : 是一个修剪器对象,决定提前进行没有心愿的试验。如果指定 None,则应用 MedianPruner 作为默认值。
- Study_name: 钻研的名称。如果此参数设置为 None,则主动生成惟一的名称。
- Directions : 多指标优化过程中的方向序列。
Pytorch 模型
为了适应 Oputna 的超参数是搜素,咱们须要一个函数来依据不同的参数返回不同的 Pytorch 模型,大略是这个样子的:
咱们几个超参数包含,In_Features,N_Layers,DropOut 和 N_ouput
而 trial 是 Oputna 传递的 Trial 实现。
指标函数
指标函数由咱们要优化的超参数组成。在咱们的例子中,除了下面的模型的超参数外,还须要优化 learning_rate、weight_decay 和不同的优化器,所以定义如下:
训练循环
训练循环是 Optuna 中最重要的组成部分。在上面的例子中,咱们对定义指标函数的参数字典进行参数化。
Study
正如咱们下面所说的,Optuna 钻研在数据集中进行了多例试验,咱们应用损失函数为 RMSE,所以方向是最小化 RMSE。在这个中应用 TPESampler.Tree-structured 预计器。
后果展现
因为数据集十分小,试验在 25 个循环内完结。以下是细节。上面给出了最佳试验和超参数组合,将 RMSE 最小化到 0.058。
Study statistics:
Number of finished trials: 25
Number of pruned trials: 0
Number of complete trials: 25
Best trial: FrozenTrial(number=18, state=TrialState.COMPLETE, values=[0.058233041420927334], datetime_start=datetime.datetime(2023, 5, 21, 5, 9, 43, 683621), datetime_complete=datetime.datetime(2023, 5, 21, 5, 10, 7, 935450), params={'learning_rate': 0.0010084133367699304, 'optimizer': 'Adam', 'weight_decay': 0.00013535005248600755, 'n_layers': 2, 'dropout': 0.2, 'n_units_l0': 7, 'n_units_l1': 6}, user_attrs={}, system_attrs={}, intermediate_values={}, distributions={'learning_rate': FloatDistribution(high=0.01, log=True, low=0.001, step=None), 'optimizer': CategoricalDistribution(choices=('Adam', 'RMSprop', 'SGD')), 'weight_decay': FloatDistribution(high=0.001, log=True, low=0.0001, step=None), 'n_layers': IntDistribution(high=4, log=False, low=2, step=1), 'dropout': FloatDistribution(high=0.5, log=False, low=0.1, step=0.1), 'n_units_l0': IntDistribution(high=8, log=False, low=2, step=1), 'n_units_l1': IntDistribution(high=7, log=False, low=2, step=1)}, trial_id=18, value=None)
Value: 0.058233041420927334
Best Trail Params:
learning_rate: 0.0010084133367699304
optimizer: Adam
weight_decay: 0.00013535005248600755
n_layers: 2
dropout: 0.2
n_units_l0: 7
n_units_l1: 6
咱们还能够通过上面的函数进行后果的可视化
optuna.visualization.plot_optimization_history(study)
optuna.visualization.plot_param_importances(study)
optuna.visualization.plot_slice(study)
optuna.visualization.plot_parallel_coordinate(study)
以上就是应用 optuna 调优 Pytorch 模型的全副过程,本文的源代码在这里,并且有残缺的运行后果,如果你想本人调整或者学习,请看这个连贯
https://avoid.overfit.cn/post/86d01db7af8845b88ff1c753e7200a50
作者:Ashish Verma