使用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={}, distributinotallow={'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://www.kaggle.com/code/averma111/pytorch-ps3e15-optuna




























