1. 引入
我們之前已經瞭解了RNN中的GRU[2]和LSTM[3]。
怎麼樣才能進一步優化RNN這樣的模型呢?就是使用雙向RNN,它能使得我們在序列的某點處,不僅獲取之前的信息,還能獲取將來的信息。
將來的信息是什麼意思呢?爲什麼根據之前的信息還不足夠網絡做決策?
我們看下面的一個例子:用傳統RNN做NER,判定某個單詞是否爲人名。
例子中給出的兩句話,第一句話中的Teddy不是人名(是泰迪熊玩具),第二句話中的纔是人名。
我們可以看到,要判斷Teddy是否爲人名,如果僅僅根據它之前的信息(“He said”),是難以進行判斷的。
這就是單向RNN的困境。不僅僅是RNN,單向的GRU/LSTM都存在這樣的問題。
2. 雙向RNN的原理
那雙向RNN是如何解決這個問題的呢?
例如,輸入一個句子,有四個單詞,每個單詞用x表示,雙向RNN如下圖所示。
其中紫色部分的框圖和連接線表示原始的單向RNN,他們依次從左向右連接。
綠色的部分,表示反向連接,他們依次反向向前連接。
這個網絡構成了一個無環圖。給定一個輸入序列(x<1>,…,x<4>),這個網絡首先進行前向計算(正向),依次得到正向a<1>, a<2>, a<3>, a<4>的值;然後進行反向計算,依次得到反向a<4>, a<3>, a<2>, a<1>的值。
這樣,給定一個句子:“He said,Teddy Roosevelt”,要判斷Teddy是否爲人名,這個雙向網絡就會考慮之前的信息“He said”,也會考慮之後的信息“Roosevelt”,來綜合做判斷。
這就是雙向RNN。上圖中的基本單元,可以爲RNN單元,也可以是GRU單元,或者是LSTM單元。
3. 雙向網絡
根據上面的原理,我們可以有很多種雙向序列模型:
- 雙向RNN
- 雙向GRU
- 雙向LSTM
雙向序列模型的優點,是可以考慮整個句子的信息,即使在句子中間,也可以綜合考慮過去的信息和將來的信息。
當然,它也有缺點:
- 需要完整數據的序列,你才能預測任意位置。
舉個例子,比如語音識別系統中,這就要求你必須等待一個人說完整句話,才能做出識別,這樣就有一個比較長的等待時間。
但是對於很多NLP的應用,你可以獲取完整的整個句子,那這個標準的雙向RNN算法就很高效。
4. 參考
- [1]. Andrew Ng Sequence Models video
- [2]. https://blog.csdn.net/ybdesire/article/details/105374720
- [3]. https://blog.csdn.net/ybdesire/article/details/105621683