使用PyTorch從零開始構建Elman迴圈神經網路

【方向】發表於2018-03-29

本文以最簡單的RNNs模型為例:Elman迴圈神經網路,講述迴圈神經網路的工作原理即便是你沒有太多迴圈神經網路(RNNs)的基礎知識,也可以很容易的理解。為了讓你更好的理解RNNs我們使用Pytorch張量包和autograd從頭開始構建Elman迴圈神經網路。該文中完整程式碼在Github上是可實現的。

在這裡,假設你對前饋神經網路略有了解。Pytorchautograd更為詳細的內容請檢視我的其他教程

68363d99d874dfb5a2f53084e522c73a9f5f34cd

Elman迴圈神經網路

Jeff Elman首次提出了Elman迴圈神經網路,並發表在論文《Finding structure in time》中:它只是一個三層前饋神經網路,輸入層由一個輸入神經元x1一組上下文神經元單元{c1 … cn}組成隱藏層前一時間步的神經元作為上下文神經元的輸入在隱藏層中每個神經元有一個上下文神經元。由於前一時間步的狀態作為輸入的一部分,因此我們可以說Elman迴圈神經網路擁有一定的記憶體——上下文神經元代表一個記憶體。

預測正弦波

現在,我們來訓練RNNs學習正弦函式。在訓練過程中,一次為模型提供一個資料,這就是為什麼我們只需要一個輸入神經元x1,並且我們希望在下一時間步預測該值。輸入序列x20個資料組成,並且目標序列與輸入序列相同。

5a336e128286628cf86977c17783f34d70d06e35 

模型實現

首先匯入包。

e5048e42574aeaea8f76d0af60084ea0f24d3c9c 

接下來,設定模型的超引數。設定輸入層的大小為76個上下文神經元和1個輸入神經元),seq_length用來定義輸入和目標序列的長度。

c8be968e1760e5b306d6e3a5bec48b5d46c12026 

生成訓練資料:x是輸入序列,y是目標序列。

6fa08fc0e07c757d55b30fd33e064bb0347ae3b7 

建立兩個權重矩陣。大小為(input_sizehidden_size)的矩陣w1用於隱藏連線的輸入,大小為(hidden_sizeoutput_size)的矩陣w2用於隱藏連線的輸出。 用零均值的正態分佈對權重矩陣進行初始化。

d8a4877fbd8b331ef7755cc0a7b4b1cec27df859 

定義forward方法,其引數為input向量、context_state向量和兩個權重矩陣,連線inputcontext_state建立xh向量。對xh向量和權重矩陣w1執行點積運算,然後用tanh函式作為非線性函式,在RNNstanhsigmoid效果要好。 然後對新的context_state和權重矩陣w2再次執行點積運算。 我們想要預測連續值,因此這個階段不使用任何非線性。

請注意,context_state向量將在下一時間步填充上下文神經元。 這就是為什麼我們要返回context_state向量和out

4ca6517a08cbd409471972aab15631a2447a6b98 

訓練

訓練迴圈的結構如下:

1.外迴圈遍歷每個epochepoch被定義為所有的訓練資料全部通過訓練網路一次。在每個epoch開始時,將context_state向量初始化為0

2.內部迴圈遍歷序列中的每個元素。執行forward方法進行正向傳遞,該方法返回predcontext_state,將用於下一個時間步。然後計算均方誤差(MSE)用於預測連續值。執行backward()方法計算梯度,然後更新權重w1w2。每次迭代中呼叫zero_()方法清除梯度,否則梯度將會累計起來。最後將context_state向量包裝放到新變數中,以將其與歷史值分離開來。

4085d3f491eab971b4f5612b58d3e9d11b68b7b4 

訓練期間產生的輸出顯示了每個epoch的損失是如何減少的,這是一個好的衡量方式。損失的逐漸減少則意味著我們的模型正在學習。

23b7ff14535e2eb453038bfc222503c1cec5cc26 

預測

一旦模型訓練完畢,我們就可以進行預測。在序列的每一步我們只為模型提供一個資料,並要求模型在下一個步預測一個值。

f25e66a8ab5e47ae383972b9cc3a80e64420e433 

預測結果如下圖所示:黃色圓點表示預測值,藍色圓點表示實際值,二者基本吻合,因此模型的預測效果非常好。

a16cb76e976c4b32d1db8e55780e5a18816f67dd

結論

在這裡,我們使用了Pytorch從零開始構建一個基本的RNNs模型,並且學習瞭如何將RNNs應用於簡單的序列預測問題。

數十款阿里雲產品限時折扣中,趕緊點選領劵開始雲上實踐吧! 

以上為譯文。

本文由北郵@愛可可-愛生活 老師推薦,阿里云云棲社群組織翻譯。

文章原標題《Introduction to Recurrent Neural Networks in Pytorch》,譯者:Mags,審校:袁虎。

文章為簡譯,更為詳細的內容,請檢視原文 

 


相關文章