循環神經網絡(Recurrent Neural NetWork,RNN)是一種將節點定向連接成環的人工神經網絡,其內部狀態可以展示動態時序行為。
循環神經網絡的主要用途是處理和預測序列數據。循環神經網絡最初就是為了刻畫一個序列當前的輸出與之前信息的關系。從網絡結構上來看,循環神經網絡會記憶之前的信息,並利用之前的信息影響后面節點的輸出。也就是說,循環神經網絡的隱藏層之間的節點是有連接的,隱藏層的輸入不僅包含輸入層的輸出,還包括上一時刻隱藏層的輸出。
如圖為典型的RNN結構示意圖。RNN主體結構的輸入,除了來自輸入層的xt 還有一個循環的邊來提供上一時刻的隱層狀態St。在每一時刻,RNN的模塊在讀取了Xt和St-1之后會產生新的隱藏狀態St,並產生本時刻的輸出Ot。RNN當前的狀態是由上一時刻的狀態St-1和當前的輸入Xt共同決定的。對於一個序列數據,可以將這個序列上不同時刻的數據依次傳入循環神經網絡的輸入層;而輸出既可以是對序列下一時刻的預測,也可以是對當前時刻信息的處理結果。循環神經網絡要求每一時刻都有一個輸入,但是不一定每個時刻都有輸出。
網絡在t時刻接收到輸入Xt之后,隱藏層的值是St,輸出值是Ot。St的值不僅僅取決於St,還取決於St-1。可以用下面的公式來表示。
Ot=g(V*St) 式1
St=f(U*Xt+W*St-1) 式2
式1是輸出層的計算公式,輸出層是一個全連接層,它的每個節點都和隱藏層的每個節點相連。其中V是輸出層的權重矩陣,g是激活函數。
式2是隱藏層的計算公式,它是循環層。其中U是輸入x的權重矩陣,W是上一次的值St-1作為這一次輸入的權重矩陣,f是激活函數。
由上面兩個式子可以得出,循環層和全連接層的區別就是循環層多了一個權重矩陣W。
循環神經網絡的訓練算法:
如果將RNN進行網絡展開,那么參數W、U、V是共享的,並且在使用梯度下降算法時,每一步的輸出不僅僅依賴於當前步網絡的狀態,還依賴於前面若干步網絡的狀態。采用BPTT(Back Propagation Trough Time)沿時間反向傳播算法進行訓練,步驟如下:
(1)前向計算每個神經元的輸入值
(2)反向計算每個神經元的誤差值,包括兩個方向:一個是沿時間軸的反向傳播,計算每個時刻的誤差項;另一個是將誤差項向上一層傳播。
(3)計算每個權重的梯度。
(4)用梯度下降的誤差后向傳播算法更新權重。
需要注意:理論上,RNN可以支持任意長度的序列。然而,在實際訓練過程中,如果序列過長,一方面會導致訓練時出現梯度消失和梯度爆炸的問題;另一方面,展開后的循環神經網絡會占用過大的內存。所以,實際中會規定一個最大長度,當序列長度超過規定長度后會對序列進行截斷。
根據輸入輸出的不同,RNN可以按以下情況分類。
1.1-N:一個輸入,多個輸出。例如,圖像描述:輸入的是一個圖片,輸出一個句子。音樂生成:輸入一個數值,這個數值代表一個風格,輸出一段旋律。
2.N-1:多個輸入,一個輸出。大多根據輸入的串做預測和分類。比如語義分類,評論的情感分析。
3.N-N:多個輸入,多個輸出,而且輸入輸出長度相等。比如命名實體識別,詞性標注等。
4.N-M:一般情況下,N不等於M,例如機器翻譯、文本摘要等,輸入輸出長度是不一樣的。
循環神經網絡的變種
(1)雙向循環神經網絡(BRNN)
雙向循環神經網絡的基本思想是每一個訓練序列向前和向后分別是兩個循環神經網絡,而且兩個網絡都連接着一個輸出層。這個結構給輸出層提供輸入序列中每一個點的完整的過去和未來的上下文信息。
雙向循環神經網絡由兩個獨立的循環神經網絡疊加在一起組成的,其輸出也是由這兩個循環神經網絡的輸出拼接而成。下圖為一個雙向RNN結構。
在任一時刻,輸入會同時提供給這兩個方向相反的循環神經網絡,兩個獨立的網絡獨立進行計算,各自產生該時刻的新狀態和輸出;而雙向循環神經網絡的最終輸出是這兩個單向循環神經網絡輸出的簡單拼接。兩個循環神經網絡除方向不同外,其余結構完全對稱。每一個網絡中的循環體可以自由選用任意機構,如RNN或LSTM網絡。
(2)深層循環神將網絡
深層循環神將網絡是指為了增強模型的表達能力,在網絡中設置多個循環層,將每層循環神經網絡的輸出傳給下一層進行處理。