09.4. 双向循环神经网络

文章目录

    • 9.4. 双向循环神经网络
      • 9.4.1. 隐马尔可夫模型中的动态规划
      • 9.4.2. 双向模型
        • 9.4.2.1. 定义
        • 9.4.2.2. 模型的计算代价及其应用
      • 9.4.3. 双向循环神经网络的错误应用
      • 9.4.4. 小结

9.4. 双向循环神经网络

9.4.1. 隐马尔可夫模型中的动态规划

们想用概率图模型来解决这个问题, 可以设计一个隐变量模型:
在任意时间步,假设存在某个隐变量, 通过概率控制我们观测到的值。

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

隐马尔可夫模型

知道未来数据何时可用对隐马尔可夫模型是有益的

9.4.2. 双向模型

双向循环神经网络(bidirectional RNNs) 添加了反向传递信息的隐藏层,以便更灵活地处理此类信息。
09.4. 双向循环神经网络_第2张图片

事实上,这与隐马尔可夫模型中的动态规划的前向和后向递归没有太大区别。
其主要区别是,在隐马尔可夫模型中的方程具有特定的统计意义。 双向循环神经网络没有这样容易理解的解释, 我们只能把它们当作通用的、可学习的函数。
这种转变集中体现了现代深度网络的设计原则: 首先使用经典统计模型的函数依赖类型,然后将其参数化为通用形式。

9.4.2.1. 定义

对于任意时间步,给定一个小批量的输入数据 (样本数,每个示例中的输入数), 隐藏层激活函数、

两个方向可以拥有不同数量的隐藏单元。

9.4.2.2. 模型的计算代价及其应用

双向循环神经网络的一个关键特性是:使用来自序列两端的信息来估计输出

双向循环神经网络的计算速度非常慢。
其主要原因是网络的前向传播需要在双向层中进行前向和后向递归, 并且网络的反向传播还依赖于前向传播的结果

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

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

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)

# result
perplexity 1.1, 130005.5 tokens/sec on cuda:0
time travellerererererererererererererererererererererererererer
travellerererererererererererererererererererererererererer

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

9.4.4. 小结

  • 在双向循环神经网络中,每个时间步的隐状态由当前时间步的前后数据同时决定。

  • 双向循环神经网络与概率图模型中的“前向-后向”算法具有相似性。

  • 双向循环神经网络主要用于序列编码和给定双向上下文的观测估计。

  • 由于梯度链更长,因此双向循环神经网络的训练代价非常高。

你可能感兴趣的:(Python基础学习,python书籍笔记,#,rnn,深度学习,人工智能)