原文地址:http://www.keraschina.com/keras_rnn/
一、RNN網絡結構及原理講解
RNN的網絡結構如下圖:
Xi代表輸入第i時刻輸入,hi代表第i時刻記憶,yi代表第i時刻輸出,U,V,W為相應權重矩陣。
圖中左側是未展開RNN模型,在模型中間有個大圓圈表示循環,正是這個循環允許信息的持久化。但這個看起來可能不太好理解,因此將其展開為右側的模型,並做進一步詳細介紹如何實現信息的持久化。
右圖中圓圈可以看作一個單元。定義Xi為第i時刻的輸入,hi為第i時刻的記憶,yi為第i時刻的輸出。
舉個例子說明RNN實現過程:假設有一個句子的輸入是”今天天空很”,要預測下個詞是什么。通過分詞后可能得到三個詞作為輸入:“今天”,“天空”,“很”,對應的就是上圖的Xi-1,Xi,Xi+1,那么輸出yi-1應該是“天空”,yi應該是“很”,預測下個詞yi+1是什么,根據這句話,“藍”的概率比較大。因此預測下個詞應該是“藍”。
通過上述淺顯易懂的例子讀者應該對RNN實現過程有個大概的了解,接下來將具體講解RNN實現的詳細過程。
輸入層到隱藏層:
從上圖的箭頭指示,讀者或許發現第i時刻的輸出是由上一時刻的記憶和當前時刻共同決定的。這個思想很符合對時序數據處理的思路。正如我們在看連續劇的時候如果直接看中間某一集,可能會對部分劇情不能理解,但是,當我們看過前幾集后會對劇情有所記憶,再加上該集劇情內容,我們就能更好的理解接下來劇情內容。因此用公式表示RNN當前時刻的記憶為:
其中f()函數為激活函數。在此處要加上激活函數也很好理解,因為得到的信息並不是所有的都是重要的信息,而我們只需要記住重要的信息即可。這個時候就可以使用激活函數,如tanh,去對一些不重要的信息進行過濾,保留重要的信息即可。
隱藏層到輸出層:
同樣使用電視劇的例子進行通俗解釋,當我們對上幾集和該集的劇情進行整理,留下一些重要信息之后,我們會試圖去猜測下一集的內容大概會是怎么樣的。同樣的,RNN的思路也如此。當我們hi中保留了i時刻的重要信息后,就試圖使用這些重要信息進行預測下一個詞應該是什么。用公式表示RNN當前時刻的輸出為:
使用softmax函數是RNN希望預測每個詞出現的概率,然后概率最高的詞就是預測的下一個詞。
注:U、W、V分別是對應的權重矩陣,通過反向傳播算法調整相應的值使得預測的結果更加准確。與CNN一樣,網絡中的每個單元都共享同一組(U、V、W),可以極大的降低了計算量。
具體的前向傳播計算過程如下:
在t1時刻的輸入為2,結合上一時刻的記憶(0.537,0.462),得到(0.54,0.46,2.0),然后與隱藏層的權重矩陣相乘得到該時刻的記憶(0.860,0.884)。通過該時刻的記憶與輸出層的權重矩陣相乘得到該時刻的預測值2.73。這就是一個時刻RNN前向傳播的具體過程。
因此,通過上述思想,RNN就能有效的處理時序數據,對每個輸入保留一些重要的信息,理論上最后就能得到整個輸入的所有重要信息,進而綜合考慮所有輸入去預測輸出。
二、雙向RNN(BRNN)網絡結構及原理講解
在RNN中只考慮了預測詞前面的詞,即只考慮了上下文中“上文”,並沒有考慮該詞后面的內容。這可能會錯過了一些重要的信息,使得預測的內容不夠准確。正如電視劇的例子,當在該集新出現了一個人物,若要預測該人物的名字,單從前幾集的內容,並不能有效的進行預測。但如果我們看了后幾集的內容,可能就能更加有效的進行預測。雙向RNN也是基於這種思想,不僅從前往后(如下圖黃色實箭頭)保留該詞前面的詞的重要信息,而且從后往前(如下圖黃色虛箭頭)去保留該詞后面的詞的重要信息,然后基於這些重要信息進行預測該詞。雙向RNN模型如下:
用公式表示雙向RNN過程如下:
另外,雙向RNN需要保存兩個方向的權重矩陣,所以需要的內存約為RNN的兩倍。