<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實(shí)踐教程 | 機(jī)器學(xué)習(xí)調(diào)參自動優(yōu)化方法

          共 14272字,需瀏覽 29分鐘

           ·

          2021-09-14 06:24

          ↑ 點(diǎn)擊藍(lán)字 關(guān)注極市平臺

          作者 | AI
          來源丨宅碼
          編輯丨極市平臺

          極市導(dǎo)讀

           

          本文旨在介紹當(dāng)前被大家廣為所知的超參自動優(yōu)化方法,像網(wǎng)格搜索、隨機(jī)搜索、貝葉斯優(yōu)化和Hyperband,并附有相關(guān)的樣例代碼供大家學(xué)習(xí)。 >>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿


          一、網(wǎng)格搜索(Grid Search)


          網(wǎng)格搜索是暴力搜索,在給定超參搜索空間內(nèi),嘗試所有超參組合,最后搜索出最優(yōu)的超參組合。sklearn已實(shí)現(xiàn)該方法,使用樣例如下:

          from sklearn import svm, datasetsfrom sklearn.model_selection import GridSearchCVimport pandas as pd
          # 導(dǎo)入數(shù)據(jù)iris = datasets.load_iris()# 定義超參搜索空間parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}# 初始化模型svc = svm.SVC()# 網(wǎng)格搜索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')
          # 打印結(jié)果print('詳細(xì)結(jié)果:\n', pd.DataFrame.from_dict(clf.cv_results_))print('最佳分類器:\n', clf.best_estimator_)print('最佳分?jǐn)?shù):\n', clf.best_score_)print('最佳參數(shù):\n', clf.best_params_).返回:詳細(xì)結(jié)果:    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_score0       0.000788      0.000394         0.000194        0.000389       1  ...          0.966667               1.0         0.980000        0.016330                11       0.000804      0.000402         0.000199        0.000399       1  ...          0.933333               1.0         0.966667        0.021082                42       0.000593      0.000484         0.000593        0.000484      10  ...          0.966667               1.0         0.973333        0.038873                33       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')最佳分?jǐn)?shù):0.9800000000000001最佳參數(shù): {'C': 1, 'kernel': 'linear'}

          sklearn.model_selection.GridSearchCV[1]的重要參數(shù)說明:

          • estimator: scikit-learn模型。

          • param_grid: 超參搜索空間,即超參數(shù)字典。

          • scoring: 在交叉驗(yàn)證中使用的評估策略。

          • n_jobs: 并行任務(wù)數(shù),-1為使用所有CPU。

          • cv: 決定采用幾折交叉驗(yàn)證。


          二、隨機(jī)搜索(Randomized Search)

          隨機(jī)搜索是在搜索空間中采樣出超參組合,然后選出采樣組合中最優(yōu)的超參組合。隨機(jī)搜索的好處如下圖所示:


          圖1: 網(wǎng)格搜索和隨機(jī)搜索的對比[2]


          解釋圖1,如果目前我們要搜索兩個參數(shù),但參數(shù)A重要而另一個參數(shù)B并沒有想象中重要,網(wǎng)格搜索9個參數(shù)組合(A, B),而由于模型更依賴于重要參數(shù)A,所以只有3個參數(shù)值是真正參與到最優(yōu)參數(shù)的搜索工作中。反觀隨機(jī)搜索,隨機(jī)采樣9種超參組合,在重要參數(shù)A上會有9個參數(shù)值參與到搜索工作中,所以,在某些參數(shù)對模型影響較小時,使用隨機(jī)搜索能讓我們有更多的探索空間


          同樣地,sklearn實(shí)現(xiàn)了隨機(jī)搜索[3],樣例代碼如下:

          from sklearn import svm, datasetsfrom sklearn.model_selection import RandomizedSearchCVimport pandas as pdfrom scipy.stats import uniform

          # 導(dǎo)入數(shù)據(jù)iris = datasets.load_iris()# 定義超參搜索空間distributions = {'kernel':['linear''rbf'], 'C':uniform(loc=1, scale=9)}# 初始化模型svc = svm.SVC()# 網(wǎng)格搜索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')

          # 打印結(jié)果print('詳細(xì)結(jié)果:\n', pd.DataFrame.from_dict(clf.cv_results_))print('最佳分類器:\n', clf.best_estimator_)print('最佳分?jǐn)?shù):\n', clf.best_score_)print('最佳參數(shù):\n', clf.best_params_)返回:詳細(xì)結(jié)果:    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_score0       0.000598      0.000489         0.000200        0.000400   6.4538  ...          0.966667               1.0         0.986667        0.016330                11       0.000997      0.000002         0.000000        0.000000  4.99782  ...          0.966667               1.0         0.980000        0.026667                32       0.000798      0.000399         0.000399        0.000488  3.81406  ...          0.966667               1.0         0.980000        0.016330                33       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)最佳分?jǐn)?shù):0.9866666666666667最佳參數(shù): {'C': 6.453804509266643, 'kernel': 'rbf'}

          相比于網(wǎng)格搜索,sklearn隨機(jī)搜索中主要改變的參數(shù)是param_distributions,負(fù)責(zé)提供超參值分布范圍。


          三、貝葉斯優(yōu)化(Bayesian Optimization)

          我寫本文的目的主要是沖著貝葉斯優(yōu)化來的,一直有所耳聞卻未深入了解,所以我就來查漏補(bǔ)缺了。以下內(nèi)容主要基于Duane Rich在《How does Bayesian optimization work?》[4]的回答。


          調(diào)優(yōu)的目的是要找到一組最優(yōu)的超參組合,能使目標(biāo)函數(shù)f達(dá)到全局最小值。

          舉個例子,若學(xué)習(xí)率設(shè)置過大,模型可能會在代價函數(shù)的全局最優(yōu)點(diǎn)附近不斷來回震蕩,甚至跳出全局最優(yōu)點(diǎn),而設(shè)置過小,又可能會陷入局部最優(yōu),因此調(diào)學(xué)習(xí)率這一參數(shù),是為了讓模型能收斂到代價函數(shù)的全局最小值。可是在機(jī)器學(xué)習(xí)中,目標(biāo)函數(shù)  常是被稱作expensive blackbox function,計(jì)算開銷大且不一定為凸函數(shù)。為此,貝葉斯優(yōu)化出現(xiàn)了,它特別適合針對expensive blackbox function找到全局最優(yōu)。


          假設(shè)我們的真實(shí)的目標(biāo)函數(shù)  長下圖這樣:


          圖2: 目標(biāo)函數(shù)f(x)[4]


          注意: 目標(biāo)函數(shù)  的  是指超參數(shù),我們希望找到最優(yōu)的超參  去得到最小的  。為什么用虛線表示  呢?因?yàn)樗呛谙浜瘮?shù)(blackbox function)。


          現(xiàn)在,我們怎么找到  全局最小值點(diǎn)呢?我們能不能先在  上隨機(jī)采樣10個點(diǎn),然后取它們的最小值呢?


          圖3: 隨機(jī)采樣10個點(diǎn)的目標(biāo)函數(shù)f(x)[4]


          圖3里確實(shí)有個點(diǎn)挺靠近全局最優(yōu)點(diǎn)的,那是不是在它附近再采樣幾個點(diǎn),不斷重復(fù)就行了?沒那么簡單,萬一起始采樣點(diǎn)在局部最小值附近,那這種方法會很容易陷入局部最優(yōu)。關(guān)于“如何找到下一個合適的點(diǎn)”這個問題,我們先放一放,因?yàn)槲覀兟┑粢粋€重點(diǎn):每次嘗試一種超參值  ,計(jì)算  的代價是昂貴的,為了減輕開銷,貝葉斯優(yōu)化采用了代理模型(surrogate model),代理模型可以被看作是一個簡單模型去擬合原本復(fù)雜且不好理解的模型,簡單來說,就是  計(jì)算太昂貴了,我們就用代理模型去代替它。


          貝葉斯優(yōu)化使用了高斯過程(gasussian processes, GP)去構(gòu)建代理模型,高斯過程的細(xì)節(jié)這里暫時不講,有興趣的小伙伴可以自行查閱資料了解。基于給定的輸入和輸出,GP會推斷出一個模型(這里為代理模型)。假設(shè)我們從昂貴的  采樣了4個點(diǎn),然后我們把這4個點(diǎn)交給GP,它會返回一個代理模型,如下圖所示:


          圖4: 目標(biāo)函數(shù)f(x)和代理模型[4]


          綠色實(shí)線就是GP猜的代理模型,綠色條帶是輸出分布的標(biāo)準(zhǔn)差(即為Uncertainty)。我們有了代理模型,后續(xù)我們?nèi)フ蚁乱粋€合適的超參值,就能帶入到計(jì)算開銷相對較小的代理模型中,評估給定超參值的情況。


          現(xiàn)在,我們來思考回之前提到的問題:"如何找到下一個合適的點(diǎn)?",這個問題本質(zhì)是在問:“哪里有全局最小的點(diǎn)?”,為了解決這個問題,我們要關(guān)注兩個地方:

          (1) 已開發(fā)區(qū)域: 在綠色實(shí)線上最低的超參點(diǎn)。因?yàn)楹芸赡芩浇嬖谌肿顑?yōu)點(diǎn)。

          (2) 未探索區(qū)域: 綠色實(shí)線上還未被探索的區(qū)域。比如圖4,相比于0.15-0.25區(qū)間,0.65-0.75區(qū)間更具有探索價值(即該區(qū)間Uncertainty更大)。探索該區(qū)域有利于減少我們猜測的方差。


          為了實(shí)現(xiàn)以上探索和開發(fā)的平衡(exploration-exploitation trade-off),貝葉斯優(yōu)化使用了采集函數(shù)(acquisition function),它能平衡好全局最小值的探索和開發(fā)。采集函數(shù)有很多選擇,其中最常見的是expectated of improvement(EI)[5],我們先看一個utility function:

            是目前觀察到的最小值,  是超參值,我們希望上述utility function輸出越大越好(即找到的  能獲得比當(dāng)前最小值還小),基于  ,EI采集函數(shù)如下所示: 



          具有最高的EI的超參值  會被選擇。EI有兩部分:


          (1) 減少均值函數(shù)  ,提高EI。

          (2) 增加方差  ,提高EI。


          所以EI的提高是建立在均值和方差的trade-off,也是exploration和exploitation的trade-off。


          圖5: 采集函數(shù)A(x)


          圖5我們可以看到,  時EI最大,所以我們下一個超參值  應(yīng)該選1。


          講到這里,我們來看下完整的貝葉斯優(yōu)化步驟是怎樣的:


          圖6: 貝葉斯優(yōu)化-SMBO


          SMBO是簡潔版的貝葉斯優(yōu)化,偽代碼如圖6所示,具體如下:

          (1) 準(zhǔn)備輸入: expensive blackbox function   ,超參搜索空間  ,采樣數(shù)據(jù)集  (超參組合  ,對應(yīng)  輸出值),采集函數(shù)  和用數(shù)據(jù)集  擬合的代理模型M。

          (2) 基于  和  ,采樣得到數(shù)據(jù)集  。

          (3) 循環(huán)選  次參數(shù):

          1. 用當(dāng)前數(shù)據(jù)集  擬合代理模型  ,實(shí)現(xiàn)模型更新。

          2. 選擇使采集函數(shù)  最大的超參組合  。

          3. 將  帶入  中,得到輸出值  。(注意這里  的計(jì)算開銷大)

          4. 將新的  加入到現(xiàn)有數(shù)據(jù)集  中。


          目前,Hyperopt[6]開源代碼庫已實(shí)現(xiàn)基于TPE(Tree-structured Parzen Estimator Approach)的貝葉斯優(yōu)化,圖6我們能看到GP構(gòu)建的概率模型是  ,而TPE是  和  ,關(guān)于TPE和GP的對比討論,建議閱讀論文[7]。TPE樣例代碼如下:

          from sklearn import svm, datasetsfrom sklearn.model_selection import cross_val_scorefrom hyperopt import hp, fmin, tpe, space_evalimport pandas as pd
          # 導(dǎo)入數(shù)據(jù)iris = datasets.load_iris()
          # step1: 定義目標(biāo)函數(shù)def objective(params):      # 初始化模型并交叉驗(yàn)證      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: 在給定超參搜索空間下,最小化目標(biāo)函數(shù)best = fmin(objective, space, algo=tpe.suggest, max_evals=100)返回: best_loss: 0.013333333333333308(即accuracy為0.9866666666666667)
          # step4: 打印結(jié)果print(best)返回:{'C': 6.136181888987526, 'kernel': 1}(PS:kernel為0-based index,這里1指rbf)

          四、Hyperband

          除了格子搜索、隨機(jī)搜索和貝葉斯優(yōu)化,還有其它自動調(diào)參方式。例如Hyperband optimization[8],Hyperband本質(zhì)上是隨機(jī)搜索的一種變種,它使用早停策略和Sccessive Halving算法去分配資源,結(jié)果是Hyperband能評估更多的超參組合,同時在給定的資源預(yù)算下,比貝葉斯方法收斂更快,下圖展示了Hyperband的早停和資源分配:


          圖7: Hyperband的超參選擇和評估


          在Hyperband之后,還出現(xiàn)了BOHB,它混合了貝葉斯優(yōu)化和Hyperband。Hyperband和BOHB的開源代碼可參考HpBandSter庫[9],這里不展開細(xì)講。


          五、總結(jié)

          上面我們用Iris鳶尾花數(shù)據(jù)集試了不同的超參自動調(diào)優(yōu)方法,發(fā)現(xiàn)貝葉斯優(yōu)化和隨機(jī)搜索都比格子搜索好。從一些論文反映,貝葉斯優(yōu)化是更香的,但是貝葉斯優(yōu)化好像在實(shí)踐中用的不是那么多,網(wǎng)上也有很多分享者,像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

          為什么呢?我想原因是貝葉斯的開銷太大了,前面有提到,在每次循環(huán)選超參值的時候,貝葉斯優(yōu)化都需要將  帶入昂貴的目標(biāo)函數(shù)  中,去得到輸出值y,當(dāng)目標(biāo)函數(shù)特別復(fù)雜時,這種情況的評估開銷是很大的,更何況隨著搜索空間和搜索次數(shù)的變大,計(jì)算會越發(fā)昂貴。在知乎《為什么基于貝葉斯優(yōu)化的自動調(diào)參沒有大范圍使用?》[11]中,很多知乎主也給出了很認(rèn)真的回復(fù),建議有興趣的朋友移步閱讀。


          寫這篇文章的過程中,我主要學(xué)到了2點(diǎn),一是隨機(jī)搜索在某些時候會比格子搜索好,二是了解貝葉斯優(yōu)化的機(jī)理。這里,談?wù)勎冶荣惡蛡€人實(shí)踐中的體會,我很少會花過多時間在超參的調(diào)優(yōu)上,因?yàn)樗鼛淼氖找媸怯邢薜模芏鄷r候比起壓榨模型來說,思考和挖掘數(shù)據(jù)特征能帶來更多的收益,所以我想這也是為什么上面說:在任何想要調(diào)優(yōu)超參時,先用格子搜索或隨機(jī)搜索吧。總之,希望這篇文章對大家有幫助,我們下期再見~


          參考資料

          [1]sklearn.model_selection.GridSearchCV, 官方文檔: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

          [2] Bergstra, J., & Bengio, Y. (2012). Random search for hyper-parameter optimization. Journal of machine learning research, 13(2).

          [3] sklearn.model_selection.RandomizedSearchCV, 官方文檔: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html#sklearn.model_selection.RandomizedSearchCV

          [4] Quora: How does Bayesian optimization work? - Duane Rich, 回答: https://www.quora.com/How-does-Bayesian-optimization-work

          [5] Bayesian Optimization (2018). - Cse.wustl.edu. 課程N(yùn)ote: https://www.cse.wustl.edu/~garnett/cse515t/spring_2015/files/lecture_notes/12.pdf

          [6] Hyperopt: Distributed Hyperparameter Optimization, 代碼: https://github.com/hyperopt/hyperopt#getting-started

          [7] Bergstra, J., Bardenet, R., Bengio, Y., & Kégl, B. (2011, December). Algorithms for hyper-parameter optimization. In 25th annual conference on neural information processing systems (NIPS 2011) (Vol. 24). Neural Information Processing Systems Foundation.

          [8] Li, L., Jamieson, K., DeSalvo, G., Rostamizadeh, A., & Talwalkar, A. (2017). Hyperband: A novel bandit-based approach to hyperparameter optimization. The Journal of Machine Learning Research, 18(1), 6765-6816.

          [9] HpBandSter開源代碼庫, 代碼: https://github.com/automl/HpBandSte

          [10] Hyperparameter Optimization for Machine Learning Models - Nagesh Singh Chauhan, 文章: [https://www.kdnuggets.com/2020/05/hyperparameter-optimization-machine-learning-models.html

          [11] 為什么基于貝葉斯優(yōu)化的自動調(diào)參沒有大范圍使用?- 知乎, 問答: https://www.zhihu.com/question/33711002



          如果覺得有用,就請分享到朋友圈吧!


          △點(diǎn)擊卡片關(guān)注極市平臺,獲取最新CV干貨

          公眾號后臺回復(fù)“CVPR21檢測”獲取CVPR2021目標(biāo)檢測論文下載~


          極市干貨
          深度學(xué)習(xí)環(huán)境搭建:如何配置一臺深度學(xué)習(xí)工作站?
          實(shí)操教程:OpenVINO2021.4+YOLOX目標(biāo)檢測模型測試部署為什么你的顯卡利用率總是0%?
          算法技巧(trick):圖像分類算法優(yōu)化技巧21個深度學(xué)習(xí)調(diào)參的實(shí)用技巧


          CV技術(shù)社群邀請函 #

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart4)

          備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)


          即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實(shí)項(xiàng)目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~



          覺得有用麻煩給個在看啦~  


          瀏覽 64
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆 天美 蜜桃 91 | 无码操逼 | 在线播放亚洲高清 | 久草国产精品 | 成人三级在线观看 |