超參數(shù)搜索不夠高效?這幾大策略了解一下
整天 babysitting 深度學(xué)習(xí)模型是不是很心累?這篇文章或許能幫到你。本文討論了高效搜索深度學(xué)習(xí)模型***超參數(shù)集的動(dòng)機(jī)和策略。作者在 FloydHub 上演示了如何完成這項(xiàng)工作以及研究的導(dǎo)向。讀完這篇文章后,你的數(shù)據(jù)科學(xué)工具庫將添加一些強(qiáng)大的新工具,幫助你為自己的深度學(xué)習(xí)模型自動(dòng)找到***配置。
與機(jī)器學(xué)習(xí)模型不同,深度學(xué)習(xí)模型實(shí)際上充滿了超參數(shù)。
當(dāng)然,并非所有變量對模型的學(xué)習(xí)過程都一樣重要,但是,鑒于這種額外的復(fù)雜性,在這樣一個(gè)高維空間中找到這些變量的***配置顯然是一個(gè)不小的挑戰(zhàn)。
幸運(yùn)的是,我們有不同的策略和工具來解決搜索問題。開始深入!
一、我們的目的
1. 怎么做?
我們希望找到***的超參數(shù)配置,幫助我們在驗(yàn)證/測試集的關(guān)鍵度量上得到***分?jǐn)?shù)。
2. 為何?
在計(jì)算力、金錢和時(shí)間資源有限的情況下,每個(gè)科學(xué)家和研究員都希望獲得***模型。但是我們?nèi)鄙儆行У某瑓?shù)搜索來實(shí)現(xiàn)這一目標(biāo)。
3. 何時(shí)?
- 研究員和深度學(xué)習(xí)愛好者在***的開發(fā)階段嘗試其中一種搜索策略很常見。這有助于從經(jīng)過幾個(gè)小時(shí)的訓(xùn)練獲得的***模型中獲得可能的提升。
- 超參數(shù)搜索作為半/全自動(dòng)深度學(xué)習(xí)網(wǎng)絡(luò)中的階段或組件也很常見。顯然,這在公司的數(shù)據(jù)科學(xué)團(tuán)隊(duì)中更為常見。
等等,究竟何謂超參數(shù)?
我們從最簡單的定義開始,
超參數(shù)是你在構(gòu)建機(jī)器/深度學(xué)習(xí)模型時(shí)可以調(diào)整的「旋鈕」。 |
將超參數(shù)比作「旋鈕」或「撥號盤」
或者:
超參數(shù)是在開始訓(xùn)練之前手動(dòng)設(shè)置的具有預(yù)定值的訓(xùn)練變量。 |
超參數(shù)是在開始訓(xùn)練之前手動(dòng)設(shè)置的具有預(yù)定值的訓(xùn)練變量。
我們可能會(huì)同意學(xué)習(xí)率和 Dropout 率是超參數(shù),但模型設(shè)計(jì)變量呢?模型設(shè)計(jì)變量包括嵌入,層數(shù),激活函數(shù)等。我們應(yīng)該將這些變量視為超參數(shù)嗎?
模型設(shè)計(jì)變量+超參數(shù)→模型參數(shù)
簡單起見,我們也可以將模型設(shè)計(jì)組件視為超參數(shù)集的一部分。
***,從訓(xùn)練過程中獲得的參數(shù)(即從數(shù)據(jù)中學(xué)習(xí)的變量)算超參數(shù)嗎?這些權(quán)重稱為模型參數(shù)。我們不將它們算作超參數(shù)。
好的,讓我們看一個(gè)真實(shí)的例子。請看下面的圖片,僅以此圖說明深度學(xué)習(xí)模型中變量的不同分類。
變量類別示例圖
4. 下一個(gè)問題:搜索代價(jià)高昂
我們已經(jīng)知道,我們的目標(biāo)是搜索超參數(shù)的***配置,但超參數(shù)搜索本質(zhì)上是一個(gè)受計(jì)算能力、金錢和時(shí)間約束的迭代過程。
超參數(shù)搜索周期
一切都以猜測一個(gè)不錯(cuò)的配置開始(步驟 1),然后我們需要等到訓(xùn)練完畢(步驟 2)以獲得對相關(guān)度量標(biāo)準(zhǔn)的實(shí)際評估(步驟 3)。我們將跟蹤搜索過程的進(jìn)度(步驟 4),然后根據(jù)我們的搜索策略選擇一個(gè)新的猜測參數(shù)(步驟 1)。
我們一直這樣做,直到達(dá)到終止條件(例如用完時(shí)間或金錢)。
我們有四種主要的策略可用于搜索***配置。
- 照看(babysitting,又叫試錯(cuò))
- 網(wǎng)格搜索
- 隨機(jī)搜索
- 貝葉斯優(yōu)化
二、照看
照看法被稱為試錯(cuò)法或在學(xué)術(shù)領(lǐng)域稱為研究生下降法。這種方法 100% 手動(dòng),是研究員、學(xué)生和業(yè)余愛好者最廣泛采用的方法。
該端到端的工作流程非常簡單:學(xué)生設(shè)計(jì)一個(gè)新實(shí)驗(yàn),遵循學(xué)習(xí)過程的所有步驟(從數(shù)據(jù)收集到特征圖可視化),然后她按順序迭代超參數(shù),直到她耗盡時(shí)間(通常是到截止日期)或動(dòng)機(jī)。
照看(babysitting)
如果你已經(jīng)注冊了 deeplearning.ai 課程,那么你一定熟悉這種方法 - 這是由 Andrew Ng 教授提出的熊貓工作流程。
這種方法非常有教育意義,但它不能在時(shí)間寶貴的數(shù)據(jù)科學(xué)家的團(tuán)隊(duì)或公司內(nèi)部施展。
因此,我們遇到這個(gè)問題:有更好的方式來增值我的時(shí)間嗎?
肯定有!我們可以定義一個(gè)自動(dòng)化的超參數(shù)搜索程序來節(jié)約你的時(shí)間。
三、網(wǎng)格搜索
取自命令式指令「Just try everything!」的網(wǎng)格搜索——一種簡單嘗試每種可能配置的樸素方法。
工作流如下:
- 定義一個(gè) n 維的網(wǎng)格,其中每格都有一個(gè)超參數(shù)映射。例如 n = (learning_rate, dropout_rate, batch_size)
- 對于每個(gè)維度,定義可能的取值范圍:例如 batch_size = [4,8,16,32,64,128,256 ]
- 搜索所有可能的配置并等待結(jié)果去建立***配置:例如 C1 = (0.1, 0.3, 4) -> acc = 92%, C2 = (0.1, 0.35, 4) -> acc = 92.3% 等...
下圖展示了包含 Dropout 和學(xué)習(xí)率的二維簡單網(wǎng)格搜索。
兩變量并發(fā)執(zhí)行的網(wǎng)格搜索
這種平行策略令人尷尬,因?yàn)樗雎粤擞?jì)算歷史(我們很快就會(huì)對此進(jìn)行擴(kuò)展)。但它的本意是,你擁有的計(jì)算資源越多,你可以同時(shí)嘗試的猜測就越多!
這種方法的真正痛點(diǎn)稱為 curse of dimensionality(維數(shù)災(zāi)難)。這意味著我們添加的維數(shù)越多,搜索在時(shí)間復(fù)雜度上會(huì)增加得越多(通常是指數(shù)級增長),最終使這個(gè)策略變得不可行!
當(dāng)超參數(shù)維度小于或等于 4 時(shí),通常使用這種方法。但實(shí)際上,即使它保證在***找到***配置,它仍然不是***方案。相反,***使用隨機(jī)搜索——我們將在下面討論。
現(xiàn)在試試網(wǎng)格搜索!
單擊以下鏈接可在 FloydHub 上打開 Workspace:https://www.floydhub.com/signup?source=run。你可以使用工作區(qū)在完全配置的云服務(wù)器上運(yùn)行以下代碼(使用 Scikit-learn 和 Keras 進(jìn)行網(wǎng)格搜索)。
- # Load the dataset
- x, y = load_dataset()
- # Create model for KerasClassifier
- def create_model(hparams1=dvalue,
- hparams2=dvalue,
- ...
- hparamsn=dvalue):
- # Model definition
- ...
- model = KerasClassifier(build_fn=create_model)
- # Define the range
- hparams1 = [2, 4, ...]
- hparams2 = ['elu', 'relu', ...]
- ...
- hparamsn = [1, 2, 3, 4, ...]
- # Prepare the Grid
- param_grid = dict(hparams1hparams1=hparams1,
- hparams2hparams2=hparams2,
- ...
- hparamsnhparamsn=hparamsn)
- # GridSearch in action
- grid = GridSearchCV(estimator=model,
- param_gridparam_grid=param_grid,
- n_jobs=,
- cv=,
- verbose=)
- gridgrid_result = grid.fit(x, y)
- # Show the results
- print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
- means = grid_result.cv_results_['mean_test_score']
- stds = grid_result.cv_results_['std_test_score']
- params = grid_result.cv_results_['params']
- for mean, stdev, param in zip(means, stds, params):
- print("%f (%f) with: %r" % (mean, stdev, param))
四、隨機(jī)搜索
幾年前,Bergstra 和 Bengio 發(fā)表了一篇驚人的論文 (http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf),證明了網(wǎng)格搜索的低效率。
網(wǎng)格搜索和隨機(jī)搜索之間唯一真正的區(qū)別在于策略周期的第 1 步 - 隨機(jī)搜索從配置空間中隨機(jī)選取點(diǎn)。
讓我們使用下面的圖片(論文中提供)來展示研究員的證明。
網(wǎng)格搜索 vs 隨機(jī)搜索
圖像通過在兩個(gè)超參數(shù)空間上搜索***配置來比較兩種方法。它還假設(shè)一個(gè)參數(shù)比另一個(gè)參數(shù)更重要。這是一個(gè)安全的假設(shè),因?yàn)殚_頭提到的深度學(xué)習(xí)模型確實(shí)充滿了超參數(shù),并且研究員/科學(xué)家/學(xué)生一般都知道哪些超參數(shù)對訓(xùn)練影響***。
在網(wǎng)格搜索中,很容易注意到,即使我們已經(jīng)訓(xùn)練了 9 個(gè)模型,但我們每個(gè)變量只使用了 3 個(gè)值!然而,使用隨機(jī)布局,我們不太可能多次選擇相同的變量。結(jié)果是,通過第二種方法,我們將為每個(gè)變量使用 9 個(gè)不同的值訓(xùn)練 9 個(gè)模型。
從每個(gè)圖像布局頂部的曲線圖可以看出,我們使用隨機(jī)搜索可以更廣泛地探索超參數(shù)空間(特別是對于更重要的變量)。這將有助于我們在更少的迭代中找到***配置。
總結(jié):如果搜索空間包含 3 到 4 個(gè)以上的維度,請不要使用網(wǎng)格搜索。相反,使用隨機(jī)搜索,它為每個(gè)搜索任務(wù)提供了非常好的基準(zhǔn)。
網(wǎng)格搜索和隨機(jī)搜索的優(yōu)缺點(diǎn)
現(xiàn)在試試隨機(jī)搜索!
單擊以下鏈接可在 FloydHub 上打開 Workspace:https://www.floydhub.com/signup?source=run。你可以使用工作區(qū)在完全配置的云服務(wù)器上運(yùn)行以下代碼(使用 Scikit-learn 和 Keras 進(jìn)行隨機(jī)搜索)。
- # Load the dataset
- X, Y = load_dataset()
- # Create model for KerasClassifier
- def create_model(hparams1=dvalue,
- hparams2=dvalue,
- ...
- hparamsn=dvalue):
- # Model definition
- ...
- model = KerasClassifier(build_fn=create_model)
- # Specify parameters and distributions to sample from
- hparams1 = randint(1, 100)
- hparams2 = ['elu', 'relu', ...]
- ...
- hparamsn = uniform(0, 1)
- # Prepare the Dict for the Search
- param_dist = dict(hparams1hparams1=hparams1,
- hparams2hparams2=hparams2,
- ...
- hparamsnhparamsn=hparamsn)
- # Search in action!
- n_iter_search = 16 # Number of parameter settings that are sampled.
- random_search = RandomizedSearchCV(estimator=model,
- param_distparam_distributions=param_dist,
- n_iter=n_iter_search,
- n_jobs=,
- cv=,
- verbose=)
- random_search.fit(X, Y)
- # Show the results
- print("Best: %f using %s" % (random_search.best_score_, random_search.best_params_))
- means = random_search.cv_results_['mean_test_score']
- stds = random_search.cv_results_['std_test_score']
- params = random_search.cv_results_['params']
- for mean, stdev, param in zip(means, stds, params):
- print("%f (%f) with: %r" % (mean, stdev, param))
1. 后退一步,前進(jìn)兩步
另外,當(dāng)你需要為每個(gè)維度設(shè)置空間時(shí),每個(gè)變量使用正確的比例非常重要。
常用的批大小和學(xué)習(xí)率的比例空間
例如,通常使用 2 的冪作為批大小的值,并在對數(shù)尺度上對學(xué)習(xí)率進(jìn)行采樣。
放大!
從上面的布局之一開始進(jìn)行一定數(shù)量的迭代也很常見,然后通過在每個(gè)變量范圍內(nèi)更密集地采樣并放大到有希望的子空間,然后甚至用相同或不同的搜索策略開始新的搜索。
2. 還有一個(gè)問題:獨(dú)立猜測!
不幸的是,網(wǎng)格和隨機(jī)搜索都有共同的缺點(diǎn):每一次新猜測都獨(dú)立于之前的訓(xùn)練!
這聽起來可能有些奇怪、令人意外,盡管需要大量時(shí)間,但令照看法起效的是科學(xué)家有效推動(dòng)搜索和實(shí)驗(yàn)的能力,他們通過使用過去的實(shí)驗(yàn)結(jié)果作為資源來改進(jìn)下一次訓(xùn)練。
等一下,這些好像在哪兒聽過...... 嘗試將超參數(shù)搜索問題建模為機(jī)器學(xué)習(xí)任務(wù)會(huì)怎么樣?!
請?jiān)试S我介紹下貝葉斯優(yōu)化。
五、貝葉斯優(yōu)化
此搜索策略構(gòu)建一個(gè)代理模型,該模型試圖從超參數(shù)配置中預(yù)測我們關(guān)注的指標(biāo)。
在每次新的迭代中,代理人將越來越自信哪些新的猜測可以帶來改進(jìn)。就像其他搜索策略一樣,它也有相同的終止條件。
貝葉斯優(yōu)化工作流
如果聽起來有點(diǎn)困惑,請不要擔(dān)心——是時(shí)候參考另一個(gè)圖例了。
1. 高斯過程在起作用
我們可以將高斯過程定義為代理,它將學(xué)習(xí)從超參數(shù)配置到相關(guān)度量的映射。它不僅會(huì)將預(yù)測轉(zhuǎn)化為一個(gè)值,還會(huì)為我們提供不確定性的范圍(均值和方差)。
我們來深入研究這個(gè)偉大教程
(https://www.iro.umontreal.ca/~bengioy/cifar/NCAP2014-summerschool/slides/Ryan_adams_140814_bayesopt_ncap.pdf) 提供的示例。
有 2 個(gè)點(diǎn)的高斯過程的優(yōu)化過程
在上圖中,我們遵循單變量(在水平軸上)的高斯過程優(yōu)化的***步。在我們想象的例子中,這可以代表學(xué)習(xí)率或 dropout 率。
在垂直軸上,我們繪制了相關(guān)度量作為單個(gè)超參數(shù)的函數(shù)。因?yàn)槲覀冋趯ふ冶M可能低的值,所以可以將其視為損失函數(shù)。
黑點(diǎn)代表訓(xùn)練到當(dāng)前階段的模型。紅線是 ground truth,換句話說,就是我們正在努力學(xué)習(xí)的函數(shù)。黑線表示我們對 ground truth 函數(shù)的實(shí)際假設(shè)的平均值,灰色區(qū)域表示空間中的相關(guān)不確定性或方差。
我們可以注意到,點(diǎn)周圍的不確定性有所減少,因?yàn)槲覀儗@些點(diǎn)的結(jié)果非常有信心(因?yàn)槲覀円呀?jīng)在這里訓(xùn)練了模型)。同時(shí),在我們擁有較少信息的領(lǐng)域,不確定性會(huì)增加。
現(xiàn)在我們已經(jīng)定義了起點(diǎn),準(zhǔn)備好選擇下一個(gè)有希望的變量來訓(xùn)練一個(gè)模型。為此,我們需要定義一個(gè)采集函數(shù),它將告訴我們在哪里采樣下一個(gè)參數(shù)。
在此示例中,我們使用了 Expected Improvement:這個(gè)函數(shù)旨在在我們使用不確定性區(qū)域中的建議配置時(shí)找到盡可能低的值。上面的 Expected Improvement 圖表中的藍(lán)點(diǎn)即為下一次訓(xùn)練選擇的點(diǎn)。
3 點(diǎn)高斯過程
我們訓(xùn)練的模型越多,代理人對下一個(gè)有希望采樣的點(diǎn)就越有信心。以下是模型經(jīng)過 8 次訓(xùn)練后的圖表:
8 點(diǎn)高斯過程
高斯過程屬于基于序列模型的優(yōu)化(SMBO)類別的算法。正如我們剛看到的,這些算法為開始搜索***超參數(shù)配置提供了非常好的基準(zhǔn)。但是,跟所有工具一樣,它們也有缺點(diǎn):
- 根據(jù)定義,該過程是有順序的
- 它只能處理數(shù)值參數(shù)
- 即使訓(xùn)練表現(xiàn)不佳,它也不提供任何停止訓(xùn)練的機(jī)制
請注意,我們只是簡單地談到了這個(gè)話題,如果你對細(xì)節(jié)部分以及如何擴(kuò)展 SMBO 感興趣,那么請看一下這篇論文
(https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf)。
2. 現(xiàn)在試試貝葉斯優(yōu)化!
單擊以下鏈接可在 FloydHub 上打開 Workspace:https://www.floydhub.com/signup?source=run。你可以使用工作區(qū)在完全配置的云服務(wù)器上運(yùn)行以下代碼(使用 Hyperas 進(jìn)行貝葉斯優(yōu)化(SMBO-TPE))。
- def data():
- """
- Data providing function:
- This function is separated from model() so that hyperopt
- won't reload data for each evaluation run.
- """
- # Load / Cleaning / Preprocessing
- ...
- return x_train, y_train, x_test, y_test
- def model(x_train, y_train, x_test, y_test):
- """
- Model providing function:
- Create Keras model with double curly brackets dropped-in as needed.
- Return value has to be a valid python dictionary with two customary keys:
- - loss: Specify a numeric evaluation metric to be minimized
- - status: Just use STATUS_OK and see hyperopt documentation if not feasible
- The last one is optional, though recommended, namely:
- - model: specify the model just created so that we can later use it again.
- """
- # Model definition / hyperparameters space definition / fit / eval
- return {'loss': <metrics_to_minimize>, 'status': STATUS_OK, 'model': model}
- # SMBO - TPE in action
- best_run, best_model = optim.minimize(modelmodel=model,
- datadata=data,
- algo=tpe.suggest,
- max_evals=,
- trials=Trials())
- # Show the results
- x_train, y_train, x_test, y_test = data()
- print("Evalutation of best performing model:")
- print(best_model.evaluate(x_test, y_test))
- print("Best performing model chosen hyper-parameters:")
- print(best_run)
六、搜索策略對比
現(xiàn)在讓我們來總結(jié)一下到目前為止所涵蓋的策略,以了解每個(gè)策略的優(yōu)缺點(diǎn)。
總結(jié)
如果你或你的團(tuán)隊(duì)有足夠的資源,貝葉斯 SMBO 可能是***,但是你也應(yīng)該考慮建立一個(gè)隨機(jī)搜索的基準(zhǔn)。
另一方面,如果你還在訓(xùn)練或處于設(shè)計(jì)階段,即使在空間探索方面不切實(shí)際,照看法也是可以一試的。
正如我在上一節(jié)中提到的,如果一個(gè)訓(xùn)練表現(xiàn)不佳,我們必須等到計(jì)算結(jié)束,因?yàn)檫@些策略都不能提供節(jié)省資源的機(jī)制。
因此,我們得出了***一個(gè)問題:我們能優(yōu)化訓(xùn)練時(shí)間嗎?
我們來試試看。
七、提前終止的力量
提前終止不僅是一項(xiàng)著名的正則化技術(shù),而且在訓(xùn)練錯(cuò)誤時(shí),它還是一種能夠防止資源浪費(fèi)的機(jī)制。
下面是最常用的終止訓(xùn)練標(biāo)準(zhǔn)的圖表:
終止標(biāo)準(zhǔn)
前三個(gè)標(biāo)準(zhǔn)顯而易見,所以我們把注意力集中在***一個(gè)標(biāo)準(zhǔn)上。
通常情況下,研究人員會(huì)根據(jù)實(shí)驗(yàn)類別來限定訓(xùn)練時(shí)間。這樣可以優(yōu)化團(tuán)隊(duì)內(nèi)部的資源。通過這種方式,我們能夠?qū)⒏噘Y源分配給最有希望的實(shí)驗(yàn)。
floyd-cli(我們的用戶用來與 FloydHub 通信的軟件,已經(jīng)在 Github 上開源)為此提供了一個(gè)標(biāo)準(zhǔn):我們的高級用戶正在大規(guī)模使用它來調(diào)節(jié)他們的實(shí)驗(yàn)。
這些標(biāo)準(zhǔn)可以在照看學(xué)習(xí)過程時(shí)手動(dòng)應(yīng)用,或者你可以通過常見框架中提供的鉤子/回調(diào)在實(shí)驗(yàn)中集成這些規(guī)則來做得更好:
- Keras 提供了一個(gè)很好的提前終止功能,甚至還有一套回調(diào)組件。由于 Keras 最近已經(jīng)整合到 Tensorflow 中,你也可以使用 Tensorflow 代碼中的回調(diào)組件。
- Tensorflow 提供了訓(xùn)練鉤子,這些鉤子可能不像 Keras 回調(diào)那樣直觀,但是它們能讓你對執(zhí)行狀態(tài)有更多的控制。
- Pytorch 還沒有提供鉤子或回調(diào)組件,但是你可以在論壇上查看 TorchSample 倉庫。我不太清楚 Pytorch 1.0 的功能列表(該團(tuán)隊(duì)可能會(huì)在 PyTorch 開發(fā)者大會(huì)上發(fā)布一些內(nèi)容),這個(gè)功能可能會(huì)隨新版本一起發(fā)布。
- Fast.ai 庫也提供回調(diào)組件,即使它目前沒有提供任何形式的文檔(WIP),你也可以去找一個(gè)不錯(cuò)的教程。幸運(yùn)的是,他們有一個(gè)很棒的社區(qū)。
- Ignite(Pytorch 的高級庫)提供類似于 Keras 的回調(diào),雖然還在開發(fā)階段,但它看起來確實(shí)是一個(gè)不錯(cuò)的選擇。
名單就這么多了,我的討論只涉及最常用/***的框架。-(我希望不會(huì)損害其他框架作者的玻璃心。如果是這樣,你可以將你的意見轉(zhuǎn)發(fā)給我,我會(huì)很樂意更新列表!)
還沒有結(jié)束。
機(jī)器學(xué)習(xí)有一個(gè)子領(lǐng)域叫做「AutoML」(Automatic Machine Learning,自動(dòng)機(jī)器學(xué)習(xí)),目的是實(shí)現(xiàn)模型選擇、特征提取和/或超參數(shù)優(yōu)化的自動(dòng)化。
這就引出了***一個(gè)問題(我保證是***一個(gè)!):我們能了解整個(gè)過程嗎?
你可以認(rèn)為,AutoML 是一個(gè)解決了另一個(gè)機(jī)器學(xué)習(xí)任務(wù)的機(jī)器學(xué)習(xí)任務(wù),類似于我們利用貝葉斯優(yōu)化完成的任務(wù),本質(zhì)上是元機(jī)器學(xué)習(xí)。
1. 研究:AutoML 和 PBT
你很可能聽說過谷歌的 AutoML,這是他們對神經(jīng)架構(gòu)搜索的品牌重塑。請記住,在本文開頭,我們決定將模型設(shè)計(jì)組件合并到超參數(shù)變量中。那么,神經(jīng)架構(gòu)搜索是 AutoML 的子領(lǐng)域,旨在為給定任務(wù)找到***模型。關(guān)于這個(gè)主題的全面討論需要一系列文章。幸運(yùn)的是,來自 fast.ai 的 Rachel Thomas 博士做了一項(xiàng)了不起的工作,我們很樂意提供鏈接:
http://www.fast.ai/2018/07/12/auto-ml-1/。
我想和大家分享另一個(gè)來自 DeepMind 的有趣的研究成果,他們使用進(jìn)化策略算法的一種變體來執(zhí)行超參數(shù)搜索,稱為基于群體的訓(xùn)練(Population Based Training,PBT)。PBT 也是 DeepMind 的另一項(xiàng)研究(《Capture the Flag: the emergence of complex cooperative agents》)的基礎(chǔ),新聞報(bào)道并不完全,我強(qiáng)烈建議你去看看。引自 DeepMind:
就像隨機(jī)搜索一樣,PBT 首先需要以隨機(jī)挑選超參數(shù)的方式訓(xùn)練許多并行的神經(jīng)網(wǎng)絡(luò)。但是這些網(wǎng)絡(luò)并不是獨(dú)立訓(xùn)練的,而是使用其它網(wǎng)絡(luò)的訓(xùn)練信息來修正這些超參數(shù),并將計(jì)算資源分配到那些有希望的模型上。這種方法的靈感來自于遺傳算法:其中一個(gè)群體中的每個(gè)個(gè)體(被稱為 worker)可以利用除自身外其余個(gè)體的信息。例如,一個(gè)個(gè)體可能會(huì)從表現(xiàn)較好的個(gè)體那里復(fù)制模型參數(shù),它還能通過隨機(jī)改變當(dāng)前的值來探索新的超參數(shù)集。 |
當(dāng)然,這一領(lǐng)域可能還有許多其他有趣的研究。在這里,我只是和大家分享了最近得到媒體關(guān)注的一些研究。
2. 在 FloydHub 上管理你的實(shí)驗(yàn)
FloydHub ***的特點(diǎn)之一是能夠在訓(xùn)練時(shí)比較使用不同的超參數(shù)集的不同模型。
下圖展示了 FloydHub 項(xiàng)目中的作業(yè)列表。你可以看到此用戶正在使用作業(yè)的消息字段(例如,floyd run --message "SGD, lr=1e-3, l1_drop=0.3" ...)以突出顯示在每個(gè)作業(yè)上使用的超參數(shù)。
此外,你還可以查看每項(xiàng)作業(yè)的訓(xùn)練指標(biāo)。這些提供了快速瀏覽,幫助你了解哪些作業(yè)表現(xiàn)***,以及使用的機(jī)器類型和總訓(xùn)練時(shí)間。
項(xiàng)目主頁
FloydHub 儀表板為你提供了一種簡單的方法來比較你在超參數(shù)搜索中做的所有訓(xùn)練——并且實(shí)時(shí)更新。
我們建議你為每個(gè)必須解決的任務(wù)/問題創(chuàng)建一個(gè)不同的 FloydHub 項(xiàng)目。通過這種方式,你可以更輕松地組織工作并與團(tuán)隊(duì)協(xié)作。
3. 訓(xùn)練指標(biāo)
如上所述,你可以輕松地在 FloydHub 上為你的作業(yè)發(fā)布訓(xùn)練指標(biāo)。當(dāng)你在 FloydHub 儀表板上查看作業(yè)時(shí),你將找到你定義的每個(gè)指標(biāo)的實(shí)時(shí)圖表。
此功能無意替代 Tensorboard(我們也提供此功能),而是旨在突出顯示你已選擇的超參數(shù)配置的訓(xùn)練走勢。
例如,如果你正在監(jiān)督訓(xùn)練過程,那么訓(xùn)練指標(biāo)肯定會(huì)幫助你確定和應(yīng)用停止標(biāo)準(zhǔn)。
訓(xùn)練指標(biāo)
原文鏈接:
https://blog.floydhub.com/guide-to-hyperparameters-search-for-deep-learning-models/
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號“機(jī)器之心( id: almosthuman2014)”】