91在线一级黄片|91视频在线观看18|成人夜间呦呦网站|91资源欧美日韩超碰|久久最新免费精品视频一区二区三区|国产探花视频在线观看|黄片真人免费三级片毛片|国产人无码视频在线|精品成人影视无码三区|久久视频爱久久免费精品

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
超參數(shù)搜索不夠高效?這幾大策略了解一下

整天 babysitting 深度學習模型是不是很心累?這篇文章或許能幫到你。本文討論了高效搜索深度學習模型***超參數(shù)集的動機和策略。作者在 FloydHub 上演示了如何完成這項工作以及研究的導向。讀完這篇文章后,你的數(shù)據(jù)科學工具庫將添加一些強大的新工具,幫助你為自己的深度學習模型自動找到***配置。

與機器學習模型不同,深度學習模型實際上充滿了超參數(shù)。

當然,并非所有變量對模型的學習過程都一樣重要,但是,鑒于這種額外的復雜性,在這樣一個高維空間中找到這些變量的***配置顯然是一個不小的挑戰(zhàn)。

幸運的是,我們有不同的策略和工具來解決搜索問題。開始深入!

一、我們的目的

1. 怎么做?

我們希望找到***的超參數(shù)配置,幫助我們在驗證/測試集的關鍵度量上得到***分數(shù)。

2. 為何?

在計算力、金錢和時間資源有限的情況下,每個科學家和研究員都希望獲得***模型。但是我們缺少有效的超參數(shù)搜索來實現(xiàn)這一目標。

3. 何時?

  • 研究員和深度學習愛好者在***的開發(fā)階段嘗試其中一種搜索策略很常見。這有助于從經(jīng)過幾個小時的訓練獲得的***模型中獲得可能的提升。
  • 超參數(shù)搜索作為半/全自動深度學習網(wǎng)絡中的階段或組件也很常見。顯然,這在公司的數(shù)據(jù)科學團隊中更為常見。

等等,究竟何謂超參數(shù)?

我們從最簡單的定義開始,

超參數(shù)是你在構建機器/深度學習模型時可以調整的「旋鈕」。

將超參數(shù)比作「旋鈕」或「撥號盤」

或者:

超參數(shù)是在開始訓練之前手動設置的具有預定值的訓練變量。

超參數(shù)是在開始訓練之前手動設置的具有預定值的訓練變量。

我們可能會同意學習率和 Dropout 率是超參數(shù),但模型設計變量呢?模型設計變量包括嵌入,層數(shù),激活函數(shù)等。我們應該將這些變量視為超參數(shù)嗎?

模型設計變量+超參數(shù)→模型參數(shù)

簡單起見,我們也可以將模型設計組件視為超參數(shù)集的一部分。

***,從訓練過程中獲得的參數(shù)(即從數(shù)據(jù)中學習的變量)算超參數(shù)嗎?這些權重稱為模型參數(shù)。我們不將它們算作超參數(shù)。

好的,讓我們看一個真實的例子。請看下面的圖片,僅以此圖說明深度學習模型中變量的不同分類。

變量類別示例圖

4. 下一個問題:搜索代價高昂

我們已經(jīng)知道,我們的目標是搜索超參數(shù)的***配置,但超參數(shù)搜索本質上是一個受計算能力、金錢和時間約束的迭代過程。

超參數(shù)搜索周期

一切都以猜測一個不錯的配置開始(步驟 1),然后我們需要等到訓練完畢(步驟 2)以獲得對相關度量標準的實際評估(步驟 3)。我們將跟蹤搜索過程的進度(步驟 4),然后根據(jù)我們的搜索策略選擇一個新的猜測參數(shù)(步驟 1)。

我們一直這樣做,直到達到終止條件(例如用完時間或金錢)。

我們有四種主要的策略可用于搜索***配置。

  • 照看(babysitting,又叫試錯)
  • 網(wǎng)格搜索
  • 隨機搜索
  • 貝葉斯優(yōu)化

二、照看

照看法被稱為試錯法或在學術領域稱為研究生下降法。這種方法 100% 手動,是研究員、學生和業(yè)余愛好者最廣泛采用的方法。

該端到端的工作流程非常簡單:學生設計一個新實驗,遵循學習過程的所有步驟(從數(shù)據(jù)收集到特征圖可視化),然后她按順序迭代超參數(shù),直到她耗盡時間(通常是到截止日期)或動機。

照看(babysitting)

如果你已經(jīng)注冊了 deeplearning.ai 課程,那么你一定熟悉這種方法 - 這是由 Andrew Ng 教授提出的熊貓工作流程。

這種方法非常有教育意義,但它不能在時間寶貴的數(shù)據(jù)科學家的團隊或公司內部施展。

因此,我們遇到這個問題:有更好的方式來增值我的時間嗎?

肯定有!我們可以定義一個自動化的超參數(shù)搜索程序來節(jié)約你的時間。

三、網(wǎng)格搜索

取自命令式指令「Just try everything!」的網(wǎng)格搜索——一種簡單嘗試每種可能配置的樸素方法。

工作流如下:

  • 定義一個 n 維的網(wǎng)格,其中每格都有一個超參數(shù)映射。例如 n = (learning_rate, dropout_rate, batch_size)
  • 對于每個維度,定義可能的取值范圍:例如 batch_size = [4,8,16,32,64,128,256 ]
  • 搜索所有可能的配置并等待結果去建立***配置:例如 C1 = (0.1, 0.3, 4) -> acc = 92%, C2 = (0.1, 0.35, 4) -> acc = 92.3% 等...

下圖展示了包含 Dropout 和學習率的二維簡單網(wǎng)格搜索。

兩變量并發(fā)執(zhí)行的網(wǎng)格搜索

這種平行策略令人尷尬,因為它忽略了計算歷史(我們很快就會對此進行擴展)。但它的本意是,你擁有的計算資源越多,你可以同時嘗試的猜測就越多!

這種方法的真正痛點稱為 curse of dimensionality(維數(shù)災難)。這意味著我們添加的維數(shù)越多,搜索在時間復雜度上會增加得越多(通常是指數(shù)級增長),最終使這個策略變得不可行!

當超參數(shù)維度小于或等于 4 時,通常使用這種方法。但實際上,即使它保證在***找到***配置,它仍然不是***方案。相反,***使用隨機搜索——我們將在下面討論。

現(xiàn)在試試網(wǎng)格搜索!

單擊以下鏈接可在 FloydHub 上打開 Workspace:https://www.floydhub.com/signup?source=run。你可以使用工作區(qū)在完全配置的云服務器上運行以下代碼(使用 Scikit-learn 和 Keras 進行網(wǎng)格搜索)。

 
 
 
 
  1. # Load the dataset 
  2. x, y = load_dataset() 
  3.  
  4. # Create model for KerasClassifier 
  5. def create_model(hparams1=dvalue, 
  6.                  hparams2=dvalue, 
  7.                  ... 
  8.                  hparamsn=dvalue): 
  9.     # Model definition 
  10.     ... 
  11.  
  12. model = KerasClassifier(build_fn=create_model)  
  13.  
  14. # Define the range 
  15. hparams1 = [2, 4, ...] 
  16. hparams2 = ['elu', 'relu', ...] 
  17. ... 
  18. hparamsn = [1, 2, 3, 4, ...] 
  19.  
  20. # Prepare the Grid 
  21. param_grid = dict(hparams1hparams1=hparams1,  
  22.                   hparams2hparams2=hparams2,  
  23.                   ... 
  24.                   hparamsnhparamsn=hparamsn) 
  25.  
  26. # GridSearch in action 
  27. grid = GridSearchCV(estimator=model,  
  28.                     param_gridparam_grid=param_grid,  
  29.                     n_jobs=,  
  30.                     cv=, 
  31.                     verbose=) 
  32. gridgrid_result = grid.fit(x, y) 
  33.  
  34. # Show the results 
  35. print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) 
  36. means = grid_result.cv_results_['mean_test_score'] 
  37. stds = grid_result.cv_results_['std_test_score'] 
  38. params = grid_result.cv_results_['params'] 
  39. for mean, stdev, param in zip(means, stds, params): 
  40.     print("%f (%f) with: %r" % (mean, stdev, param)) 

四、隨機搜索

幾年前,Bergstra 和 Bengio 發(fā)表了一篇驚人的論文 (http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf),證明了網(wǎng)格搜索的低效率。

網(wǎng)格搜索和隨機搜索之間唯一真正的區(qū)別在于策略周期的第 1 步 - 隨機搜索從配置空間中隨機選取點。

讓我們使用下面的圖片(論文中提供)來展示研究員的證明。

網(wǎng)格搜索 vs 隨機搜索

圖像通過在兩個超參數(shù)空間上搜索***配置來比較兩種方法。它還假設一個參數(shù)比另一個參數(shù)更重要。這是一個安全的假設,因為開頭提到的深度學習模型確實充滿了超參數(shù),并且研究員/科學家/學生一般都知道哪些超參數(shù)對訓練影響***。

在網(wǎng)格搜索中,很容易注意到,即使我們已經(jīng)訓練了 9 個模型,但我們每個變量只使用了 3 個值!然而,使用隨機布局,我們不太可能多次選擇相同的變量。結果是,通過第二種方法,我們將為每個變量使用 9 個不同的值訓練 9 個模型。

從每個圖像布局頂部的曲線圖可以看出,我們使用隨機搜索可以更廣泛地探索超參數(shù)空間(特別是對于更重要的變量)。這將有助于我們在更少的迭代中找到***配置。

總結:如果搜索空間包含 3 到 4 個以上的維度,請不要使用網(wǎng)格搜索。相反,使用隨機搜索,它為每個搜索任務提供了非常好的基準。

網(wǎng)格搜索和隨機搜索的優(yōu)缺點

現(xiàn)在試試隨機搜索!

單擊以下鏈接可在 FloydHub 上打開 Workspace:https://www.floydhub.com/signup?source=run。你可以使用工作區(qū)在完全配置的云服務器上運行以下代碼(使用 Scikit-learn 和 Keras 進行隨機搜索)。

 
 
 
 
  1. # Load the dataset 
  2. X, Y = load_dataset() 
  3.  
  4. # Create model for KerasClassifier 
  5. def create_model(hparams1=dvalue, 
  6.                  hparams2=dvalue, 
  7.                  ... 
  8.                  hparamsn=dvalue): 
  9.     # Model definition 
  10.     ... 
  11.  
  12. model = KerasClassifier(build_fn=create_model)  
  13.  
  14. # Specify parameters and distributions to sample from 
  15. hparams1 = randint(1, 100) 
  16. hparams2 = ['elu', 'relu', ...] 
  17. ... 
  18. hparamsn = uniform(0, 1) 
  19.  
  20. # Prepare the Dict for the Search 
  21. param_dist = dict(hparams1hparams1=hparams1,  
  22.                   hparams2hparams2=hparams2,  
  23.                   ... 
  24.                   hparamsnhparamsn=hparamsn) 
  25.  
  26. # Search in action! 
  27. n_iter_search = 16 # Number of parameter settings that are sampled. 
  28. random_search = RandomizedSearchCV(estimator=model,  
  29.                                    param_distparam_distributions=param_dist, 
  30.                                    n_iter=n_iter_search, 
  31.                                    n_jobs=,  
  32.                                    cv=,  
  33.                                    verbose=) 
  34. random_search.fit(X, Y) 
  35.  
  36. # Show the results 
  37. print("Best: %f using %s" % (random_search.best_score_, random_search.best_params_)) 
  38. means = random_search.cv_results_['mean_test_score'] 
  39. stds = random_search.cv_results_['std_test_score'] 
  40. params = random_search.cv_results_['params'] 
  41. for mean, stdev, param in zip(means, stds, params): 
  42.     print("%f (%f) with: %r" % (mean, stdev, param)) 

1. 后退一步,前進兩步

另外,當你需要為每個維度設置空間時,每個變量使用正確的比例非常重要。

常用的批大小和學習率的比例空間

例如,通常使用 2 的冪作為批大小的值,并在對數(shù)尺度上對學習率進行采樣。

放大!

從上面的布局之一開始進行一定數(shù)量的迭代也很常見,然后通過在每個變量范圍內更密集地采樣并放大到有希望的子空間,然后甚至用相同或不同的搜索策略開始新的搜索。

2. 還有一個問題:獨立猜測!

不幸的是,網(wǎng)格和隨機搜索都有共同的缺點:每一次新猜測都獨立于之前的訓練!

這聽起來可能有些奇怪、令人意外,盡管需要大量時間,但令照看法起效的是科學家有效推動搜索和實驗的能力,他們通過使用過去的實驗結果作為資源來改進下一次訓練。

等一下,這些好像在哪兒聽過...... 嘗試將超參數(shù)搜索問題建模為機器學習任務會怎么樣?!

請允許我介紹下貝葉斯優(yōu)化。

五、貝葉斯優(yōu)化

此搜索策略構建一個代理模型,該模型試圖從超參數(shù)配置中預測我們關注的指標。

在每次新的迭代中,代理人將越來越自信哪些新的猜測可以帶來改進。就像其他搜索策略一樣,它也有相同的終止條件。

貝葉斯優(yōu)化工作流

如果聽起來有點困惑,請不要擔心——是時候參考另一個圖例了。

1. 高斯過程在起作用

我們可以將高斯過程定義為代理,它將學習從超參數(shù)配置到相關度量的映射。它不僅會將預測轉化為一個值,還會為我們提供不確定性的范圍(均值和方差)。

我們來深入研究這個偉大教程

(https://www.iro.umontreal.ca/~bengioy/cifar/NCAP2014-summerschool/slides/Ryan_adams_140814_bayesopt_ncap.pdf) 提供的示例。

有 2 個點的高斯過程的優(yōu)化過程

在上圖中,我們遵循單變量(在水平軸上)的高斯過程優(yōu)化的***步。在我們想象的例子中,這可以代表學習率或 dropout 率。

在垂直軸上,我們繪制了相關度量作為單個超參數(shù)的函數(shù)。因為我們正在尋找盡可能低的值,所以可以將其視為損失函數(shù)。

黑點代表訓練到當前階段的模型。紅線是 ground truth,換句話說,就是我們正在努力學習的函數(shù)。黑線表示我們對 ground truth 函數(shù)的實際假設的平均值,灰色區(qū)域表示空間中的相關不確定性或方差。

我們可以注意到,點周圍的不確定性有所減少,因為我們對這些點的結果非常有信心(因為我們已經(jīng)在這里訓練了模型)。同時,在我們擁有較少信息的領域,不確定性會增加。

現(xiàn)在我們已經(jīng)定義了起點,準備好選擇下一個有希望的變量來訓練一個模型。為此,我們需要定義一個采集函數(shù),它將告訴我們在哪里采樣下一個參數(shù)。

在此示例中,我們使用了 Expected Improvement:這個函數(shù)旨在在我們使用不確定性區(qū)域中的建議配置時找到盡可能低的值。上面的 Expected Improvement 圖表中的藍點即為下一次訓練選擇的點。

3 點高斯過程

我們訓練的模型越多,代理人對下一個有希望采樣的點就越有信心。以下是模型經(jīng)過 8 次訓練后的圖表:

8 點高斯過程

高斯過程屬于基于序列模型的優(yōu)化(SMBO)類別的算法。正如我們剛看到的,這些算法為開始搜索***超參數(shù)配置提供了非常好的基準。但是,跟所有工具一樣,它們也有缺點:

  • 根據(jù)定義,該過程是有順序的
  • 它只能處理數(shù)值參數(shù)
  • 即使訓練表現(xiàn)不佳,它也不提供任何停止訓練的機制

請注意,我們只是簡單地談到了這個話題,如果你對細節(jié)部分以及如何擴展 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ū)在完全配置的云服務器上運行以下代碼(使用 Hyperas 進行貝葉斯優(yōu)化(SMBO-TPE))。

 
 
 
 
  1. def data(): 
  2.     """ 
  3.     Data providing function: 
  4.     This function is separated from model() so that hyperopt 
  5.     won't reload data for each evaluation run. 
  6.     """ 
  7.     # Load / Cleaning / Preprocessing 
  8.     ... 
  9.     return x_train, y_train, x_test, y_test 
  10.  
  11. def model(x_train, y_train, x_test, y_test): 
  12.     """ 
  13.     Model providing function: 
  14.     Create Keras model with double curly brackets dropped-in as needed. 
  15.     Return value has to be a valid python dictionary with two customary keys: 
  16.         - loss: Specify a numeric evaluation metric to be minimized 
  17.         - status: Just use STATUS_OK and see hyperopt documentation if not feasible 
  18.     The last one is optional, though recommended, namely: 
  19.         - model: specify the model just created so that we can later use it again. 
  20.     """ 
  21.     # Model definition / hyperparameters space definition / fit / eval 
  22.     return {'loss': , 'status': STATUS_OK, 'model': model} 
  23.  
  24. # SMBO - TPE in action 
  25. best_run, best_model = optim.minimize(modelmodel=model, 
  26.                                       datadata=data, 
  27.                                       algo=tpe.suggest, 
  28.                                       max_evals=, 
  29.                                       trials=Trials()) 
  30.  
  31. # Show the results 
  32. x_train, y_train, x_test, y_test = data() 
  33. print("Evalutation of best performing model:") 
  34. print(best_model.evaluate(x_test, y_test)) 
  35. print("Best performing model chosen hyper-parameters:") 
  36. print(best_run) 

六、搜索策略對比

現(xiàn)在讓我們來總結一下到目前為止所涵蓋的策略,以了解每個策略的優(yōu)缺點。

總結

如果你或你的團隊有足夠的資源,貝葉斯 SMBO 可能是***,但是你也應該考慮建立一個隨機搜索的基準。

另一方面,如果你還在訓練或處于設計階段,即使在空間探索方面不切實際,照看法也是可以一試的。

正如我在上一節(jié)中提到的,如果一個訓練表現(xiàn)不佳,我們必須等到計算結束,因為這些策略都不能提供節(jié)省資源的機制。

因此,我們得出了***一個問題:我們能優(yōu)化訓練時間嗎?

我們來試試看。

七、提前終止的力量

提前終止不僅是一項著名的正則化技術,而且在訓練錯誤時,它還是一種能夠防止資源浪費的機制。

下面是最常用的終止訓練標準的圖表:

終止標準

前三個標準顯而易見,所以我們把注意力集中在***一個標準上。

通常情況下,研究人員會根據(jù)實驗類別來限定訓練時間。這樣可以優(yōu)化團隊內部的資源。通過這種方式,我們能夠將更多資源分配給最有希望的實驗。

floyd-cli(我們的用戶用來與 FloydHub 通信的軟件,已經(jīng)在 Github 上開源)為此提供了一個標準:我們的高級用戶正在大規(guī)模使用它來調節(jié)他們的實驗。

這些標準可以在照看學習過程時手動應用,或者你可以通過常見框架中提供的鉤子/回調在實驗中集成這些規(guī)則來做得更好:

  • Keras 提供了一個很好的提前終止功能,甚至還有一套回調組件。由于 Keras 最近已經(jīng)整合到 Tensorflow 中,你也可以使用 Tensorflow 代碼中的回調組件。
  • Tensorflow 提供了訓練鉤子,這些鉤子可能不像 Keras 回調那樣直觀,但是它們能讓你對執(zhí)行狀態(tài)有更多的控制。
  • Pytorch 還沒有提供鉤子或回調組件,但是你可以在論壇上查看 TorchSample 倉庫。我不太清楚 Pytorch 1.0 的功能列表(該團隊可能會在 PyTorch 開發(fā)者大會上發(fā)布一些內容),這個功能可能會隨新版本一起發(fā)布。
  • Fast.ai 庫也提供回調組件,即使它目前沒有提供任何形式的文檔(WIP),你也可以去找一個不錯的教程。幸運的是,他們有一個很棒的社區(qū)。
  • Ignite(Pytorch 的高級庫)提供類似于 Keras 的回調,雖然還在開發(fā)階段,但它看起來確實是一個不錯的選擇。

名單就這么多了,我的討論只涉及最常用/***的框架。-(我希望不會損害其他框架作者的玻璃心。如果是這樣,你可以將你的意見轉發(fā)給我,我會很樂意更新列表!)

還沒有結束。

機器學習有一個子領域叫做「AutoML」(Automatic Machine Learning,自動機器學習),目的是實現(xiàn)模型選擇、特征提取和/或超參數(shù)優(yōu)化的自動化。

這就引出了***一個問題(我保證是***一個!):我們能了解整個過程嗎?

你可以認為,AutoML 是一個解決了另一個機器學習任務的機器學習任務,類似于我們利用貝葉斯優(yōu)化完成的任務,本質上是元機器學習。

1. 研究:AutoML 和 PBT

你很可能聽說過谷歌的 AutoML,這是他們對神經(jīng)架構搜索的品牌重塑。請記住,在本文開頭,我們決定將模型設計組件合并到超參數(shù)變量中。那么,神經(jīng)架構搜索是 AutoML 的子領域,旨在為給定任務找到***模型。關于這個主題的全面討論需要一系列文章。幸運的是,來自 fast.ai 的 Rachel Thomas 博士做了一項了不起的工作,我們很樂意提供鏈接:

http://www.fast.ai/2018/07/12/auto-ml-1/。

我想和大家分享另一個來自 DeepMind 的有趣的研究成果,他們使用進化策略算法的一種變體來執(zhí)行超參數(shù)搜索,稱為基于群體的訓練(Population Based Training,PBT)。PBT 也是 DeepMind 的另一項研究(《Capture the Flag: the emergence of complex cooperative agents》)的基礎,新聞報道并不完全,我強烈建議你去看看。引自 DeepMind:

就像隨機搜索一樣,PBT 首先需要以隨機挑選超參數(shù)的方式訓練許多并行的神經(jīng)網(wǎng)絡。但是這些網(wǎng)絡并不是獨立訓練的,而是使用其它網(wǎng)絡的訓練信息來修正這些超參數(shù),并將計算資源分配到那些有希望的模型上。這種方法的靈感來自于遺傳算法:其中一個群體中的每個個體(被稱為 worker)可以利用除自身外其余個體的信息。例如,一個個體可能會從表現(xiàn)較好的個體那里復制模型參數(shù),它還能通過隨機改變當前的值來探索新的超參數(shù)集。

當然,這一領域可能還有許多其他有趣的研究。在這里,我只是和大家分享了最近得到媒體關注的一些研究。

2. 在 FloydHub 上管理你的實驗

FloydHub ***的特點之一是能夠在訓練時比較使用不同的超參數(shù)集的不同模型。

下圖展示了 FloydHub 項目中的作業(yè)列表。你可以看到此用戶正在使用作業(yè)的消息字段(例如,floyd run --message "SGD, lr=1e-3, l1_drop=0.3" ...)以突出顯示在每個作業(yè)上使用的超參數(shù)。

此外,你還可以查看每項作業(yè)的訓練指標。這些提供了快速瀏覽,幫助你了解哪些作業(yè)表現(xiàn)***,以及使用的機器類型和總訓練時間。

項目主頁

FloydHub 儀表板為你提供了一種簡單的方法來比較你在超參數(shù)搜索中做的所有訓練——并且實時更新。

我們建議你為每個必須解決的任務/問題創(chuàng)建一個不同的 FloydHub 項目。通過這種方式,你可以更輕松地組織工作并與團隊協(xié)作。

3. 訓練指標

如上所述,你可以輕松地在 FloydHub 上為你的作業(yè)發(fā)布訓練指標。當你在 FloydHub 儀表板上查看作業(yè)時,你將找到你定義的每個指標的實時圖表。

此功能無意替代 Tensorboard(我們也提供此功能),而是旨在突出顯示你已選擇的超參數(shù)配置的訓練走勢。

例如,如果你正在監(jiān)督訓練過程,那么訓練指標肯定會幫助你確定和應用停止標準。

訓練指標


分享標題:超參數(shù)搜索不夠高效?這幾大策略了解一下
網(wǎng)頁地址:http://m.jiaoqi3.com/article/dppdios.html