我們昨天提到,RNN 雖然是一個可以很好處理序列資料的神經網路,它能夠將前面所學到的部分資訊一步一步向下傳遞下去,但是隨著輸入的資料變多變長,就有可能引發梯度消失跟梯度爆炸的問題,怎麼辦呢?
這個時候我們就可以採用一種特殊的 RNN 結構,我們將它稱呼為長短期記憶網路 LSTM (Long short-term memory network)。而相較於傳統的普通 RNN ,LSTM 改善了以前 RNN 的一些問題,並且能夠在更長的序列中有更好的表現。
相較於 RNN 只有一個傳遞狀態 ,LSTM 則有兩個傳遞狀態,分別是 和 。
(RNN 的 相當於 LSTM 的 )
下圖是個簡單的 LSTM 結構:
公式:
看不懂嗎?沒關係我也看不懂
反正我們只要知道,LSTM 會透過三個控制閥(輸入閥、遺忘閥、輸出閥)來決定將什麼資料保存(記憶)下來,而什麼記憶又該捨棄(遺忘)。
首先 遺忘閘門會先統整 與 ,也就是與前一個細胞狀態 進行元素相乘運算,決定細胞狀態需遺忘或保留哪些資訊; 輸入閘門 和 細胞候選單位,將共同決定現有細胞狀態中,哪部份資訊需要進行更新,再使用相加運算更新至細胞狀態中;最後 輸出閘門,使用相加運算結合細胞狀態,並決定哪些資訊該輸出至下一階段。
簡單來說就是,LSTM 能透過閥門來控制傳輸狀態,記住重要的資訊並忘記不重要的訊息。但也因為引入了很多內容導致參數變多,訓練難度提升了不少。然而,儘管 LSTM 的架構能夠成功避免輸入過多訓練資料而產生的梯度消失和梯度爆炸問題,但是其架構本身的設計使得它在處理序列資料時只能先處理完第一個才可以處理第二個,在面對龐大的資料時權重更新速度其實相當緩慢(更別提雙向架構的Bi-LSTM了。)
此外,還記得我說過 RNN 的結構相當仰賴前面資訊,因而可能導致的長期依賴(Long-Term Dependencies)問題嗎?雖然透過 LSTM 的控制閥能夠一定程度的避免該問題發生,但是如果我們現在要預測的相關訊息和當前預測位置之間的間隔非常非常遙遠,難免還是會受到影響。
有沒有什麼方法,可以在處理序列資料時不必先處理完第一個才能處理第二個來降低計算時間,預測結果也不會因為和相關訊息的位置過於遙遠而受到影響呢?之後就讓我們來聊聊 Transformer 和自注意力機制(self-attention)吧!