簡介
LSTM(Long short-term memory,長短期記憶)是一種特殊的RNN,主要是為了解決長序列訓練過程中的梯度消失問題。以下先從RNN介紹。
簡說RNN
RNN(Recurrent Neural Network,循環神經網絡)是一種處理序列數據的神經網絡。下圖是它的結構:
從上圖可以看出,RNN循環獲取輸入序列,並保存上一次輸入的計算結果,與當前輸入進行計算后,將計算結果輸出並保存當前的計算結果,這樣不斷循環輸入並計算,即可獲取上文信息。
RNN內部網絡如下圖所示,從圖中可以看出,在神經元內部的計算過程:先將上一個神經元細胞的輸出ht-1與當前狀態下神經元細胞的輸入xt拼接后進行tan計算。
注:輸出的ht-1(下圖中的紫色圓圈)通常是將ht-1輸入到一個線性層(主要是進行維度映射),然后使用softmax進行分類得到需要的數據。具體的計算方式要看模型的使用方式。
RNN優點:它能處理序列數據,並且有記憶能力,能夠利用上文信息。
RNN缺點:
- 梯度消失:對於獲取長距離依賴的效果不是很好(即如果上文信息離當前輸入距離太遠的話,理論上它是能夠記得上文信息,但是事實上並不是這樣,所以它並不能很好地處理長距離依賴問題)
- 梯度爆炸
- RNN較難訓練
解決方法:lstm可以解決梯度消失問題;梯度爆炸問題需要使用梯度裁剪來做(比如,可以設置梯度范圍為[-0.5,0.5]之間,如果梯度值為1.8,可以取其四分之一變為0.425即符合要求,我們知道梯度是一個多維空間中的向量,如果將梯度的長度進行裁剪並不會改變其方向,因此梯度仍然是會按照函數下降的方向前行,最終依然會達到控制loss的目的)
注:長距離依賴處理效果不佳的原因是使用tanh或者relu作為激活函數。(如果是sigmoid函數則不會)
LSTM結構
LSTM也是一種RNN,因此它也是一種循環結構,不同的是RNN神經元內部只用tan層進行計算,而LSTM是有4個全連接層進行計算的,LSTM的內部結構如下圖所示。
上圖中符號的含義如下圖所示,黃色方框類似於CNN中的激活函數操作,粉色圓圈表示點操作,單箭頭表示數據流向,下圖中第四個符號表示兩個向量的連接操作,第五個符號表示向量的拷貝操作,且上圖中的σ表示sigmoid層(該層的輸出時0-1的值,0表示不能通過,1表示能通過)。
現在來描述LSTM的內部操作,具體內容如下圖所示:
LSTM的核心是細胞狀態——最上層的橫穿整個細胞的水平線,它通過門來控制信息的增加或者刪除。
那么什么是門呢?門是一種用來選擇信息通過與否的方式,它由一個sigmoid層和點乘操作組成。LSTM共有三個門,分別是遺忘門,輸入門和輸出門,具體內容如下所述:
(1)遺忘門:遺忘門決定丟棄哪些信息,輸入是上一個神經元細胞的計算結果ht-1以及當前的輸入向量xt,二者聯接並通過遺忘門后(sigmoid會決定哪些信息留下,哪些信息丟棄),會生成一個0-1向量Γft(維度與上一個神經元細胞的輸出向量Ct-1相同),Γft與Ct-1進行點乘操作后,就會獲取上一個神經元細胞經過計算后保留的信息。
(2)輸入門:表示要保存的信息或者待更新的信息,如上圖所示是ht-1與xt的連接向量,經過sigmoid層后得到的結果Γit,這就是輸入門的輸出結果了。
但是接下來我們要計算該神經元細胞的輸出結果,即新細胞的更新狀態:Ct,Ct = Ct-1· Γft + Γit · ~ct(其中~ct = tanh(ht-1,xt)),文字描述是:輸入門的計算結果點乘 ht-1與xt的連接向量經過tanh層計算的結果后,再與上一個神經元細胞經過計算后保留的信息進行相加,則是最終要輸出的Ct。
(3)輸出門:輸出門決定當前神經原細胞輸出的隱向量ht,ht與Ct不同,ht要稍微復雜一點,它是Ct進過tanh計算后與輸出門的計算結果進行點乘操作后的結果,用公式描述是:ht = tanh(ct) · Γot
LSTM具體實現步驟[5]
1、首先,輸入上一個神經元細胞輸出的隱藏層向量和當前神經元細胞的輸入,並將其連接起來。
2、將步驟1中的結果傳入遺忘門中,該層將刪除不相關的信息。
4、一個備選層將用步驟1中的結果創建,這一層將保存可能的會加入細胞狀態的值或者說信息。
3、將步驟1中的結果傳入輸入門中,這一層決定步驟4的備選層中哪些信息應該加入到細胞狀態中去。
5、步驟2、3、4計算結束后,用這三個步驟計算后的向量和上一個神經元細胞傳出的細胞狀態向量來更新當前細胞的細胞狀態。
6、結果就被計算完了。
7、將結果和新的細胞狀態進行點乘則是當前細胞狀態的隱向量。
LSTM如何避免梯度消失與梯度爆炸
RNN中的梯度消失/爆炸與CNN中的含義不同,CNN中不同的層有不同的參數,每個參數都有自己的梯度;而RNN中同樣的權重在各個時間步中共享,所以最終的梯度等於各個時間步的梯度和。因此,RNN中的梯度不會消失,它只會遺忘遠距離的依賴關系,而被近距離的梯度所主導。但是LSTM中的梯度傳播有很多條路徑,最主要的一條是當前細胞的狀態更新這一過程,該過程中只有逐元素的相乘和相加操作,梯度流最穩定,因此基本不會發生梯度消失或者梯度爆炸;但是其他的傳播路徑依然有梯度消失或者爆炸風險,而最終的梯度計算是各個梯度路徑的和,因此LSTM仍然有梯度消失或者爆炸的風險,只是這個風險被大幅降低了。
LSTM變種-GRU
GRU是LSTM的變種,它也是一種RNN,因此是循環結構,相比LSTM而言,它的計算要簡單一些,計算量也降低,但是二者的效果卻不能一概而論,需要針對不同的case進行嘗試才能知道哪一個模型效果更好。GRU使用隱向量進行信息交換(LSTM使用細胞狀態),它有2個門:重置門和更新門。
如上圖所示,現分別介紹兩個門:
- 重置門:用來決定需要丟棄哪些上一個神經元細胞的信息,它的計算過程是將Ct-1與當前輸入向量xt進行連接后,輸入sigmoid層進行計算,結果為S1,再將S1與Ct-1進行點乘計算,則結果為保存的上個神經元細胞信息,用C’t-1表示。
公式表示為:C’t-1 = Ct-1 · S1,S1 = sigmoid(concat(Ct-1,Xt))
- 更新門:更新門類似於LSTM的遺忘門和輸入門,它決定哪些信息會丟棄,以及哪些新信息會增加。
總結
LSTM優點:LSTM降低了梯度消失或者梯度爆炸的風險,並且比RNN具有更強的長距離依賴能力。
LSTM缺點:
- LSTM處理長距離依賴的能力依然不夠,因此Transformer橫空出世,它具有比LSTM更強的長距離依賴處理能力。
- 它的計算很費時。每個細胞中都有4個全連接層(MLP),因此如果LSTM的時間跨度很大的話,計算量會很大也很費時。
注:LSTM+CRF做ner時,LSTM 只能通過輸入判斷輸出,但是 CRF 可以通過學習轉移矩陣,看前后的輸出來判斷當前的輸出。這樣就能學到一些規律(比如“O 后面不能直接接 I”“B-brand 后面不可能接 I-color”),這些規律在有時會起到至關重要的作用
參考資料
[1] https://zhuanlan.zhihu.com/p/32085405
[2] https://www.jianshu.com/p/95d5c461924c
[3] https://www.zhihu.com/question/34878706
[4] https://r2rt.com/written-memories-understanding-deriving-and-extending-the-lstm.html(待學習)