超引數最佳化(HPO)是機器學習模型訓練的關鍵環節,它旨在尋找最佳的超引陣列合,以最大化模型效能。不同於模型引數,超引數在訓練前設定,直接影響模型訓練過程和最終結果。選擇合適的超引數對於模型的準確性、訓練速度和泛化能力至關重要。HPO 的過程是一個迭代式的實驗,透過不斷調整超引數並評估模型效能,最終找到最佳的超引陣列態。這個過程需要管理試驗預算,並設定明確的結束標準,以避免無限制的試驗,同時確保找到足夠好的超引陣列態。
超引數最佳化服務
超引數的重要性
在機器學習模型的訓練過程中,引數與超引數扮演著不同的角色。引數是在模型訓練過程中學習得到的,它們會隨著模型的迭代而改變。相反地,超引數是靜態的,它們在訓練開始前就被定義和設定。例如,我們可以在輸入引數中設定訓練的迭代次數為30,並將神經網路的啟用函式設定為ReLU(線性整流單元),以啟動模型的訓練過程。
換句話說,任何影響模型訓練效能但無法從資料中估計的模型訓練組態,都可以被視為超引數。一個模型訓練演算法中可能包含數百個超引數,例如模型最佳化器的選擇(ADAM或RMSprop)、神經網路的層數、嵌入維度、mini-batch大小和學習率等。
為什麼超引數很重要?
超引數值的選擇對模型訓練結果有著巨大的影響。通常由人工設定的超引數值,控制著訓練演算法執行的行為,並決定了模型訓練的速度和模型的準確性。
你可以透過在TensorFlow playground中執行模型訓練來親自實驗超引數值的影響。在這個線上平台上,你可以設計自己的神經網路並訓練它來識別四種型別的圖形模式。透過設定不同的超引數,如學習率、正則化方法、啟用函式、神經網路層數和神經元數量,你不僅可以看到模型效能的變化,還可以看到學習行為(如訓練時間和學習曲線)的差異。
為了訓練模型識別像螺旋形狀這樣複雜的資料模式,我們需要非常謹慎地選擇超引數。例如,嘗試將隱藏層數量設定為6,每層神經元數量設定為5,啟用函式設定為ReLU,資料批次大小設定為10,正則化方法設定為L1。在近500次迭代訓練後,你會發現模型能夠對螺旋形圖形進行準確的分類別預測。
在研究領域,超引數選擇對模型效能的影響早已被記錄下來。以自然語言處理中的嵌入訓練為例,Levy等人的論文《Improving Distributional Similarity with Lessons Learned from Word Embeddings》揭示了詞嵌入的大部分效能提升是由於某些系統設計選擇以及超引數的最佳化,而不是嵌入演算法本身。在NLP嵌入訓練中,作者發現超引數的選擇比訓練演算法的選擇有更大的影響!由於超引數選擇對模型訓練效能至關重要,因此超引數調優現在已經成為模型訓練過程中的一個標準步驟。
理解超引數最佳化
現在你已經對超引數有了深入的瞭解,並知道它們為什麼對模型訓練如此重要,讓我們來看看如何為你的模型最佳化它們。在本文中,我們將帶你瞭解超引數最佳化(HPO)的步驟。我們還將探討用於最佳化超引數的HPO演算法,以及執行HPO的常見方法。
什麼是HPO?
HPO,或稱調優,是發現一組能夠產生最佳模型的超引數的過程。這裡的最佳模型是指在給定資料集上最小化預定義損失函式的模型。在圖5.1中,你可以看到HPO對模型訓練過程的高層檢視。
此圖示展示了HPO工作流程的高層檢視,表明該過程本質上是一個實驗,以找到最佳的超引數值。
HPO的工作流程
從圖5.1中,我們可以看到一個HPO工作流程可以被視覺化為一個由四個步驟組成的迴圈。它告訴我們,HPO過程是一個重複的模型訓練過程,只不過每次神經網路都使用不同的超引數集進行訓練。最佳的超引數集將在這個過程中被發現。我們通常將每次模型訓練的執行稱為一個試驗。整個HPO實驗是一個試驗迴圈,在這個迴圈中,我們一個接一個地執行試驗,直到達到結束標準。
試驗步驟
每個試驗有四個步驟,如圖5.1所示。步驟1是用一組超引數值訓練神經網路。步驟2是評估訓練輸出(模型)。在步驟3中,HPO過程檢查是否滿足了結束標準——例如,我們是否用完了試驗預算,或者模型是否達到了預定的效能目標。
#### 內容解密:
- 超引數最佳化的重要性:超引數最佳化對於提高模型的效能至關重要,因為合適的超引數能夠顯著提升模型的準確性和訓練效率。
- HPO的工作流程:HPO是一個迭代過程,透過不斷調整超引數並評估模型的效能,最終找到最佳的超引陣列合。
- 試驗預算的管理:在進行HPO時,需要管理試驗預算,避免無限制地進行試驗,同時確保能夠找到足夠好的超引陣列態。
- 結束標準的設定:結束標準的設定對於HPO過程非常重要,它決定了何時停止試驗。可以根據試驗預算、模型效能等多個因素來設定結束標準。
超引數最佳化的挑戰與方法
在進行超引數最佳化時,會面臨諸多挑戰,如搜尋空間龐大、評估模型的成本高等。因此,研究者們提出了多種HPO方法,如網格搜尋、隨機搜尋、貝葉斯最佳化等,以提高搜尋效率和找到更好的超引陣列態。
網格搜尋與隨機搜尋
網格搜尋是一種簡單直接的方法,它透過遍歷所有可能的超引陣列合來找到最佳組態。然而,當超引數數量較多時,網格搜尋會變得非常耗時。隨機搜尋則是透過隨機抽樣超引陣列合來進行評估,這種方法在某些情況下比網格搜尋更有效率。
貝葉斯最佳化
貝葉斯最佳化是一種根據機率模型的最佳化方法,它利用先前的評估結果來指導後續的搜尋,從而高效地找到最佳超引陣列態。貝葉斯最佳化在處理複雜和昂貴的評估任務時表現出色。
#### 內容解密:
- 網格搜尋:網格搜尋是一種詳盡的搜尋方法,但當面對大量超引數時,其效率會大幅下降。
- 隨機搜尋:隨機搜尋提供了一種更靈活和高效的方法,能夠在較少的迭代次數內找到較好的解。
- 貝葉斯最佳化:貝葉斯最佳化透過建立機率模型來指導搜尋,能夠有效地減少評估次數,找到最佳或接近最佳的解。
綜上所述,超引數最佳化是機器學習中一個重要的研究領域,透過有效地選擇和調整超引數,可以顯著提高模型的效能和泛化能力。未來,隨著機器學習技術的不斷發展,超引數最佳化的方法和應用也將持續進步和擴充套件。
超引數最佳化服務的自動化實踐
在深度學習領域中,超引數的最佳化對於模型的效能至關重要。傳統的手動超引數最佳化(HPO)方法不僅耗時耗力,而且難以保證結果的最優性。因此,自動化的超引數最佳化服務應運而生,旨在透過高效的搜尋演算法和計算資源,自動找出最佳的超引陣列合。
手動超引數最佳化的挑戰
手動超引數最佳化依賴於資料科學家的經驗和直覺,透過不斷嘗試不同的超引陣列合來評估模型的效能。雖然這種方法在某些情況下是有效的,但它存在著明顯的侷限性。首先,手動調整超引數的過程非常耗時,尤其是當超引數的搜尋空間很大時。其次,人為因素可能導致結果的不穩定性和不可重複性。最後,手動最佳化難以保證找到最優解,因為搜尋空間可能是無限的或是非常龐大的。
自動化超引數最佳化的優勢
自動化超引數最佳化則透過計算能力和演算法來自動搜尋最佳超引數,從而克服了手動最佳化的侷限性。這種方法允許資料科學家定義需要最佳化的超引數及其搜尋空間,然後由系統自動執行最佳化過程。自動化HPO系統可以高效地管理試驗(trials)和訓練執行,並且能夠根據設定的目標和預算自動終止或繼續試驗。
自動化HPO的工作流程
- 提交HPO請求:資料科學家向自動化HPO系統提交請求,定義需要最佳化的超引數、搜尋空間、訓練程式碼、評估方法和離開目標等。
- 執行HPO實驗:系統根據請求開始HPO實驗,排程試驗並管理訓練執行。
- 傳回最佳超引數:當試驗預算用完或達到訓練目標時,系統傳回最佳的超引陣列合。
流行的HPO演算法
目前,大多數HPO演算法可以分為三類別:無模型最佳化(Model-Free Optimization)、貝葉斯最佳化(Bayesian Optimization)和多精確度最佳化(Multifidelity Optimization)。
無模型最佳化方法
無模型方法不對訓練程式碼做任何假設,也不考慮不同試驗之間的相關性。網格搜尋(Grid Search)和隨機搜尋(Random Search)是最常用的無模型方法。
網格搜尋:網格搜尋透過對每個超引數指定有限的值集,然後從這些值的笛卡爾積中選擇試驗超引數。這種方法在超引數數量較多或搜尋空間較大時會變得非常低效。
# 範例:使用網格搜尋進行超引數最佳化 import numpy as np from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris # 載入資料集 iris = load_iris() X, y = iris.data, iris.target # 定義模型和超引數搜尋空間 model = RandomForestClassifier() param_grid = { 'n_estimators': [10, 50, 100], 'max_depth': [None, 5, 10] } # 執行網格搜尋 grid_search = GridSearchCV(model, param_grid, cv=5) grid_search.fit(X, y) print("最佳超引數:", grid_search.best_params_) print("最佳效能:", grid_search.best_score_)內容解密:
GridSearchCV是 Scikit-learn 中用於網格搜尋的類別,它可以自動遍歷指定的超引陣列合並評估模型的效能。param_grid定義了需要搜尋的超引數及其候選值。grid_search.fit(X, y)對資料集執行網格搜尋,並根據交叉驗證的結果找出最佳的超引陣列合。
隨機搜尋:隨機搜尋透過在超引陣列態空間中隨機取樣,直到達到一定的搜尋預算。這種方法相比網格搜尋,在某些情況下可以更有效地找到好的超引陣列合。
# 範例:使用隨機搜尋進行超引數最佳化 from sklearn.model_selection import RandomizedSearchCV # 定義超引數分佈 param_dist = { 'n_estimators': np.arange(10, 200, 10), 'max_depth': [None] + list(np.arange(5, 20, 5)) } # 執行隨機搜尋 random_search = RandomizedSearchCV(model, param_distributions=param_dist, n_iter=10, cv=5) random_search.fit(X, y) print("最佳超引數:", random_search.best_params_) print("最佳效能:", random_search.best_score_)內容解密:
RandomizedSearchCV是 Scikit-learn 中用於隨機搜尋的類別,它在指定的超引數分佈中隨機取樣並評估模型的效能。n_iter控制了隨機搜尋的迭代次數,即評估的超引陣列合數量。random_search.fit(X, y)對資料集執行隨機搜尋,並根據交叉驗證的結果找出最佳的超引陣列合。
5.2 超引數最佳化理解
將搜尋預算設定為 100,意味著最多執行 100 次超引數最佳化(HPO)試驗。在每次試驗中,學習率會在 0.001 至 0.1 之間隨機選取一個值,而資料批次大小則會在 10 至 100 之間隨機選取一個值。
與網格搜尋相比,這種方法有兩個優點。首先,隨機搜尋可以評估每個超引數的更多值,從而增加找到最佳超引陣列合的機會。其次,隨機搜尋的平行化需求較低,因為所有評估工作者可以完全平行運作,不需要相互通訊,而且失敗的工作者不會在搜尋空間中留下空白。然而,在網格搜尋中,失敗的工作者可能會跳過分配給該工作者的試驗超引數。
隨機搜尋的缺點是不確定性;無法保證在有限的計算預算內找到最佳的超引陣列合。理論上,如果允許足夠的資源,隨機搜尋可以在搜尋空間中新增足夠的隨機點,從而找到最佳的超引陣列合。實際上,隨機搜尋被用作基準。
圖 5.4 說明瞭網格搜尋和隨機搜尋之間的比較。網格搜尋中的試驗超引數候選(黑色點)是重要引數值(行)和非重要引數值(列)的笛卡爾積。它們的分佈在搜尋空間(白色方塊畫布)中看起來像一個網格。隨機搜尋演算法從搜尋空間中隨機取得超引數候選。當給予足夠的搜尋預算時,其搜尋點有更好的機會接近最佳位置。
根據模型的貝葉斯最佳化
貝葉斯最佳化是一種最先進的最佳化框架,用於昂貴的黑箱函式的全域最佳化。它被廣泛應用於各種問題設定,例如影像分類別、語音辨識和神經語言建模。貝葉斯最佳化方法可以使用不同的取樣器,例如高斯過程迴歸和樹結構 Parzen 估計器方法(TPE),來計算搜尋空間中的超引數候選。簡單來說,貝葉斯最佳化方法使用統計方法從過去試驗中使用的值及其評估結果中計算新的超引數值建議。
為什麼稱為貝葉斯最佳化?
貝葉斯分析是一種廣泛使用的統計推斷方法,以英國數學家 Thomas Bayes 的名字命名。它允許將關於總體引數的先驗資訊與樣本中包含的證據結合起來,以指導統計推斷過程。根據此方法,Jonas Mockus 在 1970 年代和 1980 年代關於全域最佳化的工作中引入了貝葉斯最佳化這個術語。
貝葉斯最佳化方法背後的概念是,如果演算法能夠從過去的試驗中學習,那麼最佳超引數搜尋將會更有效率。在實踐中,貝葉斯最佳化方法可以在較少的評估執行次數(試驗)中找到最佳超引陣列合,並且比其他搜尋方法更穩定。圖 5.5 說明瞭隨機搜尋和貝葉斯方法之間的資料取樣差異。
假設最佳超引數值位於 (x,y) = (0.5, 1),我們嘗試使用隨機搜尋和貝葉斯搜尋來找到它。在圖 5.5 (a) 中,我們看到資料在搜尋空間中被隨機取樣,其中 x := [–1.0, 1.0] 和 y := [1, 5]。在圖 5.5 (b) 中,我們看到資料在最佳值所在的區域 (x := [0.3, 0.7] 和 y := [1,1.5]) 被大量取樣。這種比較表明,貝葉斯搜尋在給定的搜尋空間中更有可能找到最佳超引數,並且在有限的執行預算下,每次實驗後所選(取樣)的超引數值越來越接近最佳值。
還有其他先進的 HPO 演算法,例如 Hyperband、TPE 和協方差矩陣適應演化策略(CMA-ES)。雖然它們不遵循與貝葉斯-高斯過程方法相同的數學理論,但它們分享相同的超引數選擇策略:透過考慮歷史評估結果來計算下一個建議值。
多保真度最佳化
多保真度方法提高了無模型和貝葉斯最佳化方法的效率。目前,在大型資料集上調整超引數可能需要幾個小時甚至幾天。為了加快 HPO,多保真度方法被開發出來。使用這種方法,我們使用所謂的低保真度近似實際損失函式來最小化損失函式。因此,我們可以在 HPO 期間跳過許多計算。
為什麼貝葉斯類別 HPO 演算法有效?
部落格文章“高斯過程背後的直覺”(https://sigopt.com/blog/intuition-behind-gaussian-processes/)對為什麼貝葉斯類別最佳化演算法可以在不檢查搜尋空間中每個可能值的情況下找到最佳超引陣列合給出了很好的解釋。在某些設定中,我們觀察到的實驗是獨立的,例如擲硬幣 50 次;瞭解其中一個並不意味著瞭解其他。然而,幸運的是,許多設定具有更有用的結構,從中之前的觀察提供了對未觀察結果的洞察。
超引數最佳化服務的深度解析
在機器學習領域中,我們假設歷史實驗(訓練試驗)結果與未來實驗結果之間存在某種關聯。更具體地說,我們相信這種關聯背後存在一個數學模型。雖然使用貝葉斯方法(如高斯過程)來建模這種關聯是一個非常強的假設,但它賦予了我們進行可證明最佳預測的強大能力。一個額外的好處是,我們現在有辦法處理模型預測結果的不確定性。
哪種超引數最佳化演算法最有效?
沒有任何一種超引數最佳化(HPO)演算法在所有情況下都是最佳的。不同的最佳化演算法可能適用於不同的調校任務和不同的限制條件。其中一些變數可能包括搜尋空間的外觀(例如,超引數型別、值範圍)、試驗預算的外觀,以及目標是什麼(最終最佳性或最佳的隨時效能)。圖 5.6 展示了來自 Optuna HPO 框架的 HPO 演算法選擇。
圖 5.6:Optuna HPO 框架的 HPO 演算法選擇
此圖展示了何時使用以下三種 HPO 演算法的決策圖:高斯過程、TPE 和 CMA-ES。由於 HPO 是一個快速發展的領域,新的高效演算法可能隨時被發表,因此像這樣的演算法選擇很快就會過時。例如,FLAML 是一個新開發的 Python HPO 函式庫,它在 HPO 過程中檢查超引數相關性,絕對值得一試。因此,請與您的資料科學團隊核實最新的 HPO 演算法選擇。
超引數最佳化的常見自動化方法
幸運的是,今天已經存在許多成熟的框架和系統來進行 HPO。根據使用情況,它們分為兩類別:HPO 函式庫方法和 HPO 服務方法。圖 5.7 說明瞭這兩種方法。讓我們逐一討論它們。
HPO 函式庫方法
在圖 5.7 (a) 中,我們看到資料科學家透過使用 HPO 函式庫(如 Hyperopt)自行管理 HPO 流程,從編碼到執行。他們將整個 HPO 流程編碼,並將其與訓練程式碼整合在一個訓練應用程式中。接下來,資料科學家在本地機器或具有直接存取許可權的伺服器上執行此應用程式。應用程式內的 HPO 函式庫將執行我們在圖 5.3 中看到的 HPO 工作流程。
HPO 服務方法
現在讓我們仔細看看 HPO 服務方法;為了清晰起見,我們重複圖 5.7,如圖 5.8 所示。在圖 5.8 (b) 中,我們看到 HPO 發生在由服務(HPO 服務)管理的遠端計算叢集中。資料科學家只需向服務提供訓練程式碼和所選的 HPO 演算法組態,然後啟動 HPO 工作。該服務管理計算資源分配和 HPO 工作流程(圖 5.3)的執行;它跟蹤每個試驗的結果(模型效能指標,例如準確度),並在所有試驗完成後將最終的最佳超引數傳回給資料科學家。
圖 5.7:兩種不同的 HPO 方法:函式庫 vs. 服務
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 超引數最佳化技術與實踐
package "資料視覺化流程" {
package "資料準備" {
component [資料載入] as load
component [資料清洗] as clean
component [資料轉換] as transform
}
package "圖表類型" {
component [折線圖 Line] as line
component [長條圖 Bar] as bar
component [散佈圖 Scatter] as scatter
component [熱力圖 Heatmap] as heatmap
}
package "美化輸出" {
component [樣式設定] as style
component [標籤註解] as label
component [匯出儲存] as export
}
}
load --> clean --> transform
transform --> line
transform --> bar
transform --> scatter
transform --> heatmap
line --> style --> export
bar --> label --> export
note right of scatter
探索變數關係
發現異常值
end note
@enduml#### 內容解密:
圖 5.7 和圖 5.8 說明瞭 HPO 的兩種不同方法:函式庫方法和服務方法。函式庫方法允許資料科學家自行管理 HPO 流程,而服務方法則提供了一個完全遠端和自動化的 HPO 體驗。
超引數最佳化服務的優勢
服務方法提供了真正的黑盒體驗。資料科學家不需要擔心管理自己的伺服器、設定試驗工作人員,以及學習如何使用不同的 HPO 演算法。他們只需提供訓練程式碼和所選的 HPO 演算法組態,然後啟動 HPO 工作。該服務將管理計算資源分配和 HPO 工作流程的執行,並傳回最終的最佳超引數。