當前位置:
首頁 > 最新 > 基於遞歸神經網路的張量流時間序列分析

基於遞歸神經網路的張量流時間序列分析

作者:Tathagat Dasgupta

來源:click-bait

編輯:代碼醫生團隊

在這篇文章中,我們將討論複發神經網路是什麼以及它們如何運作。此外,我們將編寫一個簡單的時間序列問題,以更好地了解RNN的工作原理。

遞歸神經網路是一種深度神經網路,顧名思義,它對隱藏層的重複輸入,即隱藏層的輸出反饋給自身。看看這張圖片可以更好地理解結構

這是一個典型的RNN小區。請注意,右側的圖像不是多層,而是同一層在輸出反饋到隱藏層的時間展開。現在,您一定想知道,為什麼我們討論循環神經網路。要理解這一點,你必須熟悉神經記憶的概念。

神經記憶是傳遞給模型的能力,當輸入是連續的時,保留前一時間步驟的輸入。簡而言之,當我們的問題與諸如句子或時間序列或歌曲的歌詞等數據序列相關聯時,模型必須記住輸入的先前狀態才能起作用。

讓我們考慮一個場景,如果你被要求嘗試從中間歌曲的歌詞?這對你來說有點困難。這不是因為你不記得這首歌,而是因為你的大腦沒有條件按照那個順序唱出歌詞。所以,大腦需要知道之前的歌詞才能繼續歌詞。這就是所謂的條件記憶,這就是RNN的特殊之處。

循環神經網路可以記住先前時間步驟的輸入狀態,這有助於它決定未來的時間步長。請仔細觀看下面的動畫,並確保您理解它(向iamtrask博客致敬)。

GIF

在這個gif中,我們可以看到有四個隱藏層,它們在四個時間步驟中展開。在每個時間步驟中,隱藏的層從當前輸入(紅色,綠色,紫色)以及他們先前的時間步狀態(藍色,紅色,綠色)灌輸一些特徵。

現在,這個概念存在一個小問題。使用反向傳播演算法訓練模型,其中我們累積來自輸出層的梯度並將其傳遞迴整個網路。由於我們sigmoid激活函數和現實世界問題中的時間步數是巨大的,漸變傾向於變得無限小(幾乎為)。這被稱為消失梯度問題。

為了克服這個問題,RNN的改進被開發出來,被稱為長期短期記憶網路(LSTM)。開發LSTM單元以通過引入幾個門來解決梯度問題,這將有助於模型決定要保留哪些信息以及忘記什麼。

基本的RNN小區

LSTM細胞

上面的圖像是一個基本的RNN單元,其中h(t-1)(下標t:中不支持子腳本!! LOL)是前一時間步的輸出,並且正在被傳遞到tanh激活中當前輸入x(t)。這個單元格的數學如下

h(t)= h(t-1)* w(recurr)+(x(t)*w(feed)+ b)

現在,如果您注意到LSTM小區,它似乎比RNN小區複雜得多,但基本上它只是四層的組合:

忘記門層

存儲門層

新的細胞狀態層

輸出層

此外,我們有一個新變數C(t-1),它是前一個單元格的單元格狀態。

第一層是負責決定哪些信息從以前的細胞狀態保留,是被人遺忘或刪除的信息。這是一個二進位門,即如果f(t)= 1,我們保留信息,如果f(t)= 0我們忘記了信息。

f(t)= sigmoid(W(f)* [h(t-1),x(t)] + b(f))

所述第二層具有一輸入門使用我們計算稱為另一個變數新的候選值。新候選值是似乎相關的信息被添加到單元狀態。使用來自輸入門的當前獲取的輸入來確定這些值。

i(t)=sigmoid(W(i)* [h(t-1),x(t)] + b(i))

C(t^)=tanh(W(c)* [h(t-1,x(t)] + b(c))

第三層,計算其被用於計算該時間步驟的輸出,並且也傳遞到下一個小區的新的小區狀態。使用從前兩層獲取的信息計算新的單元狀態。

C(t)= f(t)* C(t-1)+ i(t)* C(t ^)

在輸出層利用了收集到的最後三個層用以產生具有從當前時間步長,並且還從幾個先前時間步長的特徵的輸出的所有此信息。

o(t)= sigmoid(W(o)* [f(t-1),x(t)] + b(o))

h(t)= o(t)* tanh(C(t))

現在,這些LSTM細胞有多種變化,這些變化多年來已經開發出來。最新的RNN稱為門控循環單元(GRU)。

但是,足夠的理論。讓我們繼續進行一些編碼!

我們將解決一個簡單的問題,我們正在生成一個正弦波,並向RNN提供一批正弦波,並要求它預測該批次的下一個值,即提前一個值。這是一個非常簡單的問題(這是一個初學者教程),因為我們只看到一個時間步,但可以應用相同的實現來預測未來幾個時間步的數據。

首先,我們將創建一個類TimeSeriesData,我們將使用它來生成正弦數據點並生成用於訓練的批處理。

__init __()定義x_datay_true它們分別在x軸和y軸的訓練點。

繪製正弦波

正弦波

所述next_batch()是一個效用函數,其拾取隨機一批點的從上述產生的數據(正弦波)。首先,我們創建一個隨機點random_start並將該點轉換為正弦波(ts_start)上的一個點。接下來,我們在x軸和y軸上創建批次,即batch_tsy_batch。if-else條件步驟允許用戶返回當前時間步長和下一個時間步長的正弦波,或者當前和之前的時間步長以及x軸批次值。

從正弦波繪製批次

從正弦波批量

np.flatten()明確的方法來重塑我們的載體,這樣我們就可以繪製我們的點。

現在,我們可以在正弦波上繪製生成的批次,以獲得更好的可視化效果。

現在,我們有了訓練數據,為方便起見,我們聲明了一些變數和佔位符。

請注意,我們有num_outputs = 1,但神經元的數量設置為100.因此,我們使用OutputProjectionWrapper()一個效用函數將輸出包裝成單個輸出值。接下來,我們定義要使用的RNN單元的類型,並啟動tf.nn.dynamic_rnn()以從我們的循環網路生成結果。您可以嘗試單元格類型,但我在本教程中使用GRU單元格。

現在,我們為模型定義損失,優化器和訓練函數。

我們還需要一個變數train_inst,它代表我們將用於訓練的隨機訓練實例。

現在,我們只需運行會話並在每100步後列印一次損失。我們將預測存儲在y_pred中。請記住,我們正在考慮30個時間步驟進行這個實驗。

為了顯示我們的結果,我們使用下面的代碼塊:

這是我們模型的最終輸出可視化。培訓實例從當前時間步驟指示批次。目標代表下一個時間步的批次。而且,預測是我們模型為下一個時間步驟預測的點。所以,基本上你的預測點越接近目標,你的模型就越好。

以較少的迭代次數或較慢的學習速率運行相同的代碼可能導致預測點中的一些異常值。如果迭代次數減少到2000,則為輸出。

您可能會注意到,初始預測點有點偏差。這表明我們的模型無法準確地保留30個時間步之前的信息。

您可以使用相同的實現來預測系列中的其他點,只需在我們的類中編輯next_batch()方法下的if-else條件,這樣就可以循環進一步的時間步並返回相應的輸出。

就這樣!!直到下一次。

《python帶我起飛—入門、進階、商業實戰》一書已經開始預購

代碼醫生出品

讓Ai學習

變得簡單

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

貴族口紅就問你們愛不愛
【股票】道聽途說

TAG:全球大搜羅 |