<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家好,要想模型效果好,每個演演算法工程師都應該瞭解的流行超引數調優技術。
今天我給大家總結超參自動優化方法:網格搜尋、隨機搜尋、貝葉斯優化 和 Hyperband,並附有相關的樣例程式碼供大家學習。
網格搜尋是暴力搜尋,在給定超參搜尋空間內,嘗試所有超參組合,最後搜尋出最優的超參組合。sklearn已實現該方法,使用樣例如下:
from sklearn import svm, datasets from sklearn.model_selection import GridSearchCV import pandas as pd # 匯入資料 iris = datasets.load_iris() # 定義超參搜尋空間 parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]} # 初始化模型 svc = svm.SVC() # 網格搜尋 clf = GridSearchCV(estimator = svc, param_grid = parameters, scoring = 'accuracy', n_jobs = -1, cv = 5) clf.fit(iris.data, iris.target) 返回:GridSearchCV(cv=5, estimator=SVC(), n_jobs=-1, param_grid={'C': [1, 10], 'kernel': ('linear', 'rbf')}, scoring='accuracy') # 列印結果 print('詳細結果:n', pd.DataFrame.from_dict(clf.cv_results_)) print('最佳分類器:n', clf.best_estimator_) print('最佳分數:n', clf.best_score_) print('最佳引數:n', clf.best_params_). 返回: 詳細結果: mean_fit_time std_fit_time mean_score_time std_score_time param_C ... split3_test_score split4_test_score mean_test_score std_test_score rank_test_score 0 0.000788 0.000394 0.000194 0.000389 1 ... 0.966667 1.0 0.980000 0.016330 1 1 0.000804 0.000402 0.000199 0.000399 1 ... 0.933333 1.0 0.966667 0.021082 4 2 0.000593 0.000484 0.000593 0.000484 10 ... 0.966667 1.0 0.973333 0.038873 3 3 0.000593 0.000484 0.000399 0.000489 10 ... 0.966667 1.0 0.980000 0.016330 1 [4 rows x 15 columns] 最佳分類器: SVC(C=1, kernel='linear') 最佳分數: 0.9800000000000001 最佳引數: {'C': 1, 'kernel': 'linear'}
sklearn.model_selection.GridSearchCV[1]的重要引數說明:
隨機搜尋是在搜尋空間中取樣出超參組合,然後選出取樣組合中最優的超參組合。隨機搜尋的好處如下圖所示:
圖1: 網格搜尋和隨機搜尋的對比
解釋圖1,如果目前我們要搜尋兩個引數,但引數A重要而另一個引數B並沒有想象中重要,網格搜尋9個引數組合(A, B),而由於模型更依賴於重要引數A,所以只有3個引數值是真正參與到最優引數的搜尋工作中。反觀隨機搜尋,隨機取樣9種超參組合,在重要引數A上會有9個引數值參與到搜尋工作中,所以,在某些引數對模型影響較小時,使用隨機搜尋能讓我們有更多的探索空間。
同樣地,sklearn實現了隨機搜尋,樣例程式碼如下:
from sklearn import svm, datasets from sklearn.model_selection import RandomizedSearchCV import pandas as pd from scipy.stats import uniform # 匯入資料 iris = datasets.load_iris() # 定義超參搜尋空間 distributions = {'kernel':['linear', 'rbf'], 'C':uniform(loc=1, scale=9)} # 初始化模型 svc = svm.SVC() # 網格搜尋 clf = RandomizedSearchCV(estimator = svc, param_distributions = distributions, n_iter = 4, scoring = 'accuracy', cv = 5, n_jobs = -1, random_state = 2021) clf.fit(iris.data, iris.target) 返回:RandomizedSearchCV(cv=5, estimator=SVC(), n_iter=4, n_jobs=-1, param_distributions={'C': <scipy.stats._distn_infrastructure.rv_frozen object at 0x000001F372F9A190>, 'kernel': ['linear', 'rbf']}, random_state=2021, scoring='accuracy') # 列印結果 print('詳細結果:n', pd.DataFrame.from_dict(clf.cv_results_)) print('最佳分類器:n', clf.best_estimator_) print('最佳分數:n', clf.best_score_) print('最佳引數:n', clf.best_params_) 返回: 詳細結果: mean_fit_time std_fit_time mean_score_time std_score_time param_C ... split3_test_score split4_test_score mean_test_score std_test_score rank_test_score 0 0.000598 0.000489 0.000200 0.000400 6.4538 ... 0.966667 1.0 0.986667 0.016330 1 1 0.000997 0.000002 0.000000 0.000000 4.99782 ... 0.966667 1.0 0.980000 0.026667 3 2 0.000798 0.000399 0.000399 0.000488 3.81406 ... 0.966667 1.0 0.980000 0.016330 3 3 0.000598 0.000488 0.000200 0.000399 5.36286 ... 0.966667 1.0 0.986667 0.016330 1 [4 rows x 15 columns] 最佳分類器: SVC(C=6.453804509266643) 最佳分數: 0.9866666666666667 最佳引數: {'C': 6.453804509266643, 'kernel': 'rbf'}
相比於網格搜尋,sklearn隨機搜尋中主要改變的引數是param_distributions,負責提供超參值分佈範圍。
我寫本文的目的主要是衝著貝葉斯優化來的,一直有所耳聞卻未深入瞭解,所以我就來查漏補缺了。以下內容主要基於Duane Rich在《How does Bayesian optimization work?》的回答。
調優的目的是要找到一組最優的超參組合,能使目標函數f達到全域性最小值。
舉個例子,若學習率設定過大,模型可能會在代價函數的全域性最優點附近不斷來回震盪,甚至跳出全域性最優點,而設定過小,又可能會陷入區域性最優,因此調學習率這一引數,是為了讓模型能收斂到代價函數的全域性最小值。可是在機器學習中,目標函數 常是被稱作expensive blackbox function,計算開銷大且不一定為凸函數。為此,貝葉斯優化出現了,它特別適合針對expensive blackbox function找到全域性最優。
假設我們的真實的目標函數 長下圖這樣:
圖2: 目標函數f(x)
注意: 目標函數 的 是指超引數,我們希望找到最優的超參 去得到最小的 。為什麼用虛線表示 呢?因為它是黑箱函數(blackbox function)。
現在,我們怎麼找到 全域性最小值點呢?我們能不能先在 上隨機取樣10個點,然後取它們的最小值呢?
圖3: 隨機取樣10個點的目標函數f(x)
圖3裡確實有個點挺靠近全域性最優點的,那是不是在它附近再取樣幾個點,不斷重複就行了?沒那麼簡單,萬一起始取樣點在區域性最小值附近,那這種方法會很容易陷入區域性最優。關於“如何找到下一個合適的點”這個問題,我們先放一放,因為我們漏掉一個重點:每次嘗試一種超參值 ,計算 的代價是昂貴的,為了減輕開銷,貝葉斯優化採用了代理模型(surrogate model),代理模型可以被看作是一個簡單模型去擬合原本複雜且不好理解的模型,簡單來說,就是 計算太昂貴了,我們就用代理模型去代替它。
貝葉斯優化使用了**高斯過程(gasussian processes, GP)**去構建代理模型,高斯過程的細節這裡暫時不講,有興趣的小夥伴可以自行查閱資料瞭解。基於給定的輸入和輸出,GP會推斷出一個模型(這裡為代理模型)。假設我們從昂貴的 取樣了4個點,然後我們把這4個點交給GP,它會返回一個代理模型,如下圖所示:
圖4: 目標函數f(x)和代理模型
綠色實線就是GP猜的代理模型,綠色條帶是輸出分佈的標準差(即為Uncertainty)。我們有了代理模型,後續我們去找下一個合適的超參值,就能帶入到計算開銷相對較小的代理模型中,評估給定超參值的情況。
現在,我們來思考回之前提到的問題:“如何找到下一個合適的點?”,這個問題本質是在問:“哪裡有全域性最小的點?”,為了解決這個問題,我們要關注兩個地方:
(1) 已開發區域: 在綠色實線上最低的超參點。因為很可能它附近存在全域性最優點。
(2) 未探索區域: 綠色實線上還未被探索的區域。比如圖4,相比於0.15-0.25區間,0.65-0.75區間更具有探索價值(即該區間Uncertainty更大)。探索該區域有利於減少我們猜測的方差。
為了實現以上探索和開發的平衡(exploration-exploitation trade-off),貝葉斯優化使用了採集函數(acquisition function),它能平衡好全域性最小值的探索和開發。採集函數有很多選擇,其中最常見的是expectated of improvement(EI),我們先看一個utility function:
是目前觀察到的最小值, 是超參值,我們希望上述utility function輸出越大越好(即找到的 能獲得比當前最小值還小),基於 ,EI採集函數如下所示:
具有最高的EI的超參值 會被選擇。EI有兩部分:
(1) 減少均值函數 ,提高EI。
(2) 增加方差 ,提高EI。
所以EI的提高是建立在均值和方差的trade-off,也是exploration和exploitation的trade-off。
圖5: 採集函數A(x)
圖5我們可以看到, 時EI最大,所以我們下一個超參值 應該選1。
講到這裡,我們來看下完整的貝葉斯優化步驟是怎樣的:
圖6: 貝葉斯優化-SMBO
SMBO是簡潔版的貝葉斯優化,虛擬碼如圖6所示,具體如下:
(1) 準備輸入: expensive blackbox function ,超參搜尋空間 ,取樣資料集 (超參組合 ,對應 輸出值),採集函數 和用資料集 擬合的代理模型M。
(2) 基於 和 ,取樣得到資料集 。
(3) 迴圈選 次引數:
用當前資料集 擬合代理模型 ,實現模型更新。
選擇使採集函數 最大的超參組合 。
將 帶入 中,得到輸出值 。(注意這裡 的計算開銷大)
將新的 加入到現有資料集 中。
目前,Hyperopt開原始碼庫已實現基於**TPE(Tree-structured Parzen Estimator Approach)**的貝葉斯優化,圖6我們能看到GP構建的概率模型是 ,而TPE是 和 ,關於TPE和GP的對比討論,建議閱讀論文。TPE樣例程式碼如下:
from sklearn import svm, datasets from sklearn.model_selection import cross_val_score from hyperopt import hp, fmin, tpe, space_eval import pandas as pd # 匯入資料 iris = datasets.load_iris() # step1: 定義目標函數 def objective(params): # 初始化模型並交叉驗證 svc = svm.SVC(**params) cv_scores = cross_val_score(svc, iris.data, iris.target, cv=5) # 返回loss = 1 - accuracy (loss必須被最小化) loss = 1 - cv_scores.mean() return loss # step2: 定義超參搜尋空間 space = {'kernel':hp.choice('kernel', ['linear', 'rbf']), 'C':hp.uniform('C', 1, 10)} # step3: 在給定超參搜尋空間下,最小化目標函數 best = fmin(objective, space, algo=tpe.suggest, max_evals=100) 返回: best_loss: 0.013333333333333308(即accuracy為0.9866666666666667) # step4: 列印結果 print(best) 返回:{'C': 6.136181888987526, 'kernel': 1}(PS:kernel為0-based index,這裡1指rbf)
除了格子搜尋、隨機搜尋和貝葉斯優化,還有其它自動調參方式。例如Hyperband optimization,Hyperband本質上是隨機搜尋的一種變種,它使用早停策略和Sccessive Halving演演算法去分配資源,結果是Hyperband能評估更多的超參組合,同時在給定的資源預算下,比貝葉斯方法收斂更快,下圖展示了Hyperband的早停和資源分配:
圖7: Hyperband的超參選擇和評估
在Hyperband之後,還出現了BOHB,它混合了貝葉斯優化和Hyperband。Hyperband和BOHB的開原始碼可參考HpBandSter庫,這裡不展開細講。
上面我們用Iris鳶尾花資料集試了不同的超參自動調優方法,發現貝葉斯優化和隨機搜尋都比格子搜尋好。從一些論文反映,貝葉斯優化是更香的,但是貝葉斯優化好像在實踐中用的不是那麼多,網上也有很多分享者,像Nagesh Singh Chauhan,說的那樣:
As a general rule of thumb, any time you want to optimize tuning hyperparameters, think Grid Search and Randomized Search! [10]
Hyperparameter Optimization for Machine Learning Models - Nagesh Singh Chauhan
為什麼呢?我想原因是貝葉斯的開銷太大了,前面有提到,在每次迴圈選超參值的時候,貝葉斯優化都需要將 帶入昂貴的目標函數 中,去得到輸出值y,當目標函數特別複雜時,這種情況的評估開銷是很大的,更何況隨著搜尋空間和搜尋次數的變大,計算會越發昂貴。
寫這篇文章的過程中,我主要學到了2點,一是隨機搜尋在某些時候會比格子搜尋好,二是瞭解貝葉斯優化的機理。這裡,談談我比賽和個人實踐中的體會,我很少會花過多時間在超參的調優上,因為它帶來的收益是有限的,很多時候比起壓榨模型來說,思考和挖掘資料特徵能帶來更多的收益,所以我想這也是為什麼上面說:在任何想要調優超參時,先用格子搜尋或隨機搜尋吧。
以上就是詳解Python中4種超參自動優化演演算法的實現的詳細內容,更多關於Python超參自動優化演演算法的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45