1. 程式人生 > >迴圈神經網路RNN及其變種LSTM

迴圈神經網路RNN及其變種LSTM

首先說一句,對於理解RNN這個概念,上策是先從數學角度理解,然後再畫圖理解。在這個前提下,一切上來就放圖的書、論文、教程都是耍流氓。
迴圈神經網路是一種神經網路,那數學上神經網路是什麼?是函式。普通神經網路可以抽象成輸入層,隱層,輸出層。隱層不管內部有幾層,總體都可以抽象成“一個”隱層。隱層是一個函式,以輸入層的資料作為輸入,通過計算得到輸出。輸出層是一個函式,以隱層的輸出作為輸入,通過計算得到最終該神經網路的輸出。一個神經網路是一個函式,該函式是隱層和輸出層的複合函式。
RNN的特殊之處在於,它隱層的輸入除了輸出層,還有上一個時間點(上一次更新)的隱層的輸出。嚴格地,在每個時間的點t,隱層h

t都通過下式更新:

ht=f(ht1,xt)
其中,f是一個非線性啟用函式,簡單的f可以是sigmoid函式,複雜的f可以是一個long short-term memory(LSTM)單元。f其實還有超引數Wb,式子裡沒表示出來,我們訓練的就是超引數。RNN的輸出層就是普通的輸出層。也就是,在每一個時間點,RNN輸入一次,然後輸出一次。一系列時間點後,總的看來RNN就好像輸入一個序列,然後輸出一個序列。這個隱層可以由一個函式構成(一個節點),也可以由許多函式複合而成(n個節點構成的網)。不管怎樣,組成隱層的每一個函式的輸入,都是上一個時間點自身的輸出和當前時間點的輸入層。
接下來進入畫圖環節。我們在別的資料上經常看到的那些奇形怪狀的彎彎曲曲的歪歪扭扭的圖是怎麼回事呢?其實如果畫成立體圖就顯而易見了。我們把RNN想象成一張網,隨著時間點的增加,這張網沿著它的法線進行平移,其中隱層之間有箭頭連線,由上一個隱層指向下一個隱層,圖就是這麼畫出來的。我們運用的時候,RNN就是一張網,而不是一摞網。一摞網是我們模擬計算過程時想象出來的。
到這裡RNN的本質就說完了,細節我就不說了。接下來輪到LSTM。當我們說LSTM的時候,一般指的是運用LSTM思想的迴圈神經網路,而為了有助理解,不產生混淆,在這裡我說的LSTM指的是之前提到的LSTM 單元。
LSTM單元雖然名字叫單元,但它就是個函式。這個函式以上一個隱層和當前輸入層作為輸入,它的輸出就是當前隱層的輸出。LSTM單元是這樣運算的:
gt=ϕ(Wgxxt+Wghht1+bg)
it=σ(Wixxt+Wihht1+bi)ft=σ(Wfxxt+Wfhht1+bf)ot=σ(Woxxt+Wohht1+bo)st=gtit+st1ftht=ϕ(st)ot

不要被這些名字所迷惑,反正就是通過一系列輔助函式進行運算,最後的ht就是當前隱藏層的輸出。
到這裡LSTM的數學表示也說完了,很簡潔,還看什麼圖呢?
至於RNN的訓練問題:梯度消失和梯度爆炸,以及LSTM從哪方面對RNN進行改進,就要自己看了。多看著名論文,少看部落格。

參考資料:
《A Critical Review of Recurrent Neural Networks for Sequential Learning》
《Learning Phrase Representations using RNN Encoder–Decoder
for Statistical Machine Translation》