双向循环神经网络

本文经授权转载自《动手学深度学习》。全书内容参见 zh.d2l.ai,GitHub项目参见 github.com/d2l-ai/d2l-zh

之前介绍的循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的,因此它们都将信息通过隐藏状态从前往后传递。有时候,当前时间步也可能由后面时间步决定。例如,当我们写下一个句子时,可能会根据句子后面的词来修改句子前面的用词。双向循环神经网络通过增加从后往前传递信息的隐藏层来更灵活地处理这类信息。图6.12演示了一个含单隐藏层的双向循环神经网络的架构。

双向循环神经网络的架构

下面我们来介绍具体的定义。 给定时间步tt的小批量输入XtRn×d\boldsymbol{X}_t \in \mathbb{R}^{n \times d}(样本数为nn,输入个数为dd)和隐藏层激活函数为ϕ\phi。在双向循环神经网络的架构中, 设该时间步正向隐藏状态为HtRn×h\overrightarrow{\boldsymbol{H}}_t \in \mathbb{R}^{n \times h}(正向隐藏单元个数为hh), 反向隐藏状态为HtRn×h\overleftarrow{\boldsymbol{H}}_t \in \mathbb{R}^{n \times h}(反向隐藏单元个数为hh)。我们可以分别计算正向隐藏状态和反向隐藏状态:

\begin{aligned} \overrightarrow{\boldsymbol{H}}t &= \phi(\boldsymbol{X}t \boldsymbol{W}{xh}^{(f)} + \overrightarrow{\boldsymbol{H}}{t-1} \boldsymbol{W}{hh}^{(f)} + \boldsymbol{b}h^{(f)}),\ \overleftarrow{\boldsymbol{H}}_t &= \phi(\boldsymbol{X}_t \boldsymbol{W}{xh}^{(b)} + \overleftarrow{\boldsymbol{H}}{t+1} \boldsymbol{W}_{hh}^{(b)} + \boldsymbol{b}_h^{(b)}), \end{aligned}

其中权重$\boldsymbol{W}{xh}^{(f)} \in \mathbb{R}^{d \times h}\boldsymbol{W}{hh}^{(f)} \in \mathbb{R}^{h \times h}\boldsymbol{W}{xh}^{(b)} \in \mathbb{R}^{d \times h}\boldsymbol{W}{hh}^{(b)} \in \mathbb{R}^{h \times h}和偏差和偏差 \boldsymbol{b}_h^{(f)} \in \mathbb{R}^{1 \times h}\boldsymbol{b}_h^{(b)} \in \mathbb{R}^{1 \times h}$均为模型参数。

然后我们连结两个方向的隐藏状态Ht\overrightarrow{\boldsymbol{H}}_tHt\overleftarrow{\boldsymbol{H}}_t来得到隐藏状态HtRn×2h\boldsymbol{H}_t \in \mathbb{R}^{n \times 2h},并将其输入到输出层。输出层计算输出OtRn×q\boldsymbol{O}_t \in \mathbb{R}^{n \times q}(输出个数为qq):

\boldsymbol{O}_t = \boldsymbol{H}t \boldsymbol{W}{hq} + \boldsymbol{b}_q,

其中权重WhqR2h×q\boldsymbol{W}_{hq} \in \mathbb{R}^{2h \times q}和偏差bqR1×q\boldsymbol{b}_q \in \mathbb{R}^{1 \times q}为输出层的模型参数。不同方向上的隐藏单元个数也可以不同。

小结

  • 双向循环神经网络在每个时间步的隐藏状态同时取决于该时间步之前和之后的子序列(包括当前时间步的输入)。

练习

  • 如果不同方向上使用不同的隐藏单元个数,Ht\boldsymbol{H}_t的形状会发生怎样的改变?
  • 参考图6.11和图6.12,设计含多个隐藏层的双向循环神经网络。

扫码直达讨论区