双向RNN原理

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章