超參數優化

超參數優化

Bayesian Optimization使用Hyperopt進行參數調優

1. 前言

如今的機器學習和深度學習中,在模型結構肯定的狀況下,不一樣的超參數的選擇對整個結果的好壞有着相當重要的影響。很多人還嬉稱人工智能工程師,實際上是「調參俠」。html

1.1 超參數

  • 在模型開始學習過程以前人爲設置值的參數,而不是(像bias、weights)經過訓練可獲得的參數數據。
  • 這些參數定義關於模型更高層次的概念(模型複雜性、學習能力等)。
  • 好比說隨機梯度降低算法中的學習速率/learning rate,出於計算複雜度和算法效率等,咱們並不能從數據中直接學習一個比較不錯的學習速度。但學習速率卻又是十分重要的,較大的學習速率不易令模型收斂到較合適的較小值解,而較小的學習速率卻又經常令模型的訓練速度大大下降。對於像學習速率這樣的超參數,咱們一般須要在訓練模型以前設定。所以,對於超參數衆多的複雜模型,調超參技能顯得很重要。

2. Grid Search

Grid Search用的是窮舉搜索:在全部候選的參數選擇中,經過循環遍歷,嘗試每一種可能性,表現最好的參數就是最終的結果。其原理就像是在數組裏找最大值。(爲何叫網格搜索?以有兩個參數的模型爲例,參數a有3種可能,參數b有4種可能,把全部可能性列出來,能夠表示成一個3*4的表格,其中每一個cell就是一個網格,循環過程就像是在每一個網格里遍歷、搜索,因此叫grid search)python

  • 搜索整個超參數空間,在高維空間容易遇到維度災難,不實用。
  • 網格搜索是一種昂貴的方法。假設咱們有n個超參數,每一個超參數有兩個值,那麼配置總數就是2的N次方。所以,僅在少許配置上進行網格搜索是可行的。
  • 網格搜索能夠並行化,使得網格搜索在足夠的計算能力下更加可行。
  • 每次trial之間是相互獨立的,不能利用先驗知識選擇下一組超參數。

3. Random Search

隨機搜索是一種在巨大數據規模下執行一個耗時上沒法接受的程序的優化方法。算法

  1. 數據規模大,精確的結果難以在必定時間計算出。
  2. 結果的些許的不精確可以被接受。
  3. 求取的結果是最優化(optimization)問題,有一個成本計算模型。

隨機搜索的算法類型:數組

  1. 基本隨機搜索
  2. 登山搜索算法
  3. 模擬退火算法
  4. 遺傳算法

4. GridSearch和RandomSearch的使用

這裏給出一個GridSearch和RandomSearch的簡單使用方式,方便同窗們測試功能用。dom

from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
from sklearn.model_selection import GridSearchCV,RandomizedSearchCV
from sklearn.model_selection import train_test_split

# 加載數據集
iris = datasets.load_iris()
data = iris.data
label = iris.target

# 數據集分割
X_train,X_test,y_train,y_test = train_test_split(data,label,test_size=0.3,random_state=2)
knn_clf_orogin = KNeighborsClassifier()

# 搜索的超參數範圍
param_grid ={
        'weights':['distance'],
        'n_neighbors':[i for i in range(1,11)],
        'p':[i for i in range(1,6)]
}

grid_search = GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=2)
grid_search.fit(X_train,y_train)
knn_clf1 = grid_search.best_estimator_
y_pre = knn_clf1.predict(X_test)
knn_clf1.score(X_test,y_pre)


# print('grid_search-度量記錄:',grid_search.cv_results_)
print('grid_search-最佳度量值:',grid_search.best_score_)
print('grid_search-最佳參數:',grid_search.best_params_)
print('grid_search-最佳模型:',grid_search.best_estimator_)

random_search = RandomizedSearchCV(knn_clf_orogin,param_grid,n_jobs=-1,verbose=2)
random_search.fit(X_train,y_train)
knn_clf2 = random_search.best_estimator_
y_pre = knn_clf2.predict(X_test)
knn_clf2.score(X_test,y_pre)

# print('random_search-度量記錄:',random_search.cv_results_)
print('random_search-最佳度量值:',random_search.best_score_)
print('random_search-最佳參數:',random_search.best_params_)
print('random_search-最佳模型:',random_search.best_estimator_)

雖然隨機搜索獲得的結果互相之間差別較大,可是實驗證實隨機搜索的確比網格搜索效果要好。機器學習

5. Bayesian Optimization

貝葉斯優化其實就是基於模型的超參數優化,根據已有的採樣點預估函數,不斷迭代得到最大值的一個算法。函數

5.1 Bayesian Optimization流程圖

image

5.2 算法步驟

image

  1. \(f\)是咱們的的預估函數,也能夠是一個黑盒的模型。
  2. \(X\)是自定義的輸入參數的範圍
  3. \(S\)是Acquisition Function(採集函數),這個函數的做用是經過最大化AF來選擇下一個採樣點。
  4. \(M\)是先驗函數(Prior Function,PF),能夠經過\(M\)\(X\)計算得出具體的模型具體函數表示。
  • 模型步驟解析:
  1. 經過\(INITSAMPLES(f,X)\)採集初始的樣本\(D={(x_1,y_1),(x_2,y_2)...(x_i,y_i)}\)
  2. 循環選參數\(T\)次:
    1. 經過\(FITMODEL(M,D)\)計算出\(p(y|x,D)\)的機率。
    2. 經過\(S\)的採集函數計算出\(y\)取值最大時的\(x_i\)
    3. 判斷\(y_i\)值是否知足要求。
    4. 若是不知足要求,繼續計算整個過程。

5.3 優勢

  • 貝葉樹優化和網格搜索相比,迭代次數少(節省時間),粒度能夠到很小。
  • 搜索方式自動化,不須要太多人工參與。
  • 調參過程能夠控制。

5.4 缺點

  • 不容易找到全局最優解。
  • 過程比較複雜。
相關文章
相關標籤/搜索