双向循环神经网络
双向LSTM非常不适合做推理,基础是不能用在预测下一个词。
Bi-RNN的作用主要是对一个句子做特征提取,比如做翻译, 给句子A翻译句子B,那么可以对句子A使用Bi-RNN去双向的看它。
代码
这里代码不会讲具体实现,但是其实很简单,前向的隐藏层就正常进行运算。反向的怎么实现呢?首先把reverse(input),然后输入到隐层得到一个输出,再讲这个输出reverse(), 最后将这个两个输出进行连接。
# 可以直接指定RNN的单元和是否是双向的
lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers, bidirectional=True)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
下面是一个错误的案例,就是要说明不能使用双向循环神经网络来做预测。
QA
- 时间序列预测,也用双向的吗?这个能从后向前看吗?
时间序列是不能使用双向的,只能做做完形填空、文本分类这种,可以看完一整段文本的。双向循环神经网络不适合做预测的任务。
- 双向循环神经网络,在正向和反向之间有权重关系吗?
没有。因为他们正向和反向的权重是concat在一起的,而不是相加或者其他运算,所以是独立的。
- 隐藏层和隐马尔科夫有什么关系?
理论上RNN训练是没有长度限制的,但是训练的时候我们把句子裁剪成了不要过长的子序列(比如35),这里就可以认为暗含使用了隐马尔科夫的假设。
- 双向是否可以深度双向?
是的,两层是一组单元,可以进行叠加。