看過昨天的文章的大家應該對 LSTM 有了一定的了解,所以今天要更進一步的看看以 LSTM 為基礎而產生的雙向長短記憶網路 BiLSTM。
開始之前,我們簡單複習一下 LSTM。LSTM 是 RNN 的一種。因為其可以接受序列資料、多個輸入、有記憶這些特點,非常適合用來處理文本資料。而 BiLSTM 名稱中的 Bi-directional 其實就道盡了它的特點,它是由前向 LSTM 和後向 LSTM 组合而成的「雙向」LSTM。也就是說,在一個序列的輸入中,BiLSTM 能夠同時編碼由前至後的訊息和由後至前的訊息,如下圖所示。這種能力在文本或情緒的分析時是非常有用的。假設有個句子是:「今天晚上的_____很好聽,令人回味無窮。」若是只從前向推測,可能的候選就非常多,有晚餐、聚會、音樂會、月亮......然而,若將後向的編碼考慮進來,在以上的選項中就只有「音樂會」是最有可能的,顯而易見,範圍縮小了許多。
看完圖示後發現了嗎?其實 BiLSTM 就是串接兩個 LSTM 的神經網路,一串從前向後,一串從後向前。 每一個輸入的字 Embedding 後的結果會分別傳遞給兩串 LSTM。這兩串 LSTM 運算的結果再通過下圖公式的算法得到兩串編碼的結果。
考慮到後向的編碼會如下圖所呈現之方式
各層計算公式如下:
就是說,正向計算時,st 與 st-1 有關,反向計算時 s't 與 s't+1 有關,最後在綜合二者的結果,成為輸出門之輸出。所以通過 BiLSTM 較能捕捉到前後文,甚至是同一句話中每個詞之間的語意依賴。
因為 BiLSTM 其實和 LSTM 差不多,而且網路上許多大神做出來的 projects 和 介紹都非常詳盡,所以這篇就不帶實作了。在這裡推薦幾個不錯的 Python 實作 BiLSTM 網站與 coding 內容,大家有興趣就參考一下吧!
大家明天見~