整理并翻译自吴恩达深度学习系列视频:序列模型第一周,有所详略。
Bidirectional RNN (BRNN)
Prerequisite:
Gated Recurrent Unit(GRU)
Long Short term memory unit(LSTM)
Unidirectional RNN/Forward directional only RNN
基本的RNN结构不能获取某个预测输出之后的信息,只能根据前面的输入做判断,比如y^<3>hat{y}^{<3>}y^<3>,只能根据"He"、"said"两个输入单词做判断,而其之后的"bears"是命名实体判别中的重要依据,却不能被考虑进去。于是双向循环网络就被发明出来了。
Bidirectional RNN (BRNN)
双向循环网络不仅仅有基本循环网络的forward components,增加了反向的backward components(如图黄色部分),连接方式同forward components,不同之处在于其有单独的激活函数a,并且激活函数值传递的方式与forward components相反。请注意与反向传播做区分,这里并没有计算导数。
这构成了一个有向无环图(Acyclic graph),注意forward components和backward components是互不连接的。一般来说,来从前往后计算,再从后往前计算,计算过程相互独立,互不干扰。
计算预测输出值,变成了:
y^<t>=g(Wya→<t>,a←<t> by)hat{y}^{<t>}=g(W_yoverrightarrow{a}^{<t>},overleftarrow{a}^{<t>} b_y)y^<t>=g(Wya<t>,a<t> by)
为了区别forward components和backward components,前者的激活函数记为a→<t>overrightarrow{a}^{<t>}a<t>,后者的激活函数记为a←<t>overleftarrow{a}^{<t>}a<t>。箭头的方向表示了其值传递的方向。
当然,普通的RNN blocks也可以替换为GRU blocks或者LTSM blocks.
Pros & Cons
首先前面叙述的单向的网络不能考虑后面的输入这一问题得到了解决。在计算某个输出值时,双向循环网络不仅能考虑forward components计算的激活函数值,也能考虑到backward components计算的激活函数值,即它考虑到了所有位置的输入,并且能在句子的任意位置输出预测值。
对于有大量文本的NLP问题,如果你有完整的句子,想要label句子里的单词,使用LSTM单元的双向循环网络是最为常用的,而且也是首选的方法。
双向循环网络的缺点是在任意位置输出预测之前,你需要完整的数据序列(比如一个完整句子)。在一个语音识别的应用场景下,BRNN需要整个语音即说话人全部说完才能进行处理,实时性可能受到影响。实际的语音识别系统通常有更加复杂的模块来解决这一问题,而不是之前介绍的标准BRNN结构。