原文鏈接:http:///?p=20335在本文中,,我們將介紹三種提高循環(huán)神經網絡性能和泛化能力的高級技術。我們演示有關溫度預測問題的三個概念,,我們使用建筑物屋頂上的傳感器的時間數據序列,。 概述在本文中,我們將介紹三種提高循環(huán)神經網絡性能和泛化能力的高級技術,。在最后,,您將了解有關將循環(huán)網絡與Keras一起使用的大部分知識。您可以訪問來自建筑物屋頂上的傳感器的時間數據序列,,例如溫度,,氣壓和濕度,這些數據點可用于預測最后一個數據點之后24小時的溫度,。這是一個相當具有挑戰(zhàn)性的問題,,它說明了使用時間序列時遇到的許多常見困難。 我們將介紹以下技術:
溫度預測問題在本節(jié)的所有示例中,您將使用生物地球化學研究所的氣象站記錄的 天氣時間序列數據集,。 在此數據集中,,幾年中每10分鐘記錄14個不同的量(例如空氣溫度,大氣壓力,,濕度,,風向等)。原始數據可追溯到2003年,,但此示例僅限于2009-2016年的數據,。該數據集非常適合學習使用數字時間序列,。您將使用它來構建一個模型,該模型將最近的一些數據(幾天的數據點)作為輸入,,并預測未來24小時的氣溫,。 下載并解壓縮數據,如下所示: unzip( 我們看一下數據,。 library(tibble) 這是溫度(攝氏度)隨時間變化的曲線圖,。在此圖上,您可以清楚地看到溫度的年度周期,。 ggplot(data, aes(x = 1:nrow(data), y = `degC`)) + geom_line() 這是溫度數據的前10天變化圖,。由于數據每10分鐘記錄一次,因此您每天可獲得144個數據點,。 ggplot(data[1:1440,], aes(y = `degC`)) + geom_line() 如果您根據過去幾個月的數據來嘗試預測下個月的平均溫度,,由于數據的年度周期性可靠,因此問題很容易解決,。但是從幾天的數據來看,,溫度更加混亂。這個時間序列每天都可以預測嗎,? 準備數據問題的確切表達如下:給定的數據可以追溯到
首先,,您需要做兩件事:
生成器函數是一種特殊類型的函數,,可以反復調用該函數以獲得一系列值,。 例如,, gen <- sequence_generator(10) [1] 10 gen() [1] 11 生成器的當前狀態(tài) 生成器函數可以通過返回值 首先,,將先前讀取的R數據幀轉換為浮點值矩陣(我們丟棄包含文本時間戳記的第一列): data <- data.matrix(data[,-1]) 然后,您可以通過減去每個時間序列的平均值并除以標準差來預處理數據,。您將使用前200,000個時間步作為訓練數據,,因此僅在這部分數據上計算均值和標準差以進行標準化。 train_data <- data[1:200000,] 您將使用的數據生成器的代碼如下,。它產生一個list
現(xiàn)在,,讓我們使用abstract lookback <- 1440 常識性的非機器學習基準在開始使用黑盒深度學習模型解決溫度預測問題之前,讓我們嘗試一種簡單的常識性方法,。它將用作健全性檢查,,并將建立一個基線,您必須超過它才能證明機器學習模型的有用性,。當您要解決尚無已知解決方案的新問題時,,此類常識性基準可能會很有用,。一個經典的例子是不平衡的分類任務,其中某些類比其他類更為常見,。如果您的數據集包含90%的A類實例和10%的B類實例,,則分類任務的常識性方法是在提供新樣本時始終預測“ A”。此類分類器的總體準確度為90%,,因此,,任何基于學習的方法都應超過90%的分數,以證明其有用性,。 在這種情況下,,可以安全地假定溫度時間序列是連續(xù)的(明天的溫度可能會接近今天的溫度)。因此,,常識性的方法是始終預測從現(xiàn)在開始24小時的溫度將等于現(xiàn)在的溫度,。我們使用平均絕對誤差(MAE)指標評估這種方法: mean(abs(preds - targets)) 評估循環(huán)。 for (step in 1:val_steps) { MAE為0.29,。由于溫度數據已標準化為以0為中心并且標準偏差為1,。它的平均絕對誤差為0.29 x celsius_mae <- 0.29 * std[[2]] 那是一個相當大的平均絕對誤差,。 基本的機器學習方法就像在嘗試機器學習方法之前建立常識性基準很有用一樣,,在研究復雜且計算量大的模型之前,嘗試簡單的機器學習模型也很有用,。 下面的清單顯示了一個全連接的模型,,該模型首先將數據展平,然后在兩個密集層中運行它,。請注意,,最后一個致密層上缺少激活函數,這對于回歸問題是很典型的,。您將MAE用作損失函數,。由于您評估的數據與通常方法完全相同,而且度量標準完全相同,,因此結果可以直接比較,。 model_sequential() %>% 讓我們顯示驗證和訓練的損失曲線。 某些驗證損失接近無學習基準,,但不可靠,。這首先顯示了具有此基準的優(yōu)點:事實證明,要實現(xiàn)這一目標并不容易,。您的常識包含很多機器學習模型無法訪問的有價值的信息,。 您可能想知道,如果存在一個簡單的,性能良好的模型,,為什么您正在訓練的模型找不到并對其進行改進,?因為這種簡單的解決方案不是您的訓練設置所需要的。您要在其中尋找解決方案的模型的空間已經相當復雜,。當您正在尋找具有兩層網絡空間的復雜模型解決方案時,,即使在技術上是假設簡單,性能良好的基準模型也可能無法學習,。通常,,這是機器學習的一個相當大的局限性:除非對學習算法進行硬編碼來尋找特定類型的簡單模型, 基準模型第一種全連接的方法效果不好,,但這并不意味著機器學習不適用于此問題,。先前的方法首先使時間序列平坦化,從而從輸入數據中刪除了時間概念,。我們將嘗試一個遞歸序列處理模型-它應該非常適合此類序列數據,,因為與第一種方法不同,,正是因為它利用了數據點的時間順序,。 您將使用Chung等人開發(fā)的 GRU層。在2014年,。GRU層使用與LSTM相同的原理工作,,但是它們有所簡化,因此運行起來更高效,。在機器學習中到處都可以看到計算復雜度和效率之間的折衷,。 model_sequential() %>% 結果如下圖所示。您可以超越基線模型,,證明了機器學習的價值以及循環(huán)網絡的優(yōu)越性,。 驗證MAE轉化為非標準化后的平均絕對誤差為2.35?C。 丟棄(dropout)對抗過度擬合從訓練和驗證曲線可以明顯看出該模型是過擬合的:訓練和驗證損失在經過幾個時期后開始出現(xiàn)較大差異,。您已經熟悉了應對這種現(xiàn)象的經典技術:丟棄(dropout),,它隨機將圖層的輸入單元清零,以便打破該圖層所暴露的訓練數據中的偶然相關性,。但是,,如何在循環(huán)網絡中正確應用dropout并不是一個簡單的問題。道在遞歸層之前應用dropout會阻礙學習,,而不是幫助進行正則化,。2015年,Yarin Gal作為其博士學位論文的一部分 在貝葉斯深度學習中,,確定了使用遞歸網絡進行dropout的正確方法:應在每個時間步上應用相同的dropout模式,,而不是隨時間步長隨機變化的dropout模式。 Yarin Gal使用Keras進行了研究,并幫助將這種模型直接構建到Keras循環(huán)層中,。Keras中的每個循環(huán)圖層都有兩個與dropout相關的參數: model_sequential() %>% 下圖顯示了結果。在前20個時期中,,您不再過度擬合,。但是,盡管您的評估分數較為穩(wěn)定,,但您的最佳分數并沒有比以前低很多,。 堆疊循環(huán)圖層因為您不再需要考慮過度擬合的問題,而是似乎遇到了性能瓶頸,,所以您應該考慮增加網絡的容量,。回想一下通用機器學習工作流程的描述:在過擬合成為主要障礙之前,,最好增加網絡容量,,這通常是個好主意(假設您已經采取了基本步驟來減輕過擬合的情況,例如使用丟棄),。只要您的擬合度不會太差,,就很可能會出現(xiàn)容量不足的情況。 通常,,通過增加層中的單元數或添加更多層來增加網絡容量,。遞歸層堆疊是構建功能更強大的遞歸網絡的經典方法:例如,當前為Google Translate算法提供動力的是七個大型LSTM層的堆疊,。 為了在Keras中將遞歸層堆疊在一起,,所有中間層都應返回其完整的輸出序列(3D張量),而不是最后一個時間步的輸出,。 model_sequential() %>% 下圖顯示了結果,。您可以看到,添加的圖層確實改善了結果,,盡管效果不明顯,。您可以得出兩個結論:
使用雙向RNN本節(jié)介紹的最后一種技術稱為 _雙向RNN_,。雙向RNN是常見的RNN變體,在某些任務上可以提供比常規(guī)RNN更高的性能,。它在自然語言處理中經常使用-您可以將其稱為用于深度語言處理的深度學習“瑞士軍刀”,。 RNN特別依賴于順序或時間的:它們按順序處理輸入序列的時間步長,重新排列時間步長可以完全改變RNN從序列中提取的表示形式,。這正是它們在序列問題(例如溫度預測問題)上表現(xiàn)良好的原因,。雙向RNN利用RNN的序列敏感性:它包含使用兩個常規(guī)RNN(例如 值得注意的是,,本節(jié)中的RNN層已按時間順序處理了序列。訓練與本節(jié)第一個實驗中使用相同的單GRU層網絡,,您將獲得如下所示的結果,。 結果表明在這種情況下,按時間順序進行的處理至關重要,。因為:底層的GRU層通常更容易記住最近的過去,,自然地,,較新的天氣數據點比舊數據點對問題的預測能力強,。因此,該層的時間順序版本必將勝過逆序版本,。對于包括自然語言在內的許多其他問題,,情況并非如此:從直覺上講,單詞在理解句子中的重要性通常并不取決于其在句子中的位置,。讓我們在LSTM IMDB示例中嘗試相同的技巧,。 # 作為特征考慮的單詞數量 您獲得的性能幾乎與按時間順序排列的LSTM相同。值得注意的是,,在這樣的文本數據集上,,逆序處理與按時間順序處理一樣有效,這證實了以下假設:盡管單詞順序 在理解語言中_確實很_重要,, _但_ 您使用的順序并不重要,。重要的是,經過逆向序列訓練的RNN將學習與原始序列訓練的RNN不同的表達方式,。在機器學習中,, _不同_ _的表示_ 總是值得開發(fā)的:它們提供了一個新的視角來查看您的數據,捕獲了其他方法遺漏的數據方面,因此可以幫助提高任務的性能,。 雙向RNN利用此思想來改進按時間順序排列的RNN的性能,。 在Keras中實例化雙向RNN。讓我們在IMDB情緒分析任務上嘗試一下,。 model <- keras_model_sequential() %>% 它的性能比您在上一節(jié)中嘗試過的常規(guī)LSTM稍好,,達到了89%以上的驗證精度。它似乎也可以更快地過擬合,,這并不奇怪,,因為雙向層的參數是按時間順序排列的LSTM的兩倍。通過一些正則化,,雙向方法可能會在此任務上表現(xiàn)出色,。 現(xiàn)在讓我們在溫度預測任務上嘗試相同的方法。 model_sequential() %>%
|
|