文章目錄
- 1.簡單介紹
- 2.網絡結構
- 3.應對梯度消失
1.簡單介紹
循環神經網絡(RNN,Recurrent Neural Network)是一類用于處理序列數據的神經網絡。與傳統網絡相比,變化不是特別大,不如CNN的變化那么大。
為什么要有循環神經網絡:
傳統神經網絡:輸入一個數據處理一個數據,互不干擾
但是有些數據是連貫性的,比如一個句子(我今天早上8點醒的),就不可能將每一個字或一些詞單獨處理,而是在處理這個字的同時還要考慮到與前面字的關系,因此循環神經網絡就可以解決這一問題。
圖1: 傳統神經網絡
2.網絡結構
RNN 不是剛性地記憶所有固定長度的序列,而是通過隱藏狀態來存儲之前時間步的信息。
也就是說在循環神經網絡的隱藏層中,輸入的數據走向有兩個:輸出和等待,等待是指等待第二個數據的到來并對第二個數據的隱藏特征產生影響。
圖2: 循環神經網絡
圖3: a)等號左:整體網絡;b)等號右:整體網絡的分解
圖4: RNN結構推導式
循環神經網絡的輸入是序列數據,每個訓練樣本是一個時間序列,包含多個相同維度的向量。網絡的參數如何通過訓練確定?這里就要使用解決 RNN 訓練問題的 BPTT(Back Propagation Through Time)算法。
右側為計算時便于理解記憶而產生的結構。簡單說,x 為輸入層,o 為輸出層,s 為隱含層,而 t 指第幾次的計算;V、W、U為權重(在 RNN 中,每一層都共享參數U、V、W,降低了網絡中需要學習的參數,提高學習效率。 xt 表示 t 時刻的輸入, St表示 t 時刻的隱狀態, Ot表示 t 時刻的輸出。
-
輸入單元(input units): { x 0 , ? ? ? , x t ? 1 , x t , x t + 1 , ? ? ? } \{x_{0}, \cdot \cdot \cdot, x_{t-1}, x_{t}, x_{t+1}, \cdot \cdot \cdot\} {x0?,???,xt?1?,xt?,xt+1?,???}
-
隱藏單元(hidden units): { s 0 , ? ? ? , s t ? 1 , s t , s t + 1 , ? ? ? } \{s_{0}, \cdot \cdot \cdot, s_{t-1}, s_{t}, s_{t+1}, \cdot \cdot \cdot\} {s0?,???,st?1?,st?,st+1?,???}
-
輸出單元(output units): { o 0 , ? ? ? , o t ? 1 , o t , o t + 1 , ? ? ? } \{o_{0}, \cdot \cdot \cdot, o_{t-1}, o_{t}, o_{t+1}, \cdot \cdot \cdot\} {o0?,???,ot?1?,ot?,ot+1?,???}
-
輸入層: x t x_{t} xt? 表示時刻 t t t 的輸入。
第 t 次的中間的隱含層狀態為:
s t = f ( U ? x t + W ? s t ? 1 ) s_{t} = f(U \cdot x_{t} + W \cdot s_{t-1}) st?=f(U?xt?+W?st?1?)
- f f f 是非線性激活函數,比如 t a n h tanh tanh。
輸出層:
o t = s o f t m a x ( V ? s t ) o_{t} = softmax(V \cdot s_{t}) ot?=softmax(V?st?)
- softmax 函數是歸一化的指數函數,使每個元素的范圍都在 0 到 1 之間 ,并且所有元素的和為 1。
反向傳播
拿 E 3 E_3 E3?舉例,當反向傳播時,不僅會傳遞回隱層 s 3 s_3 s3?,還會向輸入層 x 3 x_3 x3?進行傳遞,只要是反向有參數的地方就會更新。
3.應對梯度消失
在進行反向傳播時,循環神經網絡也面臨梯度消失或者梯度爆炸問題,這種問題表現在時間軸上。如果輸入序列的長度很長,人們很難進行有效的參數更新。比如:我今天早上8點起床,中午吃了粘豆包,晚上開車去了電影院。我去電影院這個動作和早上中午的并沒有很大關系,但是RNN在計算時是沒有取舍的。
通常來說梯度爆炸更容易處理一些。梯度爆炸時我們可以設置一個梯度閾值,當梯度超過這個閾值的時候可以直接截取。
應對梯度消失問題的解決方案:
- 合理地初始化權重值。初始化權重,使每個神經元盡可能不要取極大或極小值,以躲開梯度消失的區域。
- 使用激活函數 ReLu,代替 sigmoid 和 tanh。
- 使用其他結構的 RNNs,比如長短時記憶網絡(LSTM)和 門控循環單元 (GRU),這是最流行的做法。