来源:Coursera吴恩达深度学习课程
目前为止,我们已经了解了大部分RNN模型的关键的构件(key building blocks),还有两个方法(two more ideas)可以让你构建更好的模型,①双向RNN模型(bidirectional RNN),它可以让你在序列的某点处不仅可以获取之前的信息,还可以获取未来的信息。②第二个就是深层的RNN(deep RNN)。我们现在先从双向RNN开始吧。
回顾命名实体识别的例子,在判断第三个单词Teddy是不是人名的一部分时,我们只看了前三个单词,除了这些信息我们还需要更多的信息。因为根据前3个单词无法判断他们说的是Teddy熊,还是前美国总统Teddy Roosevelt,所以这是一个非双向的或者说只有前向的RNN。不管这些单元(上图方形区域)是标准的RNN块,还是GRU单元或者是LSTM单元,只要这些构件都是只有前向的。
那么一个双向的RNN是如何解决这个问题的?下面解释双向RNN的工作原理。
(备注:还是这个问题,不知道为什么右上角的符号就是显示不出来,这篇文章都会()代替,有时间会解决这个bug,望谅解。)
如上图,为了简化,用一个只有4个单词(4个输入,x^(1)到x^(4))的句子,这个网络会有一个前向的循环单元(紫色标记),在这上面加个向右的箭头(right arrow)来表示前向的循环单元(forward recurrent component),然后连接起来。这四个循环单元都有一个当前输入x输入进去,得到预测的y帽。
如上图,我们增加一个反向循环层(绿色标记),左箭头代表反向连接。这样,这个网络就构成了一个无环图(acyclic graph)。给定一个输入序列x^(1)到x^(4),序列先计算前向a^(1)(右箭头),然后计算a^(2)(右箭头)、a^(3)(右箭头)和a^(4)(右箭头)。然后反向序列从a^(4)(左箭头)开始计算,反向进行,计算反向是a^(3)(左箭头)。你计算的是网络激活值,这不是反向而是前向的传播,而图中这个前向传播一部分计算是从左到右,一部分计算是从右到左。可以用这些激活值计算反向的a^(2)(左箭头),然后是反向的a^(1)(左箭头),把所有这些激活值都计算完了就可以计算预测结果了。
为了预测结果,应用激活函数有公式:
具体看一个例子:
如上图黄色标记,比如你要观察时间3这里的预测结果,信息从x^(1)过来,流经前向的a^(1)(右箭头)和a^(2)(右箭头),到前向的a^(3)(右箭头)再到y^(3),这条路径把输入信息x^(1)到x^(3)都考虑在内。而x^(4)的信息会流到反向的a^(4)(左箭头),到反向a^(3)(左箭头),再到y^(3),这条路径使用了输入信息x^(4)。这样使得时间3的预测结果不仅输入了过去的信息,还有现在的信息,同时涉及了前向和反向的传播信息以及未来的信息。给定一个句子"He said Teddy Roosevelt..."来预测Teddy是不是人名的一部分,你需要同时考虑过去和未来的信息。
这就是双向循环神经网络(bidirectional recurrent neural network),并且这些基本单元不仅仅是标准RNN单元,也可以是GRU单元或者LSTM单元。事实上,很多的NLP问题,对于大量有自然语言处理问题的文本,有LSTM单元的双向RNN模型是用的最多的。所以如果有NLP问题,并且文本句子都是完整的,首先需要标定这些句子,一个有LSTM单元的双向RNN模型,有前向和反向过程是一个不错的首选。
以上就是双向RNN的内容,这个改进的方法不仅能用于基本的RNN结构,也能用于GRU和LSTM。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。