超引數最佳化完整指南

Baihai_IDP發表於2022-12-14

編者按:今天為大家帶來的一份超全的超引數調優指南,可謂一文在手,超引數調優無敵手。本文主要介紹了超引數調優的基本概念、常用方法和演算法,以及超引數調優的工具推薦。

小編溫馨提示,全文閱讀預計需要20-30分鐘,可以先收藏哦!

話不多說,開啟超引數調優之旅吧,Enjoy!

作者 | Shahul ES, Aayush Bajaj

編譯 | 嶽揚

為機器學習或深度學習模型選擇正確的超引數是從模型中提取精華的最佳方式之一。在本篇文章中,我們將向讀者展示一些目前可用的做超引數調優的最佳方法。

引數和超引數有什麼區別?

首先,讓我們瞭解機器學習中超引數和引數之間的區別。

  • 模型引數:這些是由模型從給定的資料中估計出來的引數。例如,一個深度神經網路的權重。
  • 模型超引數:這些是不能由模型從給定資料中估計的引數,超引數被用來估計模型的引數,例如,深度神經網路的學習率。
    64cf25c56f156d098de7b3920e235a8a.png

模型引數與模型超引數 | 來源:https://www.geeksforgeeks.org...

什麼是超引數調優,為什麼他如此重要?

超引數調優[1](或超引數最佳化)是確定使模型效能最大化的超引數正確組合的過程。其在一個訓練過程中執行多個試驗。每一次試驗都是訓練程式的完整執行,並在指定的範圍內選擇超引數設定值。這個過程一旦完成,就會給你一組最適合模型的超引數值,以獲得最佳結果。

毫無疑問,這是任何機器學習專案中的一個比較重要的步驟,因為其影響了模型的最佳結果。如果你希望看到超引數調優的作用,這裡有一篇研究論文[2],透過在資料集上的實驗,介紹了超引數最佳化的重要性。

如何進行超引數調優,找到最佳的超引數?

選擇正確的超引數組合需要擁有對超引數和業務用例的深刻理解。然而,從技術上講,有兩種方法來找到它們。

1) 手動超引數調優
手動超引數調優包括透過手動方式來實驗不同的超引數集。這種技術將需要一個強大的實驗跟蹤器,要能夠跟蹤從影像、日誌到系統指標的各種變數。典型的提供試驗追蹤功能的工具包括Neptune, W&B、Comet或者MLflow。

手動超引數最佳化的優勢 ?

手動調整超引數意味著對這個過程有更多的人為控制。

如果正在研究或學習調優以及它是如何影響網路權重的,那麼手動操作將是有意義的。

手動超引數最佳化的劣勢 ?

手動調優是一個繁瑣的過程,可能會有很多試驗,而且保持跟蹤是比較昂貴和耗時的。

當有很多超引數需要考慮時,這並不是一個非常實用的方法。

閱讀關於如何手動最佳化機器學習模型超引數:How to Manually Optimize Machine Learning Model Hyperparameters - MachineLearningMastery.com

2) 自動超引數調優
自動超引數調優是利用已有的演算法來實現這一過程的自動化。需要遵循的步驟為:

首先,指定一組超引數和對這些超引數值的限制(注意:每個演算法都要求這組引數是一個特定的資料結構,例如,字典)。

然後,該演算法執行這些試驗,併為你提取最佳的超引數集,以獲得最佳的結果。

超引數調優方法

在本節中,我將介紹當今流行的所有超引數最佳化方法。

1) 隨機搜尋(Random Search)
在隨機搜尋方法[4]中,我們為超引數建立了擁有很多可能值的網格。每次迭代都從這個網格中嘗試隨機的超引數組合,記錄效能,最後得到最佳效能的超引數組合。

2) 網格搜尋(Grid Search)
在網格搜尋法中,我們為超引數建立了一個可能值的網格。每次迭代都以特定的順序嘗試超引數的組合。它在每一個可能的超引數組合上擬合模型並記錄模型的效能。最後,它返回具有最佳超引數的最佳模型。

c4b6babb4f455d9c1ee5356d9debd31e.png

來源:https://nanonets.com/blog/hyp...
3) 貝葉斯最佳化
為模型調整和尋找合適的超引數是一種最佳化問題。我們希望透過改變模型引數來最小化我們模型的損失函式。貝葉斯最佳化幫助我們透過最少的步驟中找到最小的點。貝葉斯最佳化還使用了採集函式(Acquisition Funtion),將取樣引向有可能比當前最佳觀察結果更好的區域。

4) Tree-structured Parzen estimators (TPE)
基於樹的帕森最佳化的理念與貝葉斯最佳化很相似。TPE不是尋找p(y|x)的值——其中y是要最小化的函式(例如,驗證損失),x是超引數的值,而是建立P(x|y)和P(y)的模型。TPE演算法的一個很大的缺點是,它們沒有對超引數之間的相互作用進行建模。儘管如此,TPE在實踐中的效果非常好,並在大多數領域透過了實戰檢驗。

超引數調優演算法
這些是專門為超引數調優而開發的演算法。

1) Hyperband
Hyperband是隨機搜尋的一個變種,但運用探索與利用理論[5],以便找到每個配置的最佳時間分配。你可以檢視這篇研究論文[6],以獲得進一步的參考。

2) Population-based training (PBT)
這種技術是兩種最常用的搜尋技術的混合,同時將隨機搜尋和手動調整應用於神經網路模型。

PBT首先用隨機超引數並行訓練多個神經網路,但是這些網路並不是完全相互獨立的。其使用來自其他群體的資訊來完善超引數,並確定要嘗試的超引數值。你可以檢視這篇文章[7],瞭解更多關於PBT的資訊。

3) 貝葉斯最佳化
為模型調整和尋找合適的超引數是一種最佳化問題。我們希望透過改變模型引數來最小化我們模型的損失函式。貝葉斯最佳化幫助我們透過最少的步驟中找到最小的點。貝葉斯最佳化還使用了採集函式(Acquisition Funtion),將取樣引向有可能比當前最佳觀察結果更好的區域。

4) Tree-structured Parzen estimators (TPE)
基於樹的帕森最佳化的理念與貝葉斯最佳化很相似。TPE不是尋找p(y|x)的值——其中y是要最小化的函式(例如,驗證損失),x是超引數的值,而是建立P(x|y)和P(y)的模型。TPE演算法的一個很大的缺點是,它們沒有對超引數之間的相互作用進行建模。儘管如此,TPE在實踐中的效果非常好,並在大多數領域透過了實戰檢驗。

超引數調優演算法

這些是專門為超引數調優而開發的演算法。

1) Hyperband
Hyperband是隨機搜尋的一個變種,但運用探索與利用理論[5],以便找到每個配置的最佳時間分配。你可以檢視這篇研究論文[6],以獲得進一步的參考。

2) Population-based training (PBT)
這種技術是兩種最常用的搜尋技術的混合,同時將隨機搜尋和手動調整應用於神經網路模型。

PBT首先用隨機超引數並行訓練多個神經網路,但是這些網路並不是完全相互獨立的。其使用來自其他群體的資訊來完善超引數,並確定要嘗試的超引數值。你可以檢視這篇文章[7],瞭解更多關於PBT的資訊。

179e9446957e349b283282725eabacc1.png
來源:https://deepmind.com/blog/art...

3) BOHB
BOHB(Bayesian Optimization and HyperBand)混合了Hyperband演算法和Bayesian最佳化。你可以檢視這篇文章來進一步參考:https://www.automl.org/blog_b...

超引數調優的工具

1) Scikit-learn
Scikit-learn有網格搜尋和隨機搜尋的實現,對於此兩種方法,scikit-learn在不同的引數選擇上,以K-fold交叉驗證的方式訓練和評估模型,並返回最佳模型。

具體來說:

  • 隨機搜尋:用gridsearchcv在一些隨機的引數組合上執行搜尋。
  • 網格搜尋:用gridsearchcv在網格中的所有引數集上執行搜尋。

用Scikit-learn調整模型是一個好的開始,但還有更好的選擇,而且它們往往擁有隨機搜尋策略。

2) Scikit-optimize
Scikit-optimize[8]使用一種基於序列模型的最佳化演算法,在較短的時間內找到超引數搜尋問題的最優解。

Scikit-optimize提供了除超引數最佳化之外的許多功能,例如:

  • 儲存和載入最佳化結果。
  • 收斂圖
  • 比較代理模型

3) Optuna
Optuna使用過往記錄的軌跡細節來確定有希望的區域來搜尋最佳化超引數,從而在最短的時間內找到最佳超引數。

它具有修剪功能,可以在訓練的早期階段自動停止沒有希望的軌跡。optuna提供的一些關鍵功能是:

  • 輕量級的、多功能的、與平臺無關的架構
  • Python風格的搜尋空間
  • 高效的最佳化演算法
  • 易於並行化
  • 快速視覺化

在IDP中,可以快速開始使用Optuna。

4) Hyperopt
Hyperopt允許使用者建立一個搜尋空間,在該空間中,使用者期望得到最好的結果,使Hyperopt中的演算法能夠更有效地搜尋。

目前,Hyperopt中實現了三種演算法:

  • 隨機搜尋
  • Tree of Parzen Estimators(TPE)
  • 自適應的TPE

要使用hyperopt,首先應該確定:

  • 要最小化的目標函式
  • 搜尋的空間
  • 用於儲存所有搜尋點評估的資料庫
  • 要使用的搜尋演算法

教程(https://github.com/hyperopt/h...)將指導你如何構建程式碼並使用hyperopt包來獲得最佳的超引數。你也可以閱讀這篇文章(https://mlwhiz.com/blog/2019/...)以瞭解更多關於如何使用Hyperopt的資訊。

5) Ray Tune
Ray Tune是在任何規模下進行實驗和超引數調優的一個比較流行的選擇。Ray利用分散式計算來加速超引數的最佳化,併為幾種最先進的最佳化演算法提供了規模化的實現。

Ray Tune提供的核心功能:

  • 透過利用Ray,實現開箱即用的分散式非同步最佳化
  • 易於擴充套件
  • 提供了SOTA演算法,如ASHA、BOHB和基於群體的訓練(population based training)。
  • 支援Tensorboard和MLflow。

支援各種框架,如Sklearn、XGBoost、TensorFlow、PyTorch等。

你可以參考這個教程(https://docs.ray.io/en/latest...)。

6) Keras Tuner
Keras Tuner可以為TensorFlow程式挑選最佳的超引數集。當建立一個用於超引數調優的模型時,除了模型架構外,還會定義超引數搜尋空間。你為超引數調整所建立的模型被稱為超模型。

你可以透過兩種方法定義超引數模型:

  • 透過使用一個模型構建器函式
  • 透過子類化Keras Tuner API的HyperModel類

你也可以將兩個預定義的HyperModel類——HyperXception和HyperResNet用於計算機視覺應用。

你可以參考這個官方教程(https://www.tensorflow.org/tu...),瞭解進一步的實施細節。

7) BayesianOptimization
BayesianOptimization旨在最小化找到接近最優組合的引數組合所需的步驟數。

這種方法使用了一個代理最佳化問題(尋找獲取函式的最大值),雖然它仍然是一個比較困難的問題,但在計算意義上花費更小,而且可以採用普通工具。因此,貝葉斯最佳化法最適合於對要最佳化的函式進行取樣比較昂貴的情況。

請訪問GitHub repo(https://github.com/fmfn/Bayes...),看看它的當前情況。

8) Metric Optimization Engine
MOE(Metric Optimization Engine)是在評估引數耗時多或代價昂貴的情況下最佳化系統引數的一種有效方法。

它非常適合於以下問題 :

  • 最佳化問題的目標函式是一個黑盒子,不一定是凸的或凹的。
  • 導數是不可用的。
  • 我們尋求全域性最優,而不僅僅是區域性最優。

這種處理黑箱目標函式的能力使我們能夠使用MOE來最佳化幾乎任何系統,而不需要任何內部知識或內部許可權。

請訪問GitHub Repo(https://github.com/Yelp/MOE)以獲得更多資訊。

9) Spearmint
Spearmint被設計為自動執行實驗(因此被命名為spearmint),其方式是迭代調整一些引數,以便在儘可能少的執行中使一些目標最小化。

在這個GitHub repo(https://github.com/HIPS/Spear...)中閱讀有關Spearmint的內容。

10) GPyOpt
GPyOpt是使用GPy的高斯過程最佳化。其使用不同的採集函式(Acquisition Functions)進行全域性最佳化。

可以使用GPyOpt來最佳化物理實驗(按順序或分批),並調整機器學習演算法的引數。它能夠透過稀疏的高斯過程模型處理大型資料集。

不幸的是,GpyOpt已經停止維護,但你仍然可以使用該軟體包進行實驗。

其GitHub repo:https://github.com/SheffieldM...

11) SigOpt
SigOpt將自動超引數調優與訓練執行跟蹤完全整合在一起,讓你對整體和達到最佳模型的路徑有一個基本的認識。

憑藉高度可定製的搜尋空間和多指標最佳化等功能,SigOpt可以在將你的模型投入生產之前,透過簡單的API進行復雜的超引數調優。

訪問這裡的文件(https://app.sigopt.com/docs/i...),瞭解更多關於SigOpt。

12) Fabolas
傳統的貝葉斯超引數最佳化器將機器學習演算法在給定資料集上的損失建模為需要最小化的黑箱函式,而Fast Bayesian Optimization on LArge data Sets (FABOLAS)則在不同的資料集大小上為損失和計算成本建模,並使用這些模型來進行具有額外自由度的貝葉斯最佳化。

你可以在這裡檢視實現fabolas的函式(https://github.com/automl/RoB...)和研究論文(https://arxiv.org/pdf/1605.07...)。

參考資料

https://towardsdatascience.co...

https://arxiv.org/pdf/2007.07...

https://docs.neptune.ai/you-s...

https://www.jmlr.org/papers/v...

https://en.wikipedia.org/wiki...

https://arxiv.org/abs/1603.06560

https://deepmind.com/blog/art...

https://scikit-optimize.githu...

https://optuna.readthedocs.io...

相關文章