自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

自動化機器學習第一步:使用Hyperopt自動選擇超參數(shù)

開發(fā) 開發(fā)工具 自動化
近日,機器學習開發(fā)者兼饒舌歌手 Alex Honchar 在 Medium 上發(fā)文分享了自動化這些選擇過程的方式。另外,本文涉及的相關代碼也已在 GitHub 上公開。

有時候在學習神經(jīng)網(wǎng)絡教程時,我們通常會看到有的實驗似乎理所當然地就選定了某種神經(jīng)網(wǎng)絡架構以及特定的網(wǎng)絡層數(shù)、激活函數(shù)、損失函數(shù)等等,卻沒有解釋原因。因為解釋起來有點難。是的,深度學習社區(qū)選擇 ReLU(或更現(xiàn)代的選擇 ELU 或 SELU)作為激活函數(shù)是「常態(tài)」,而且我們基本上也欣然接受,但我們通常并沒有思考這是否是正確的。比如在網(wǎng)絡的層數(shù)和優(yōu)化器的學習率選擇上,我們通常都遵循標準。近日,機器學習開發(fā)者兼饒舌歌手 Alex Honchar 在 Medium 上發(fā)文分享了自動化這些選擇過程的方式。另外,本文涉及的相關代碼也已在 GitHub 上公開。

代碼地址:https://github.com/Rachnog/Deep-Trading/tree/master/hyperparameters

超參數(shù)搜索

卷積神經(jīng)網(wǎng)絡訓練的典型超參數(shù)的列表

卷積神經(jīng)網(wǎng)絡訓練的典型超參數(shù)的列表

在開始訓練一個模型之前,每個機器學習案例都要選擇大量參數(shù);而在使用深度學習時,參數(shù)的數(shù)量還會指數(shù)式增長。在上面的圖中,你可以看到在訓練計算機視覺卷積神經(jīng)網(wǎng)絡時你要選擇的典型參數(shù)。

但有一個可以自動化這個選擇過程的方法!非常簡單,當你要選擇一些參數(shù)和它們的值時,你可以:

  • 啟動網(wǎng)格搜索,嘗試檢查每種可能的參數(shù)組合,當有一種組合優(yōu)化了你的標準時(比如損失函數(shù)達到最小值),就停止搜索。
  • 當然,在大多數(shù)情況下,你可等不了那么久,所以隨機搜索是個好選擇。這種方法可以隨機檢查超參數(shù)空間,但速度更快而且大多時候也更好。
  • 貝葉斯優(yōu)化——我們?yōu)槌瑓?shù)分布設置一個先決條件,然后在觀察不同實驗的同時逐步更新它,這讓我們可以更好地擬合超參數(shù)空間,從而更好地找到最小值。

在這篇文章中,我們將把***一個選項看作是一個黑箱,并且重點關注實際實現(xiàn)和結果分析。

HFT 比特幣預測

比特幣

我使用的數(shù)據(jù)來自 Kaggle,這是用戶 @Zielak 貼出的比特幣過去 5 年的每分鐘價格數(shù)據(jù),數(shù)據(jù)集地址:

https://www.kaggle.com/mczielinski/bitcoin-historical-data。

比特幣價格的樣本圖

比特幣價格的樣本圖

我們將取出其中最近 10000 分鐘的一個子集,并嘗試構建一個能夠基于我們選擇的一段歷史數(shù)據(jù)預測未來 10 分鐘價格變化的***模型。

對于輸入,我想使用 OHLCV 元組外加波動,并將這個數(shù)組展開以將其輸入多層感知器(MLP)模型。

  1. o = openp[i:i+window] 
  2. h = highp[i:i+window] 
  3. l = lowp[i:i+window] 
  4. c = closep[i:i+window] 
  5. v = volumep[i:i+window] 
  6. volat = volatility[i:i+window] 
  7. x_i = np.column_stack((o, h, l, c, v, volat)) 
  8. x_ix_i = x_i.flatten() 
  9. y_i = (closep[i+window+FORECAST] - closep[i+window]) / closep[i+window] 

優(yōu)化 MLP 參數(shù)

我們將使用 Hyperopt 庫來做超參數(shù)優(yōu)化,它帶有隨機搜索和 Tree of Parzen Estimators(貝葉斯優(yōu)化的一個變體)的簡單接口。Hyperopt 庫地址:http://hyperopt.github.io/hyperopt

我們只需要定義超參數(shù)空間(詞典中的關鍵詞)和它們的選項集(值)。你可以定義離散的值選項(用于激活函數(shù))或在某個范圍內均勻采樣(用于學習率)。

  1. space = {'window': hp.choice('window',[30, 60, 120, 180]), 
  2.         'units1': hp.choice('units1', [64, 512]), 
  3.         'units2': hp.choice('units2', [64, 512]), 
  4.         'units3': hp.choice('units3', [64, 512]), 
  5.         'lr': hp.choice('lr',[0.01, 0.001, 0.0001]), 
  6.         'activation': hp.choice('activation',['relu', 
  7.                                                 'sigmoid', 
  8.                                                 'tanh', 
  9.                                                 'linear']), 
  10.         'loss': hp.choice('loss', [losses.logcosh, 
  11.                                     losses.mse, 
  12.                                     losses.mae, 
  13.                                     losses.mape])} 

在我們的案例中,我想檢查:

  • 我們需要更復雜還是更簡單的架構(神經(jīng)元的數(shù)量)
  • 激活函數(shù)(看看 ReLU 是不是真的是***選擇)
  • 學習率
  • 優(yōu)化標準(也許我們可以最小化 logcosh 或 MAE,而不是 MSE)
  • 我們需要的穿過網(wǎng)絡的時間窗口,以便預測接下來 10 分鐘

當我們用 params 詞典的對應值替換了層或數(shù)據(jù)準備或訓練過程的真正參數(shù)后(我建議你閱讀 GitHub 上的完整代碼):

  1. main_input = Input(shape=(len(X_train[0]), ), name='main_input'
  2. x = Dense(params['units1'], activation=params['activation'])(main_input) 
  3. x = Dense(params['units2'], activation=params['activation'])(x) 
  4. x = Dense(params['units3'], activation=params['activation'])(x) 
  5. output = Dense(1, activation = "linear"name = "out")(x) 
  6. final_model = Model(inputs=[main_input], outputs=[output]) 
  7. opt = Adam(lr=params['lr']) 
  8. final_model.compile(optoptimizer=opt,  loss=params['loss']) 
  9. history = final_model.fit(X_train, Y_train,  
  10.                   epochs = 5,  
  11.                   batch_size = 256,  
  12.                   verbose=0,  
  13.                   validation_data=(X_test, Y_test), 
  14.                   shuffle=True
  15. pred = final_model.predict(X_test) 
  16. predpredicted = pred 
  17. original = Y_test 
  18. mse = np.mean(np.square(predicted - original)) 
  19. sys.stdout.flush()  
  20. return {'loss': -mse, 'status': STATUS_OK} 

我們將檢查網(wǎng)絡訓練的前 5 epoch 的性能。在運行了這個代碼之后,我們將等待使用不同參數(shù)的 50 次迭代(實驗)執(zhí)行完成,Hyperopt 將為我們選出其中***的選擇,也就是:

  1. best:  
  2. {'units1': 1, 'loss': 1, 'units3': 0, 'units2': 0, 'activation': 1, 'window': 0, 'lr': 0} 

這表示我們需要***兩層有 64 個神經(jīng)元而***層有 512 個神經(jīng)元、使用 sigmoid 激活函數(shù)(有意思)、取經(jīng)典的學習率 0.001、取 30 分鐘的時間窗口來預測接下來的 10 分鐘……很好。

結果

首先我們要構建一個「金字塔」模式的網(wǎng)絡,我常常用這種模式來處理新數(shù)據(jù)。大多時候我也使用 ReLU 作為激活函數(shù),并且為 Adam 優(yōu)化器取標準的學習率 0.002.

  1. X_train, X_test, Y_train, Y_test = prepare_data(60) 
  2. main_input = Input(shape=(len(X_train[0]), ), name='main_input'
  3. x = Dense(512, activation='relu')(main_input) 
  4. x = Dense(128, activation='relu')(x) 
  5. x = Dense(64, activation='relu')(x) 
  6. output = Dense(1, activation = "linear"name = "out")(x) 
  7. final_model = Model(inputs=[main_input], outputs=[output]) 
  8. opt = Adam(lr=0.002) 
  9. final_model.compile(optoptimizer=opt,  loss=losses.mse) 

看看表現(xiàn)如何,藍色是我們的預測,而黑色是原始情況,差異很大,MSE = 0.0005,MAE = 0.017。

基本架構的結果

現(xiàn)在看看使用 Hyperopt 找到的超參數(shù)的模型在這些數(shù)據(jù)上表現(xiàn)如何:

  1. X_train, X_test, Y_train, Y_test = prepare_data(30) 
  2. main_input = Input(shape=(len(X_train[0]), ), name='main_input'
  3. x = Dense(512, activation='sigmoid')(main_input) 
  4. x = Dense(64, activation='sigmoid')(x) 
  5. x = Dense(64, activation='sigmoid')(x) 
  6. output = Dense(1, activation = "linear"name = "out")(x) 
  7. final_model = Model(inputs=[main_input], outputs=[output]) 
  8. opt = Adam(lr=0.001) 
  9. final_model.compile(optoptimizer=opt, loss=losses.mse) 

使用 Hyperopt 找的參數(shù)所得到的結果

使用 Hyperopt 找的參數(shù)所得到的結果

在這個案例中,數(shù)值結果(MSE = 4.41154599032e-05,MAE = 0.00507)和視覺效果都好得多。

老實說,我認為這不是個好選擇,尤其是我并不同意如此之短的訓練時間窗口。我仍然想嘗試 60 分鐘,而且我認為對于回歸而言,Log-Cosh 損失是更加有趣的損失函數(shù)選擇。但我現(xiàn)在還是繼續(xù)使用 sigmoid 激活函數(shù),因為看起來這就是表現(xiàn)極大提升的關鍵。

  1. X_train, X_test, Y_train, Y_test = prepare_data(60) 
  2. main_input = Input(shape=(len(X_train[0]), ), name='main_input'
  3. x = Dense(512, activation='sigmoid')(main_input) 
  4. x = Dense(64, activation='sigmoid')(x) 
  5. x = Dense(64, activation='sigmoid')(x) 
  6. output = Dense(1, activation = "linear"name = "out")(x) 
  7. final_model = Model(inputs=[main_input], outputs=[output]) 
  8. opt = Adam(lr=0.001) 
  9. final_model.compile(optoptimizer=opt,  loss=losses.logcosh) 

這里得到 MSE = 4.38998280095e-05 且 MAE = 0.00503,僅比用 Hyperbot 的結果好一點點,但視覺效果差多了(完全搞錯了趨勢)。

結論

我強烈推薦你為你訓練的每個模型使用超參數(shù)搜索,不管你操作的是什么數(shù)據(jù)。有時候它會得到意料之外的結果,比如這里的超參數(shù)(還用 sigmoid?都 2017 年了啊?)和窗口大小(我沒料到半小時的歷史信息比一個小時還好)。

如果你繼續(xù)深入研究一下 Hyperopt,你會看到你也可以搜索隱藏層的數(shù)量、是否使用多任務學習和損失函數(shù)的系數(shù)?;旧蟻碚f,你只需要取你的數(shù)據(jù)的一個子集,思考你想調節(jié)的超參數(shù),然后等你的計算機工作一段時間就可以了。這是自動化機器學習的***步!

原文:

https://medium.com/@alexrachnog/neural-networks-for-algorithmic-trading-hyperparameters-optimization-cb2b4a29b8ee

【本文是51CTO專欄機構“機器之心”的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】

 

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2020-06-30 12:07:04

SD-WANWAN自動化

2009-01-18 08:49:04

Java入門JDK

2018-02-10 11:24:39

Python數(shù)據(jù)程序

2021-01-15 18:17:06

網(wǎng)絡協(xié)議分層

2011-08-31 09:38:36

網(wǎng)絡營銷MSN社交網(wǎng)絡

2012-08-30 11:14:11

云計算虛擬化

2010-01-21 10:29:54

java認證

2012-07-11 16:43:14

飛視美

2013-01-15 09:17:11

2011-04-13 17:24:28

2013-04-03 09:22:14

虛擬化網(wǎng)絡虛擬化

2009-02-02 23:18:25

虛擬化VMware整合評估

2015-06-02 11:42:00

Cloud FoundAzure

2021-08-24 05:07:25

React

2019-11-20 10:54:46

無密碼身份驗證網(wǎng)絡安全

2020-11-17 14:55:36

亞馬遜云科技遷移

2020-12-15 10:32:46

自動化運維監(jiān)控平臺集群

2021-07-01 08:31:25

數(shù)字化轉型大數(shù)據(jù)數(shù)據(jù)采集

2011-07-25 14:17:46

BSMIT運維北塔

2010-07-01 13:44:12

點贊
收藏

51CTO技術棧公眾號