iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 15
1
AI & Machine Learning

以100張圖理解 Neural Network -- 觀念與實踐系列 第 15

Day 15:『長短期記憶網路』(Long Short Term Memory Network, LSTM)

RNN 的缺點

上篇介紹的RNN,它能夠額外考慮前面字句,來預測當前的字句,聽起來似乎已符合語言的特性了。但是,距離當前單字越遠的字句影響力會遞減,因為,下面的公式 h0 對 ht 的影響力為 w 的 t 次方,通常,w 會小於 1,因為 w 大於1,則表示距離越遠的字句影響力會遠大於距離近的字句,這不太合理,所以,w 應會小於 1,當 t 很大時,w 的 t 次方會趨近於0,也就是說,段落或句子很長,越前面的字詞會被遺忘,這種現象稱之為『梯度消失』(Vanishing Gradient),它忽略了人類對特有事物是有記憶的能力,因此,有學者(Hochreiter & Schmidhuber) 在 1997 年提出『長短期記憶網路』(Long Short Term Memory Network, LSTM) ,透過記憶功能來增加『長期依賴』(long-term dependency)的問題。
https://ithelp.ithome.com.tw/upload/images/20171219/20001976bhDFoAT7RF.jpg
圖. RNN 模型,圖片來源 Ashing's Blog_ 深度學習(3)--循環神經網絡(RNN, Recurrent Neural Networks)

長短期記憶網路(Long Short Term Memory Network, LSTM)

LSTM 使用記憶來加強當前的決策,利用三個控制閥(Gate)來決定記憶的儲存與使用,看說明時請隨時參考下圖:

  1. 除了預測的輸出外,增加一個記憶分支,隨著時間更新,將當前記憶以 Ct 符號表示,透過『遺忘閥』(Forget Gate)及『輸入閥』(Input Gate),來決定是否更新記憶。
  2. 遺忘閥(Forget Gate),以 ft 表示,如果當前的字句是新主題或以前面字句相反的詞,那麼,之前的字句就會這個閥過濾掉,反之,可能就會被繼續保留到記憶中,這個閥通常是Sigmoid函數(請參閱第三篇『Day 03:Neural Network 的深入探討』)說明,因為它是二元分類的函數,表示過往的資訊是否被遺忘或記憶。舉例來說,『他生於法國,....,但是他英語講得非常流利』,如果解析到『英語』時,跟『他生於法國』已經沒甚麼關聯了,這時就可以把之前的記憶遺忘了。如何判斷是新主題或以前面字句相反的詞呢? 各位如果還記得,在『自然語言處理(NLP) 概念介紹』(https://ithelp.ithome.com.tw/articles/10193224),我們曾說過,所有字詞都會被轉為向量,然後,計算兩個向量的相似性(cosine),如接近1,就表示兩單字的意義相似,反之,接近-1,就表示兩單字意義相反。
  3. 輸入閥(Input Gate,以it表示):決定當前的輸入(Input)及新產生的記憶單元(Memory Cell Candidate)是否加入長期記憶(Long Term Memory)中,這個閥也是Sigmoid函數,表示要加入與否。
  4. 輸出閥(Output Gate):決定當前的字句是否加到輸出(Output),這個閥也是Sigmoid函數,表示要加入與否。
  5. 最後針對長期記憶是否加到輸出(Output),通常使用tanh函數,數值會落在[-1, 1]之間,-1表移除長期記憶。
  6. 綜合三個閥,最後公式如下:
    https://ithelp.ithome.com.tw/upload/images/20171212/200019762ITxKZsyNY.jpg

https://ithelp.ithome.com.tw/upload/images/20171212/20001976yYA8YpySm2.jpg
圖. LSTM 架構,圖片來源:Evolution: from vanilla RNN to GRU & LSTMs

白話的講,上述三個閥就是多加了一個長期記憶(Long Term Memory)的變數(Ct)。舉例來說,有一段話『我在法國長大, ...., 我會講一口流利的法文』,在還沒有切換到新主題時,之前的段落(我在法國長大)都放在『長期記憶』中,作為預測下一個字句(法文)的因素之一。讀到這裡,都快變懸疑小說了,如果還不夠清楚,請參閱Understanding LSTM Networks,我已經快腦殘了,我們還是找個範例說明,會比再攪和下去,好一點吧。

實作

我們還是用『阿拉伯數字辨識』來說明LSTM函數,使用與上一篇RNN.py幾乎相同,只要將 SimpleRNN layer 改成 LSTM 即可,可自這裡下載,檔名為LSTM.py。由於,程式大同小異,就不浪費篇幅列出來了。

程式執行方式很簡單,在DOS下執行下列指令:
python LSTM.py

程式說明

準確率達96.6%,果然比 RNN 更高,跟 RNN 一樣,也有『雙向』(Bidirectional) LSTM,,Keras提供 Bidirectional() 函數實現此一功能,如下:
model.add(Bidirectional(LSTM(10)))

結論

LSTM 應用相當廣,我們下一次就來討論一個相關應用 -- 『情緒分析』(Sentiment Analysis),看看如何分析影評的正/負意見分類,這相當實用,可以應用在網路、產品調查...等。


上一篇
Day 14:循環神經網路(Recurrent Neural Network, RNN)
下一篇
Day 16:『長短期記憶網路』(LSTM) 應用 -- 情緒分析(Sentiment Analysis)
系列文
以100張圖理解 Neural Network -- 觀念與實踐31

尚未有邦友留言

立即登入留言