乐趣区

关于人工智能:使用Optuna进行PyTorch模型的超参数调优

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

退出移动版