一、深层循环神经网络
1、对于循环神经网络
2、对于深层,要得到更多的非线性,就像多层感知机(MLP)。
(1)浅层与深层对比
这是具有𝐿个隐藏层的深度循环神经网络, 每个隐状态都连续地传递到当前层的下一个时间步和下一层的当前时间步。
(2)公式
隐藏层:
输出层:
3、总结
(1)在深度循环神经网络中,隐状态的信息被传递到当前层的下一时间步和下一层的当前时间步。
(2)有许多不同风格的深度循环神经网络, 如长短期记忆网络、门控循环单元、或经典循环神经网络。,这些模型在深度学习框架的高级API中都有涵盖。
(3)深度循环神经网络需要大量的调参(如学习率和修剪) 来确保合适的收敛,模型的初始化也需要谨慎。
(4)深度循环神经网络使用多个隐藏层来获得更多的非线性
二、双向循环神经网络
1、应用
2、双向RNN
(1)前向和反向隐状态的更新
(2)将前向隐状态𝐻→𝑡 和反向隐状态𝐻←𝑡连接起来, 获得需要送入输出层的隐状态𝐻𝑡。在具有多个隐藏层的深度双向循环神经网络中, 该信息作为输入传递到下一个双向层。
(3)输出层
(4)一个前向RNN隐藏层,一个后向RNN隐藏层,合并两个隐状态得到输出
(5)适合对一个句子做特征提取而不适合做推理,因为看不到未来
3、总结
(1)在双向循环神经网络中,每个时间步的隐状态由当前时间步的前后数据同时决定。
(2)双向循环神经网络与概率图模型中的“前向-后向”算法具有相似性。
(3)双向循环神经网络主要用于序列编码和给定双向上下文的观测估计。
(4)由于梯度链更长,因此双向循环神经网络的训练代价非常高。
三、代码
1、深度循环神经网络
import torch from torch import nn from d2l import torch as d2l batch_size, num_steps = 32, 35 train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps) vocab_size, num_hiddens, num_layers = len(vocab), 256, 2 num_inputs = vocab_size device = d2l.try_gpu() lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers) model = d2l.RNNModel(lstm_layer, len(vocab)) model = model.to(device) num_epochs, lr = 500, 2 d2l.train_ch8(model, train_iter, vocab, lr*1.0, num_epochs, device)
2、双向循环神经网络的错误应用:因为我们不能用这个做预测,只能用于提取特征
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)