Deep Learning Note: 5-5 双向 RNN 和深度 RNN
1. 双向 RNN
之前所介绍的 RNN 存在的一个问题是,在 $t$ 时刻,网络只能根据 $t$ 时刻之前的内容进行预测,而无法看到 $t$ 时刻之后的内容。例如对于如下两句话:
He said, “Teddy bears are on sale!”
He said, “Teddy Roosevelt was a great President!”
要识别这两句话中的人名,我们可以根据第一句后面的 on sale 知道前面的 Teddy 是指泰迪熊,并根据第二句的 Roosevelt 和 President 知道前面的 Teddy 是人名。而对于如图 1 所示的网络,在 $t = 3$ 时刻输入 Teddy 时,网络并不知道后文的内容,仅根据前三个词无法判断 Teddy 到底指的是什么。
对于如图 1 所示的单向(UniDirectional)的 RNN,无论是使用普通的 RNN 结构,还是 GRU 或 LSTM,都会存在以上的问题。
双向(Bidirectional)RNN 可以让网络获取到当前时刻之后的内容,其结构如图 2 所示。
图 2 中的方框表示一个 RNN 结构,可以是普通的 RNN 结构,或者是 GRU / LSTM。紫色方框和箭头和之前的单向 RNN 网络相同,从前向后依次计算前向的激活值 $\ \overrightarrow{a}^{\lt t \gt}$。绿色的方框和箭头则从后向前地计算反向的激活值 $\overleftarrow{a}^{\lt t \gt}$,在 $t$ 时刻输出的预测值 $\hat{y}^{\lt t \gt}$ 为:
\begin{equation}
\hat{y}^{\lt t gt} = g(W_y[\overrightarrow{a}^{\lt t \gt}, \overleftarrow{a}^{\lt t \gt}] + b_y) \tag{1}
\end{equation}
式 (1) 中,$g$ 为激活函数,$W_y$ 和 $b_y$ 分别为权重和偏置参数。
注意图 2 中绿色方框和箭头虽然是沿着反方向计算的,这些计算仍属于前向传播。此时 $t$ 时刻的预测 $\hat{y}^{\lt t \gt}$ 同时包含 $t$ 时刻的输入 $x^{\lt t \gt}$,$t$ 时刻之前的信息 $\overrightarrow{a}^{\lt t \gt}$,以及 $t$ 时刻之后的信息 $\overleftarrow{a}^{\lt t \gt}$。
双向 RNN 的一个缺点是需要有完整的文本才能进行预测,例如对于语音识别问题,双向 RNN 需要在说话的人讲完完整一句话后才能给出预测,对于实时语音识别问题,通常会使用更加复杂的模型。对于很多能直接获得完整文本的自然语言处理问题,双向 RNN 和 LSTM 的组合十分常用。
2. 深度 RNN
通过叠加多个 RNN 网络,可以构建更复杂的模型,如图 3 所示。
图 3 中将 3 个 RNN 垂直叠加在一起,使用 $a^{[l]\lt t \gt}$ 表示第 $l$ 层 $t$ 时刻的激活值,其计算方法为:
\begin{equation}
a^{[l]\lt t \gt} = g(W_a^{[l]}[a^{[l]\lt t-1 \gt}, a^{[l-1]\lt t \gt}] + b_a^{[l]}) \tag{2}
\end{equation}
式 (2) 中,$g$ 为激活函数,$W_a^{[l]}$ 和 $b_a^{[l]}$ 分别为第 $l$ 层计算激活值的权重和偏置参数。
图 3 中的 RNN 可以使用普通的 RNN 结构,也可以使用 GRU 或 LSTM。除了单向 RNN,也可以使用双向 RNN。
对于普通的神经网络,其层数可以非常多,比如 100 多层。而对于深度 RNN,像图 3 那样有三层已经是非常深了,因为每一层 RNN 还有时间维度上的深度,即便 RNN 层数不多,整体网络的规模也会非常巨大。对于深度 RNN,还有一种做法是在像图 3 那样叠加几层 RNN 之后,将 RNN 在每个时刻上的输出再输入到单独的普通深度网络中,由这些普通的深度网络给出每个时刻上的最终预测值,这些普通的深度网络不再像 RNN 那样在时间维度上相连接。