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