一、什么是循環神經網絡:
循環神經網絡(Rerrent Neural Network, RNN),RNN是神經網絡的一種,類似的還有深度神經網絡DNN,卷積神經網絡CNN,生成對抗網絡GAN,等等。
RNN的特點,RNN對具有序列特性的數據非常有效,它能挖掘數據中的時序信息以及語義信息,利用了RNN的這種能力,使深度學習模型在解決語音識別、語言模型、機器翻譯以及時序分析等NLP領域的問題時有所突破。
什么是序列特性,就是符合時間順序,邏輯順序,或者其他順序就叫序列特性,舉幾個例子:
- 拿人類的某句話來說,也就是人類的自然語言,是不是符合某個邏輯或規則的字詞拼湊排列起來的,這就是符合序列特性
- 語音,我們發出的聲音,每一幀每一幀的銜接起來,才湊成了我們聽到的話,這也具有序列特性
- 股票,隨着時間的推移,會產生具有順序的一系列數字,這些數字也是具有序列特性
- 再比如,用戶網購某個商品,在下單前的一系列瀏覽、關注、架構等動作也是序列化的
1 傳統的RNN

傳統的RNN也即BasicRNNcell單元。內部的運算過程為,(t-1)時刻的隱層輸出與w矩陣相乘,與t時刻的輸入乘以u之后的值進行相加,然后經過一個非線性變化(tanh或Relu),然后以此方式傳遞給下一個時刻。
傳統的RNN每一步的隱藏單元只是執行一個簡單的tanh或者Relu操作。
在RNN里面,如果網絡層次太深的話,此時會產生梯度消失或梯度下降問題。
為什么呢?首先想一個問題,RNN什么時候網絡層次比較深呢?
RNN如果有多個時刻輸入的時候,網絡層次比較深,此時反向傳播的路徑比較長。反向傳播是根據鏈式法則,如果開始的梯度小於1的話,則最后時刻的梯度幾乎為0,則可理解為梯度消失;反之,若開始的梯度大於1的話,則最后時刻的梯度則非常大,可理解為梯度爆炸。這種情況下,開始應用Relu激活函數。
為什么應用Relu函數呢?
Relu函數在小於0時的梯度為0,大於0的時候梯度為1。使用Relu的好處:1 梯度容易求解;2 不會產生梯度消失或梯度爆炸。
2 LSTM(long short term memory)
優點:
可以在解決梯度消失和梯度爆炸的問題,還可以從語料中學習到長期依賴關系。
圖中可以看出,t時刻有兩個輸出,上面代表長期輸出,下面代表短期輸出,用短期的輸出與矩陣v運算得到t時刻的輸出。
Tanh和sigmoid激活函數的優點?
首先tanh激活函數的范圍是(-1,1),負的部分可以減一些信息,也即來控制忘記還是記憶信息,而sigmoid激活函數是用來表示記住多少的信息。
LSTM內部結構詳解
LSTM中每個模塊由4層結構。

LSTM的關鍵是細胞狀態 ,一條水平線貫穿於圖形的上方,這條線上只有些少量的線性操作,信息在上面流傳很容易保持。(該層是長時記憶傳播)
第一層

第一層是個忘記層,決定細胞狀態中丟棄什么信息。把 和
拼接起來,傳給一個sigmoid函數,該函數輸出0到1之間的值,這個值乘到細胞狀態
上去。sigmoid函數的輸出值直接決定了狀態信息保留多少。比如當我們要預測下一個詞是什么時,細胞狀態可能包含當前主語的性別,因此正確的代詞可以被選擇出來。當我們看到新的主語,我們希望忘記舊的主語。
第二層

上一步的細胞狀態 已經被忘記了一部分,接下來本步應該把哪些信息新加到細胞狀態中呢?這里又包含2層:一個tanh層用來產生更新值的候選項
,tanh的輸出在[-1,1]上,說明細胞狀態在某些維度上需要加強,在某些維度上需要減弱;還有一個sigmoid層(輸入門層),它的輸出值要乘到tanh層的輸出上,起到一個縮放的作用,極端情況下sigmoid輸出0說明相應維度上的細胞狀態不需要更新。在那個預測下一個詞的例子中,我們希望增加新的主語的性別到細胞狀態中,來替代舊的需要忘記的主語。
第三層

現在可以讓舊的細胞狀態 與
(f是forget忘記門的意思)相乘來丟棄一部分信息,然后再加個需要更新的部分
(i是input輸入門的意思),這就生成了新的細胞狀態
。
第四層

最后該決定輸出什么了。輸出值跟細胞狀態有關,把 輸給一個tanh函數得到輸出值的候選項。候選項中的哪些部分最終會被輸出由一個sigmoid層來決定。在那個預測下一個詞的例子中,如果細胞狀態告訴我們當前代詞是第三人稱,那我們就可以預測下一詞可能是一個第三人稱的動詞。
3 GRU

GRU(Gated Recurrent Unit)是LSTM最流行的一個變體,比LSTM模型要簡單。
4 LSTM和GRU區別
1. 對memory 的控制
LSTM: 用output gate 控制,傳輸給下一個unit
GRU:直接傳遞給下一個unit,不做任何控制
2. input gate 和reset gate 作用位置不同
LSTM: 計算new memory c^(t)c^(t)時 不對上一時刻的信息做任何控制,而是用forget gate 獨立的實現這一點
GRU: 計算new memory h^(t)h^(t) 時利用reset gate 對上一時刻的信息 進行控制。
3. 相似
最大的相似之處就是, 在從t 到 t-1 的更新時都引入了加法。
這個加法的好處在於能防止梯度彌散,因此LSTM和GRU都比一般的RNN效果更好。
2.RNN,LSTM,GRU的優缺點
2.1 為什么LSTM能解決RNN不能長期依賴的問題
(1)RNN的梯度消失問題導致不能“長期依賴”
RNN中的梯度消失不是指損失對參數的總梯度消失了,而是RNN中對較遠時間步的梯度消失了。RNN中反向傳播使用的是back propagation through time(BPTT)方法,損失loss對參數W的梯度等於loss在各時間步對w求導之和。用公式表示就是:
上式中 計算較復雜,根據復合函數求導方式連續求導。
是當前隱狀態對上一隱狀態求偏導。
假設某一時間步j距離t時間步相差了(t-j)時刻。則
如果t-j很大,也就是j距離t時間步很遠,當 時,,會產生梯度爆炸問題,當
時,會產生梯度消失問題。而t-j很小時,也就是j是t的短期依賴,則不存在梯度消失/梯度爆炸的問題。一般會使用梯度裁剪解決梯度爆炸問題。所以主要分析梯度消失問題。
loss對時間步j的梯度值反映了時間步j對最終輸出 的影響程度。就是j對最終輸出
的影響程度越大,則loss對時間步j的梯度值也就越大。loss對時間步j的梯度值趨於0,就說明了j對最終輸出
幾乎沒影響。
綜上:距離時間步t較遠的j的梯度會消失,說明j對最終輸出 沒影響。也就是說RNN中不能長期依賴。
(2)LSTM如何解決梯度消失
LSTM設計的初衷就是讓當前記憶單元對上一記憶單元的偏導為常數。如在1997年最初版本的LSTM,記憶細胞更新公式為:
后來為了避免記憶細胞無線增長,引入了“遺忘門”。更新公式為:
此時連續偏導的值為:
雖然 是一個[0,1]區間的數值,不在滿足當前記憶單元對上一記憶單元的偏導為常數。但通常會給遺忘門設置一個很大的偏置項,使得遺忘門在多數情況下是關閉的,只有在少數情況下開啟。回顧下遺忘門的公式,這里我們加上了偏置b。
趨向於1時,遺忘門關閉,趨向於0,時,遺忘門打開。通過設置大的偏置項,使得大多數情況下遺忘門的值趨於1。也就緩解了由於小數連乘導致的梯度消失問題。
2.2 相較於LSTM,GRU的優勢
GRU的參數量少,減少過擬合的風險
LSTM的參數量是Navie RNN的4倍(看公式),參數量過多就會存在過擬合的風險,GRU只使用兩個門控開關,達到了和LSTM接近的結果。其參數量是Navie RNN的三倍
鏈接:https://zhuanlan.zhihu.com/p/149819433
鏈接:https://zhuanlan.zhihu.com/p/123211148
很好的講解GRU和LSTM的文章:
GRU:https://zhuanlan.zhihu.com/p/32481747
LSTM:https://zhuanlan.zhihu.com/p/32085405