使用Optuna進(jìn)行PyTorch模型的超參數(shù)調(diào)優(yōu)
Optuna是一個(gè)開源的超參數(shù)優(yōu)化框架,Optuna與框架無關(guān),可以在任何機(jī)器學(xué)習(xí)或深度學(xué)習(xí)框架中使用它。本文將以表格數(shù)據(jù)為例,使用Optuna對(duì)PyTorch模型進(jìn)行超參數(shù)調(diào)優(yōu)。
Optuna可以使用python pip安裝,如pip install Optuna。也可以使用conda install -c conda-forge Optuna,安裝基于Anaconda的python發(fā)行版。
正如您所看到的,使用基本python語言的幾行代碼,您可以為任何神經(jīng)網(wǎng)絡(luò)創(chuàng)建并執(zhí)行試驗(yàn)。
OPUTNA有一個(gè)簡單的基于API的實(shí)現(xiàn),允許用戶定義要優(yōu)化的度量和要調(diào)查的超參數(shù)空間。只需要調(diào)用一個(gè)函數(shù)來執(zhí)行優(yōu)化過程。它支持廣泛的優(yōu)化算法,包括隨機(jī)搜索、網(wǎng)格搜索和貝葉斯優(yōu)化。并且它可以支持連續(xù)、整數(shù)和分類超參數(shù)的優(yōu)化,以及具有復(fù)雜依賴關(guān)系的超參數(shù)。
Oputna的簡單介紹
讓我們先了解Oputna框架的基本術(shù)語。
Trial:-Trial是評(píng)估一個(gè)目標(biāo)函數(shù)的過程。該對(duì)象傳遞給目標(biāo)函數(shù),提供獲取參數(shù)建議、管理試用狀態(tài)和設(shè)置/獲取試用自定義屬性的接口。
Study:一個(gè)Study對(duì)應(yīng)于一個(gè)優(yōu)化任務(wù),即一組試驗(yàn)。該對(duì)象提供了運(yùn)行新試驗(yàn)、訪問試驗(yàn)歷史、設(shè)置/獲取研究本身的用戶定義屬性的接口。
Study中包含了一個(gè)重要的create_study方法,它是創(chuàng)建新的Study對(duì)象方法重要參數(shù)如下:
- Objective :目標(biāo)函數(shù)是Optuna優(yōu)化超參數(shù)選擇的核心。雖然暴力網(wǎng)格搜索也是尋找最小化目標(biāo)函數(shù),但它實(shí)際上并沒有考慮到超參數(shù)的哪種組合效果好或不好。
- Sampler :是一個(gè)采樣器對(duì)象,實(shí)現(xiàn)了值建議的后臺(tái)算法。如果指定None,則單目標(biāo)優(yōu)化時(shí)使用TPESampler,多目標(biāo)優(yōu)化時(shí)使用NSGAIISampler。
- Pruner :是一個(gè)修剪器對(duì)象,決定提前停止沒有希望的試驗(yàn)。如果指定None,則使用MedianPruner作為默認(rèn)值。
- Study_name:研究的名稱。如果此參數(shù)設(shè)置為None,則自動(dòng)生成唯一的名稱。
- Directions : 多目標(biāo)優(yōu)化過程中的方向序列。
Pytorch模型
為了適應(yīng)Oputna的超參數(shù)是搜素,我們需要一個(gè)函數(shù)來根據(jù)不同的參數(shù)返回不同的Pytorch模型,大概是這個(gè)樣子的:
我們幾個(gè)超參數(shù)包括,In_Features ,N_Layers ,DropOut 和N_ouput
而trial 是Oputna傳遞的Trial 實(shí)現(xiàn)。
目標(biāo)函數(shù)
目標(biāo)函數(shù)由我們要優(yōu)化的超參數(shù)組成。在我們的例子中,除了上面的模型的超參數(shù)外,還需要優(yōu)化learning_rate、weight_decay和不同的優(yōu)化器,所以定義如下:
訓(xùn)練循環(huán)
訓(xùn)練循環(huán)是Optuna中最重要的組成部分。在下面的例子中,我們對(duì)定義目標(biāo)函數(shù)的參數(shù)字典進(jìn)行參數(shù)化。
Study
正如我們上面所說的,Optuna研究在數(shù)據(jù)集中進(jìn)行了多例試驗(yàn),我們使用損失函數(shù)為RMSE,所以方向是最小化RMSE。在這個(gè)中使用TPESampler.Tree-structured估計(jì)器。
結(jié)果展示
由于數(shù)據(jù)集非常小,試驗(yàn)在25個(gè)循環(huán)內(nèi)結(jié)束。以下是細(xì)節(jié)。下面給出了最佳試驗(yàn)和超參數(shù)組合,將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
我們還可以通過下面的函數(shù)進(jìn)行結(jié)果的可視化
optuna.visualization.plot_optimization_history(study)
optuna.visualization.plot_param_importances(study)
optuna.visualization.plot_slice(study)
optuna.visualization.plot_parallel_coordinate(study)
以上就是使用optuna調(diào)優(yōu)Pytorch模型的全部過程,本文的源代碼在這里,并且有完整的運(yùn)行結(jié)果,如果你想自己調(diào)整或者學(xué)習(xí),請(qǐng)看這個(gè)連接:https://www.kaggle.com/code/averma111/pytorch-ps3e15-optuna