84. 双向循环神经网络

1. 未来很重要

84. 双向循环神经网络_第1张图片

  • 取决于过去和未来的上下文,可以填很不一样的词
  • 目前为止RNN只看过去
  • 在填空的时候,我们也可以看未来城

2. 双向RNN

两个隐状态层,并行计算隐状态,但是隐状态传播方向相反。

84. 双向循环神经网络_第2张图片
公式如下:

84. 双向循环神经网络_第3张图片

3. 推理

84. 双向循环神经网络_第4张图片

双向RNN不适合做推理,而是主要对一个句子做特征提取。比如做翻译的时候,给定一个句子去翻译下一个句子,那么给我的句子,我可以双向地去看它。

4. 总结

  • 双向循环神经网络通过反向更新的隐藏层来利用时间信息
  • 通常用来对序列抽取特征、填空,而不是预测未来

5. 双向循环神经网络的错误应用

由于双向循环神经网络使用了过去的和未来的数据, 所以我们不能盲目地将这一语言模型应用于任何预测任务。 尽管模型产出的困惑度是合理的, 该模型预测未来词元的能力却可能存在严重缺陷。 我们用下面的示例代码引以为戒,以防在错误的环境中使用它们。

使用双向RNN,只需要在nn.LSTM中加上一句bidirectional=True

import torch
from torch import nn
from d2l import torch as d2l

# 加载数据
batch_size, num_steps, device = 32, 35, d2l.try_gpu()
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
# 通过设置“bidirective=True”来定义双向LSTM模型
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
num_inputs = vocab_size
lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers, bidirectional=True)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
# 训练模型
num_epochs, lr = 500, 1
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

运行结果:

84. 双向循环神经网络_第5张图片

6. Q&A

Q1:双向RNN,反向的初始hidden state是什么?

A1:是0。从代码上来讲,反向和正向是一样的代码实现。

Q2:LSTM为什么要分C和H?

A2:H的取值是-1到+1,而C的取值比较大,没有数值限制,但是使用激活函数后可以把取值范围限制到-1和+1

Q3: 双向是否可以深度双向?

A3:可以的。并且双向的两个隐藏层是看成一组的,如果要弄得更深,就是弄更多这样的组。

你可能感兴趣的:(深度学习,rnn,深度学习,lstm)