在序列学习中,我们以往假设的目标是:到目前为止,在给定观测的情况下对下一个输出进行建模。例如,在时间序列的上下文中或在语言模型的上下文中。虽然这是一个典型的情况,但这并不是我们可能遇到的唯一情况。
为了说明这个问题,考虑以下三个在文本序列中填空的任务:
- 我
___
。
- 我
___
饿了。
- 我
___
饿了,我可以吃半头猪。
根据可获得的信息量,我们可以用不同的词填空,如“很高兴”(“happy”)、“不”(“not”)和“非常”(“very”)。很明显,短语的结尾(如果有的话)传达了重要信息,而这些信息关乎到选择哪个词来填空,所以不能利用这一点的序列模型(目前为止 RNN 只看过去)将在相关任务上表现不佳。
例如,如果要做好命名实体识别(例如,识别“Green”指的是“格林先生”还是绿色),不同长度的上下文范围重要性是相同的。
双向循环神经网络
- 一个前向的 RNN 隐层
- 一个后向的 RNN 隐层(一个从最后一个词元开始从后向前运行的循环神经网络)
- 合并两个隐状态得到输出
双向循环神经网络是由 Schuster.Paliwal.1997
提出的。让我们看看这样一个网络的细节。
对于任意时间步 t,给定一个小批量的输入数据 Xt∈Rn×d(样本数:n,每个示例中的输入数:d),并且令隐藏层激活函数为 ϕ。在双向结构中,我们设该时间步的前向和反向隐藏状态分别为 Ht∈Rn×h 和 Ht∈Rn×h,其中 h 是隐藏单元的数目。前向和反向隐藏状态的更新如下:
HtHt=ϕ(XtWxh(f)+Ht−1Whh(f)+bh(f)),=ϕ(XtWxh(b)+Ht+1Whh(b)+bh(b)),
其中,权重 Wxh(f)∈Rd×h,Whh(f)∈Rh×h,Wxh(b)∈Rd×h,Whh(b)∈Rh×h 和偏置 bh(f)∈R1×h,bh(b)∈R1×h 都是模型参数。
接下来,将前向隐藏状态 Ht 和反向隐藏状态 Ht 连续起来,获得需要送入输出层的隐藏状态 Ht∈Rn×2h。
在具有多个隐藏层的深度双向循环神经网络中,该信息作为输入传递到下一个双向层。
最后,输出层计算得到的输出为 Ot∈Rn×q(q 是输出单元的数目):
Ot=HtWhq+bq.
这里,权重矩阵 Whq∈R2h×q 和偏置 bq∈R1×q 是输出层的模型参数。事实上,这两个方向可以拥有不同数量的隐藏单元。
总结
- 双向循环神经网络通过反向更新的隐藏层来利用方向时间信息
- 通常用来对序列抽取特征、填空,而不是预测未来
- 对句子做特征提取:机器翻译、文本分类
- 不能应用在推理上(即,不能用他来训练语言模型),因为得不到未来信息的序列是无法预测的(不靠谱)。