首頁  >  文章  >  科技週邊  >  超參數優化比較之網格搜尋、隨機搜尋和貝葉斯優化

超參數優化比較之網格搜尋、隨機搜尋和貝葉斯優化

WBOY
WBOY轉載
2023-04-04 12:05:082043瀏覽

本文將詳細介紹用來提高機器學習效果的最常見的超參數最佳化方法。

譯者| 朱先忠

審校| 孫淑娟

簡介

通常,在嘗試改進機器學習模型時,人們首先想到的解決方案是增加更多的訓練資料。額外的數據通常是有幫助(在某些情況下除外)的,但產生高品質的數據可能非常昂貴。透過使用現有數據獲得最佳模型效能,超參數優化可以節省我們的時間和資源。

顧名思義,超參數最佳化是為機器學習模型確定最佳超參數組合以滿足最佳化函數(即,給定研究中的資料集,最大化模型的效能)的過程。換句話說,每個模型都會提供多個有關選項的調整“按鈕”,我們可以改變它們,直到我們模型的超參數達到最佳組合。在超參數優化過程中,我們可以更改的參數的一些範例可以是學習率、神經網路的架構(例如,隱藏層的數量)、正規化等。

在這篇文章中,我們將從概念上介紹三種最常見的超參數優化方法,即網格搜尋、隨機搜尋和貝葉斯優化,然後將它們逐一實現。

我將在文章一開始提供一個高層次的比較表,以供讀者參考,然後將在本文的其餘部分進一步探討、解釋和實施比較表中的每一項。

超參數優化比較之網格搜尋、隨機搜尋和貝葉斯優化

表1:超參數最佳化方法比較

#1.網格搜尋演算法

網格搜尋可能是超參數優化的最簡單和最直觀的方法,它涉及在定義的搜尋空間中徹底搜尋超參數的最佳組合。在此上下文中的「搜尋空間」是整個超參數以及在最佳化過程中考慮的此類超參數的值。讓我們透過一個範例來更好地理解網格搜尋。

假設我們有一個只有三個參數的機器學習模型,每個參數都可以移除表格中提供的值:

parameter_1 = [1 , 2, 3]
parameter_2 = [a, b, c]
parameter_3 = [x, y, z]

我們不知道這些參數的哪個組合將優化我們的模型的最佳化功能(即為我們的機器學習模型提供最佳輸出)。在網格搜尋中,我們只需嘗試這些參數的每一個組合,測量每個參數的模型效能,然後簡單地選擇產生最佳效能的組合!在此範例中,參數1可以取3個值(即1、2或3),參數2可以取3種值(即a、b和c),參數3可以取3種值(即x、y和z)。換句話說,總共有3*3*3=27個組合。本例中的網格搜尋將涉及27輪評估機器學習模型的性能,以找到性能最佳的組合。

如您所見,這種方法非常簡單(類似於試誤任務),但也有一些限制。讓我們一起總結一下此方法的優點和缺點。

其中,優勢包括:

  • 易於理解和實施
  • 易於並行化
  • 適用於離散和連續空間缺點主要有:
  • 在具有大量超參數的大型和/或複雜模型中成本高昂(因為必須嘗試和評估所有組合)
  • 無記憶——不從過去的觀察中學習
  • 如果搜尋空間太大,可能無法找到最佳組合我的建議是,如果您有一個搜尋空間較小的簡單模型,請使用網格搜尋;否則,建議繼續往下閱讀以找到更適合更大搜尋空間的解決方案。
    現在,讓我們用一個真實的範例來實現網格搜尋。

1.1.網格搜索演算法實現

為了實現網格搜索,我們將使用scikit-learn中的Iris資料集創建一個隨機森林分類模型。此資料集包括3種不同的鳶尾花瓣和萼片長度,將用於本次分類練習。在本文中,模型開發是次要的,因為目標是比較各種超參數最佳化策略的效能。我鼓勵您專注於模型評估結果,以及每種超參數最佳化方法達到所選超參數集所需的時間。我將描述運行結果,然後為本文中使用的三種方法提供一個匯總比較表。

包含所有超參數值的搜尋空間,定義如下:

search_space = {'n_estimators': [10, 100, 500, 1000],
'max_depth' : [2, 10, 25, 50, 100],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 5, 10]}

上述搜尋空間由4*5*3*3=180個超參數的總組合組成。我們將使用網格搜尋來找到最佳化目標函數的組合,如下所示:

# Import libraries
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier#cross-from skle#. import time
# 載入Iris資料集
iris = load_iris()
X, y = iris.data, iris.target
#定義超參數搜尋空間
search_space = {'n_estimators': [10, 100, 500, 1000],
'max_depth': [2, 10, 25, 50, 100],
'min_samples_split': [2, 5, 10],
'min_samples_split': [2, 5, 10 ],
'min_samples_leaf': [1, 5, 10]}
#定義隨機林分類器
clf = RandomForestClassifier(random_state=1234)
# 產生最佳化器物件
optimizer = GridSearchCV(clf, search_space, cv=5, scoring='accuracy')
#儲存起始時間,以便用於計算總的耗時
start_time = time.time()
#擬合資料上的最佳化器
optimizer.fit(X, y)
# 儲存結束時間,以便用於計算總的耗時
end_time = time.time ()
# 列印最佳超參數集和對應分數
print(f"selected hyperparameters:")
print(optimizer.best_params_)
#print("")
print(f"best_score: {optimizer.best_score_}")
print(f"elapsed_time: {round(end_time-start_time, 1)}")
上面程式碼的輸出結果如下:

超參數優化比較之網格搜尋、隨機搜尋和貝葉斯優化

這裡我們可以看到使用網格搜尋選擇的超參數值。其中,best_score描述了使用所選超參數集的評估結果,而elapsed_time描述了我的本地筆記型電腦執行此超參數最佳化策略所花費的時間。在進行下一種方法時,請記住評估結果和經過的時間,以便進行比較。現在,讓我們進入隨機搜尋的討論。

2.隨機搜尋演算法

顧名思義,隨機搜尋是從定義的搜尋空間中隨機取樣超參數的過程。與網格搜尋不同,隨機搜尋只會在預先定義的迭代次數(取決於可用資源,如時間、預算、目標等)中選擇超參數值的隨機子集,併計算每個超參數的機器學習模型的效能,然後選擇最佳的超參數值。

根據上述方法,您可以想像,與完整的網格搜尋相比,隨機搜尋成本更低,但仍有其自身的優勢和劣勢,如下所示:

#優勢:

    易於理解和實作
  • 易於並行化
  • 適用於離散和連續空間
  • 比網格搜尋便宜
  • 與具有相同嘗試次數的網格搜尋相比,更可能收斂到最優缺點:
  • 無記憶——不從過去的觀察中學習
  • 考慮到隨機選擇,可能會錯過重要的超參數值
在下一個方法中,我們將透過貝葉斯優化解決網格和隨機搜尋的「無記憶”缺點。但在討論此方法之前,讓我們先來實現隨機搜尋。

2.1.隨機搜尋演算法實作

使用下面的程式碼片段,我們將針對網格搜尋實作中描述的相同問題實現隨機搜尋超參數最佳化。

# 導入函式庫

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint

# 建立一個RandomizedSearchCV 物件 =##optimizer #nidized clf, param_distributinotallow=search_space,
n_iter=50, cv=5, scoring='accuracy',
random_state=1234)

## 儲存開始時間以計算總運行時間
start_time = time.time()

# 擬合資料上的最佳化器
optimizer.fit(X, y)

# 儲存結束時間以計算總運行時間
end_time = time.time()

# 列印最佳超參數集和對應分數
print(f"selected hyperparameters:")
print(optimizer .best_params_)
print("")
print(f"best_score: {optimizer.best_score_}")
print(f"elapsed_time: {round(end_time-start_time, 1)}" )

上面程式碼的輸出結果如下:

超參數優化比較之網格搜尋、隨機搜尋和貝葉斯優化#隨機搜尋結果

#與網格搜尋的結果相比,這些結果非常有趣。 best_score保持不變,但elapsed_time從352.0秒減少到75.5秒!真是令人印象深刻!換句話說,隨機搜尋演算法設法找到了一組超參數,在網格搜尋所需時間的21%左右,其效能與網格搜尋相同!但是,這裡的效率高得多。

接下來,讓我們繼續我們的下一個方法,稱為貝葉斯優化,它從優化過程中的每一次嘗試中學習。

3.貝葉斯最佳化

貝葉斯最佳化是一種超參數最佳化方法,它使用機率模型從先前的嘗試中“學習”,並將搜尋引向搜尋空間中超參數的最佳組合,從而優化機器學習模型的目標函數。

貝葉斯最佳化方法可以分為4個步驟,我將在下面描述。我鼓勵您通讀這些步驟,以便更好地理解流程,但使用這種方法並不需要什麼前提知識。

  1. 定義一個“先驗”,這是一個關於我們在某個時間點對優化目標函數最可能的超參數組合的信念的機率模型
  2. 評估超參數樣本的模型
  3. 使用步驟2中獲得的知識,更新步驟1中的機率模型(即我們所稱的「先驗」),以了解我們認為優化目標函數的超參數的最可能組合在哪裡。我們更新的信念稱為「後驗」。換句話說,在步驟2中獲得的知識幫助我們更好地了解搜尋空間,並將我們從先驗帶到後驗,使後驗成為我們關於搜尋空間和目標函數的「最新」知識,由步驟2提供資訊
  4. 重複步驟2和3,直到模型效能收斂、資源耗盡或滿足其他預定義指標

如果您有興趣了解更多有關貝葉斯優化的詳細信息,可以查看以下帖子:

《機器學習中的貝葉斯優化演算法》,地址是:
https://medium.com/@fmnobar/conceptual -overview-of-bayesian-optimization-for-parameter-tuning-in-machine-learning-a3b1b4b9339f。

現在,既然我們已經了解了貝葉斯優化是如何運作的,那麼讓我們來看看它的優點和缺點。

優勢:

  • 從過去的觀察中學習,因此效率更高。換句話說,與無記憶方法相比,它有望在更少的迭代中找到一組更好的超參數
  • 在給定某些假設的情況下收斂到最優缺點:
  • 難以並行化
  • 計算量大於網格和每次迭代的隨機搜尋
  • 先驗和貝葉斯優化中使用的函數(例如,獲取函數等)的初始機率分佈的選擇會顯著影響性能及其學習曲線

在排除了細節之後,讓我們實現貝葉斯優化並查看結果。

3.1.貝葉斯最佳化演算法實作

與上一節類似,我們將使用下面的程式碼片段為網格搜尋實作中描述的相同問題實作貝葉斯超參數最佳化.

# 導入庫
from skopt import BayesSearchCV

# 執行貝葉斯最佳化
optimizer = BayesSearchCV(estimator=RandomForestClassifier(),
search_spacesCV(estimator=RandomForestClassifier(),
# =search_space,
n_iter=10,
cv=5,
scoring='accuracy',
random_state=1234)

# 儲存開始時間以計算總運行時間
start_time = time.time()

optimizer.fit(X, y)

# 儲存結束時間以計算總運行時間
end_time = time.time()

# 列印最佳超參數集和對應分數
print(f"selected hyperparameters:")
print(optimizer.best_params_)
print("")
print(f"best_score: {optimizer.best_score_}")print(f"elapsed_time: {round(end_time-start_time, 1)}")

上面程式碼的輸出結果如下:

超參數優化比較之網格搜尋、隨機搜尋和貝葉斯優化

貝葉斯最佳化結果

另一組有趣的結果! best_score與我們透過網格和隨機搜尋獲得的結果保持一致,但結果僅用了23.1秒,而隨機搜尋為75.5秒,網格搜尋為352.0秒!換句話說,使用貝葉斯優化所需的時間比網格搜尋所需的時間大約少93%。這是一個巨大的生產力提升,在更大、更複雜的模型和搜尋空間中變得更有意義。

請注意,貝葉斯優化只使用了10次迭代就獲得了這些結果,因為它可以從先前的迭代中學習(與隨機和網格搜尋相反)。 ###

結果比較

下表對目前所討論的三種方法的結果進行了比較。 「Methodology(方法論)」一欄描述了所使用的超參數最佳化方法。隨後是使用每種方法選擇的超參數。 “Best Score”是使用特定方法獲得的分數,然後是“Elapsed Time”,表示優化策略在我的本地筆記型電腦上運行所需的時間。最後一列「獲得的效率(Gained Efficiency)」假設網格搜尋為基線,然後計算與網格搜尋相比,其他兩種方法中每種方法獲得的效率(使用經過的時間)。例如,由於隨機搜尋耗時75.5秒,而網格搜尋耗時352.0秒,因此相對於網格搜尋的基線,隨機搜尋的效率計算為1–75.5/352.0=78.5%。

超參數優化比較之網格搜尋、隨機搜尋和貝葉斯優化

表2-方法效能比較表

以上比較表中的兩個主要結論:

  1. #效率:我們可以看到貝葉斯優化等學習方法如何在更短的時間內找到一組優化的超參數。
  2. 參數選擇:可以有多個正確答案。例如,貝葉斯優化的選定參數與網格和隨機搜尋的參數不同,儘管評估度量(即best_score)保持不變。這在更大、更複雜的環境中更為重要。

結論

在這篇文章中,我們討論了什麼是超參數最佳化,並介紹了用於此最佳化練習的三種最常見的方法。然後,我們詳細介紹了這三種方法中的每一種,並在分類練習中實現了它們。最後,我們比較了實施這三種方法的結果。我們發現,從先前的嘗試中學習的貝葉斯優化等方法可以顯著提高效率,這可能是大型複雜模型(如深度神經網路)中的一個重要因素,其中效率可能是一個決定因素。

譯者介紹

朱先忠,51CTO社群編輯,51CTO專家部落格、講師,濰坊一所高校電腦教師,自由程式設計界老兵一枚。

原文標題:Hyperparameter Optimization — Intro and Implementation of Grid Search, Random Search and Bayesian Optimization#,作者:Farzad Mahmoodinobarzad Mahmoodinobarzad



#

以上是超參數優化比較之網格搜尋、隨機搜尋和貝葉斯優化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除