13.5 双向循环神经网络
双向循环神经网络(Bidirectional Recurrent Neural Network,BiRNN)是一种可以正向和反向的双向循环的神经网络。
13.5.1 单向循环神经网络的局限性
假设有下边两句话:
“我喜欢苹果的味道。”
“我喜欢苹果手机。”
这两句话里的“苹果”一个是水果,一个是品牌。如果用我们之前讲的RNN,在处理到“苹果”这个token的时候,它只有前边token的隐状态,是无法判断这里的苹果具体是指水果还是品牌。必须依赖后续的token才能判断这里苹果的含义。
13.5.2 BiRNN的结构
BiRNN的想法是创建两个RNN,一个对序列正向循环,一个是对序列反向循环,然后把对应的某个序列元素的在正向和反向循环输出的隐状态进行合并,再作为完成特定任务的普通层的输入。这个输入里就同时包含了序列元素前边和后边序列的信息。相当于它可以看到整个序列的信息来做出判断。
像上图中正向RNN在“苹果”这个时间点,输出的隐状态包含了“我喜欢苹果”的信息。反向RNN在这个时间点输出的隐状态包含了“苹果手机”的信息,将这两个隐状态向量进行拼接,再接一个普通层进行输出,就可以准确判断这里的苹果代表的是品牌名了。
我们上边讲的是RNN,对于GRU,LSTM也是一样的道理。
13.5.3 BiRNN的局限性
双向循环神经网络必须输入完整的序列进行处理。这对于NER,摘要,或者对序分类的任务都比单向RNN有优势。但是对于生成类的任务,比如我们只输入一个文章类型,让RNN来自动生成文章的内容。这时BiRNN就不适用了。因为在生成任务时,后续的序列还不知道。所以生成任务是单向任务,智能用RNN来完成。