chap9 现代循环神经网络(4) 双向循环神经网络

在序列学习中,我们以往假设的目标是:到目前为止,在给定观测的情况下对下一个输出进行建模。例如,在时间序列的上下文中或在语言模型的上下文中。虽然这是一个典型的情况,但这并不是我们可能遇到的唯一情况。

为了说明这个问题,考虑以下三个在文本序列中填空的任务:

  • ___
  • ___ 饿了。
  • ___ 饿了,我可以吃半头猪。

根据可获得的信息量,我们可以用不同的词填空,如“很高兴”(“happy”)、“不”(“not”)和“非常”(“very”)。很明显,短语的结尾(如果有的话)传达了重要信息,而这些信息关乎到选择哪个词来填空,所以不能利用这一点的序列模型(目前为止 RNN 只看过去)将在相关任务上表现不佳。

例如,如果要做好命名实体识别(例如,识别“Green”指的是“格林先生”还是绿色),不同长度的上下文范围重要性是相同的。

双向循环神经网络

  • 一个前向的 RNN 隐层
  • 一个后向的 RNN 隐层(一个从最后一个词元开始从后向前运行的循环神经网络)
  • 合并两个隐状态得到输出

双向循环神经网络是由 Schuster.Paliwal.1997 提出的。让我们看看这样一个网络的细节。

对于任意时间步 tt,给定一个小批量的输入数据 XtRn×d\mathbf{X}_t \in \mathbb{R}^{n \times d}(样本数:nn,每个示例中的输入数:dd),并且令隐藏层激活函数为 ϕ\phi。在双向结构中,我们设该时间步的前向和反向隐藏状态分别为 HtRn×h\overrightarrow{\mathbf{H}}_t \in \mathbb{R}^{n \times h}HtRn×h\overleftarrow{\mathbf{H}}_t \in \mathbb{R}^{n \times h},其中 hh 是隐藏单元的数目。前向和反向隐藏状态的更新如下:

Ht=ϕ(XtWxh(f)+Ht1Whh(f)+bh(f)),Ht=ϕ(XtWxh(b)+Ht+1Whh(b)+bh(b)),\begin{aligned} \overrightarrow{\mathbf{H}}_t &= \phi(\mathbf{X}_t \mathbf{W}_{xh}^{(f)} + \overrightarrow{\mathbf{H}}_{t-1} \mathbf{W}_{hh}^{(f)} + \mathbf{b}_h^{(f)}),\\ \overleftarrow{\mathbf{H}}_t &= \phi(\mathbf{X}_t \mathbf{W}_{xh}^{(b)} + \overleftarrow{\mathbf{H}}_{t+1} \mathbf{W}_{hh}^{(b)} + \mathbf{b}_h^{(b)}), \end{aligned}

其中,权重 Wxh(f)Rd×h,Whh(f)Rh×h,Wxh(b)Rd×h,Whh(b)Rh×h\mathbf{W}_{xh}^{(f)} \in \mathbb{R}^{d \times h}, \mathbf{W}_{hh}^{(f)} \in \mathbb{R}^{h \times h}, \mathbf{W}_{xh}^{(b)} \in \mathbb{R}^{d \times h}, \mathbf{W}_{hh}^{(b)} \in \mathbb{R}^{h \times h} 和偏置 bh(f)R1×h,bh(b)R1×h\mathbf{b}_h^{(f)} \in \mathbb{R}^{1 \times h}, \mathbf{b}_h^{(b)} \in \mathbb{R}^{1 \times h} 都是模型参数。

接下来,将前向隐藏状态 Ht\overrightarrow{\mathbf{H}}_t 和反向隐藏状态 Ht\overleftarrow{\mathbf{H}}_t 连续起来,获得需要送入输出层的隐藏状态 HtRn×2h\mathbf{H}_t \in \mathbb{R}^{n \times 2h}

在具有多个隐藏层的深度双向循环神经网络中,该信息作为输入传递到下一个双向层。

最后,输出层计算得到的输出为 OtRn×q\mathbf{O}_t \in \mathbb{R}^{n \times q}qq 是输出单元的数目):

Ot=HtWhq+bq.\mathbf{O}_t = \mathbf{H}_t \mathbf{W}_{hq} + \mathbf{b}_q.

这里,权重矩阵 WhqR2h×q\mathbf{W}_{hq} \in \mathbb{R}^{2h \times q} 和偏置 bqR1×q\mathbf{b}_q \in \mathbb{R}^{1 \times q} 是输出层的模型参数。事实上,这两个方向可以拥有不同数量的隐藏单元。

总结

  • 双向循环神经网络通过反向更新的隐藏层来利用方向时间信息
  • 通常用来对序列抽取特征、填空,而不是预测未来
    • 对句子做特征提取:机器翻译、文本分类
    • 不能应用在推理上(即,不能用他来训练语言模型),因为得不到未来信息的序列是无法预测的(不靠谱)。