D2L-59-双向循环神经网络
# Bidirectional Recurrent Neural Networks
2022-04-18
Tags: #RNN #DeepLearning #BidirectionalRNN
- 双向神经网络增加了反向扫描的隐藏层, 使网络拥有了"前瞻能力"
- 正向层和反向层的输入是相同的, 是并行进行的, 最后正向和反向的结果一起生成输出.
- 在D2L教程里面将正向反向扫描的过程和隐马尔科夫模型动态规划的正向与反向传递1进行了类比:
这种转变集中体现了现代深度网络的设计原则: 首先使用经典统计模型的函数依赖类型,然后将其参数化为通用形式。
# 形式化定义
- 对于任意时间步 $t$,对于一个批量的输入 $\mathbf{X}_t \in \mathbb{R}^{n \times d}$($n$ 为样本数,$d$ 为每个示例中的输入数),并令隐藏层激活函数为 $\phi$。
- 在双向架构中,我们设该时间步的前向和反向隐状态分别为 $\overrightarrow{\mathbf{H}}_t \in \mathbb{R}^{n \times h}$ 和 $\overleftarrow{\mathbf{H}}_t \in \mathbb{R}^{n \times h}$,其中 $h$ 是隐藏单元的数目。
- 则Bidirectional RNN的更新规则可以定义如下: $$ \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} $$
- 将前向隐状态 $\overrightarrow{\mathbf{H}}_t$ 和反向隐状态 $\overleftarrow{\mathbf{H}}_t$ 拼接起来,我们得到输出层的输入 $\mathbf{H}_t \in \mathbb{R}^{n \times 2h}$。
- 输出 $\mathbf{O}_t \in \mathbb{R}^{n \times q}$ 的计算公式如下:($q$ 是输出单元的数目)
$$\mathbf{O}_t = \mathbf{H}t \mathbf{W}{hq} + \mathbf{b}_q.$$
- 值得注意的是, 两个方向其实可以拥有不同数量的隐藏单元
# 双向模型的局限性
因为双向模型需要同时使用来自序列两端的信息来估计输出, 所以它完全不能用于单向的预测(即给一个句子开头, 让模型进行续写)
另一个严重问题是,双向循环神经网络的计算速度非常慢。
- 其主要原因是网络的前向传播需要在双向层中进行前向和后向递归, 并且网络的反向传播还依赖于前向传播的结果。 因此,梯度求解将有一个非常长的链。
# 应用
- 双向层的使用在实践中非常少,并且仅仅应用于部分场合。
- 例如,filling in missing words, annotating tokens (e.g., for named entity recognition), and encoding sequences wholesale as a step in a sequence processing pipeline (e.g., for machine translation)