本文以最簡單的RNNs模型爲例:Elman循環神經網絡,講述循環神經網絡的工做原理,即使是你沒有太多循環神經網絡(RNNs)的基礎知識,也能夠很容易的理解。爲了讓你更好的理解RNNs,咱們使用Pytorch張量包和autograd庫從頭開始構建Elman循環神經網絡。該文中完整代碼在Github上是可實現的。網絡
Elman循環神經網絡併發
Jeff Elman首次提出了Elman循環神經網絡,並發表在論文《Finding structure in time》中:它只是一個三層前饋神經網絡,輸入層由一個輸入神經元x1和一組上下文神經元單元{c1 ... cn}組成。隱藏層前一時間步的神經元做爲上下文神經元的輸入,在隱藏層中每一個神經元都有一個上下文神經元。因爲前一時間步的狀態做爲輸入的一部分,所以咱們能夠說,Elman循環神經網絡擁有必定的內存——上下文神經元表明一個內存。函數
預測正弦波學習
如今,咱們來訓練RNNs學習正弦函數。在訓練過程當中,一次只爲模型提供一個數據,這就是爲何咱們只須要一個輸入神經元x1,而且咱們但願在下一時間步預測該值。輸入序列x由20個數據組成,而且目標序列與輸入序列相同。內存
模型實現input
首先導入包。it
接下來,設置模型的超參數。設置輸入層的大小爲7(6個上下文神經元和1個輸入神經元),seq_length用來定義輸入和目標序列的長度。基礎
生成訓練數據:x是輸入序列,y是目標序列。變量
建立兩個權重矩陣。大小爲(input_size,hidden_size)的矩陣w1用於隱藏鏈接的輸入,大小爲(hidden_size,output_size)的矩陣w2用於隱藏鏈接的輸出。 用零均值的正態分佈對權重矩陣進行初始化。原理
定義forward方法,其參數爲input向量、context_state向量和兩個權重矩陣,鏈接input和context_state建立xh向量。對xh向量和權重矩陣w1執行點積運算,而後用tanh函數做爲非線性函數,在RNNs中tanh比sigmoid效果要好。 而後對新的context_state和權重矩陣w2再次執行點積運算。 咱們想要預測連續值,所以這個階段不使用任何非線性。
請注意,context_state向量將在下一時間步填充上下文神經元。 這就是爲何咱們要返回context_state向量和out。
訓練
訓練循環的結構以下:
1.外循環遍歷每一個epoch。epoch被定義爲全部的訓練數據所有經過訓練網絡一次。在每一個epoch開始時,將context_state向量初始化爲0。
2.內部循環遍歷序列中的每一個元素。執行forward方法進行正向傳遞,該方法返回pred和context_state,將用於下一個時間步。而後計算均方偏差(MSE)用於預測連續值。執行backward()方法計算梯度,而後更新權重w1和w2。每次迭代中調用zero_()方法清除梯度,不然梯度將會累計起來。最後將context_state向量包裝放到新變量中,以將其與歷史值分離開來。
訓練期間產生的輸出顯示了每一個epoch的損失是如何減小的,這是一個好的衡量方式。損失的逐漸減小則意味着咱們的模型正在學習。
預測
一旦模型訓練完畢,咱們就能夠進行預測。在序列的每一步咱們只爲模型提供一個數據,並要求模型在下一個步預測一個值。
預測結果以下圖所示:黃色圓點表示預測值,藍色圓點表示實際值,兩者基本吻合,所以模型的預測效果很是好。
結論
在這裏,咱們使用了Pytorch從零開始構建一個基本的RNNs模型,而且學習瞭如何將RNNs應用於簡單的序列預測問題。
以上爲譯文。
連接:https://www.jianshu.com/p/7974dbea7a29