一. 深度循环神经网络
1. 介绍
与多层感知机一样,循环神经网络也可以将多层循环神经网络堆叠在一起, 通过对几个简单层的组合,产生了一个灵活的机制。 特别是,数据可能与不同层的堆叠有关。 下图所示描述了一个具有 𝐿 个隐藏层的深度循环神经网络, 每个隐状态都连续地传递到当前层的下一个时间步输入和当前层下一层的当前时间步输入。
2. 函数依赖关系
假设在时间步
t
t
t有一个小批量的输入数据
X
t
∈
R
n
×
d
\mathbf{X}_t \in \mathbb{R}^{n \times d}
Xt?∈Rn×d(样本数:
n
n
n,每个样本中的输入数:
d
d
d)。同时,将
l
t
h
l^\mathrm{th}
lth隐藏层(
l
=
1
,
…
,
L
l=1,\ldots,L
l=1,…,L)的隐状态设为
H
t
(
l
)
∈
R
n
×
h
\mathbf{H}_t^{(l)} \in \mathbb{R}^{n \times h}
Ht(l)?∈Rn×h(隐藏单元数:
h
h
h),输出层变量设为
O
t
∈
R
n
×
q
\mathbf{O}_t \in \mathbb{R}^{n \times q}
Ot?∈Rn×q(输出数:
q
q
q)。设置
H
t
(
0
)
=
X
t
\mathbf{H}_t^{(0)} = \mathbf{X}_t
Ht(0)?=Xt?,第
l
l
l个隐藏层的隐状态使用激活函数
?
l
\phi_l
?l?,则:
H
t
(
l
)
=
?
l
(
H
t
(
l
?
1
)
W
x
h
(
l
)
+
H
t
?
1
(
l
)
W
h
h
(
l
)
+
b
h
(
l
)
)
,
\mathbf{H}_t^{(l)} = \phi_l(\mathbf{H}_t^{(l-1)} \mathbf{W}_{xh}^{(l)} + \mathbf{H}_{t-1}^{(l)} \mathbf{W}_{hh}^{(l)} + \mathbf{b}_h^{(l)}),
Ht(l)?=?l?(Ht(l?1)?Wxh(l)?+Ht?1(l)?Whh(l)?+bh(l)?),
其中,权重
W
x
h
(
l
)
∈
R
h
×
h
\mathbf{W}_{xh}^{(l)} \in \mathbb{R}^{h \times h}
Wxh(l)?∈Rh×h,
W
h
h
(
l
)
∈
R
h
×
h
\mathbf{W}_{hh}^{(l)} \in \mathbb{R}^{h \times h}
Whh(l)?∈Rh×h和偏置
b
h
(
l
)
∈
R
1
×
h
\mathbf{b}_h^{(l)} \in \mathbb{R}^{1 \times h}
bh(l)?∈R1×h都是第
l
l
l个隐藏层的模型参数。 最后,当前时刻t下输出层的计算仅基于第
l
l
l个(最后一个隐藏层)隐藏层最终的隐状态:
O
t
=
H
t
(
L
)
W
h
q
+
b
q
,
\mathbf{O}_t = \mathbf{H}_t^{(L)} \mathbf{W}_{hq} + \mathbf{b}_q,
Ot?=Ht(L)?Whq?+bq?, 其中,权重
W
h
q
∈
R
h
×
q
\mathbf{W}_{hq} \in \mathbb{R}^{h \times q}
Whq?∈Rh×q和偏置
b
q
∈
R
1
×
q
\mathbf{b}_q \in \mathbb{R}^{1 \times q}
bq?∈R1×q都是输出层的模型参数。
与多层感知机一样,隐藏层数目
L
L
L和隐藏单元数目
h
h
h都是超参数,可以由我们调整的。另外用门控循环单元或长短期记忆网络的隐状态 来代替RNN中的隐状态进行计算,可以很容易地得到深度门控循环神经网络或深度长短期记忆神经网络。
3. 实现
实现多层循环神经网络所需的许多逻辑细节在Pytorch高级API中都是现成的。 简单起见使用高级API函数的实现方式,以长短期记忆网络模型为例, 该代码与前一篇LSTM中使用的代码非常相似, 实际上唯一的区别是我们指定了层的数量, 而不是使用单一层这个默认值,首先进行数据集加载:
import torch
import d2l.torch
from torch import nn
batch_size,num_steps = 32,35
train_iter,vocab = d2l.torch.load_data_time_machine(batch_size,num_steps)
输入和输出选择相同数量即vocab_size,隐藏单元的数量仍然是 256 ,通过num_layers的值来设定隐藏层数。
vocab_size,num_hiddens,num_layers = len(vocab),256,2
input_size = vocab_size
device = d2l.torch.try_gpu()
deep_lstm = nn.LSTM(input_size,num_hiddens,num_layers=num_layers)
model = d2l.torch.RNNModel(deep_lstm,vocab_size)
model = model.to(device)
由于使用了长短期记忆网络模型来实例化两个层,因此训练速度被大大降低了,训练和预测结果如下图所示。
num_epochs,lr = 500,2
d2l.torch.train_ch8(model,train_iter,vocab,lr,num_epochs,device,use_random_iter=False)
4. 小结
- 在深度循环神经网络中,隐状态的信息被传递到当前层的下一时间步和下一层的当前时间步。
- 有许多不同风格的深度循环神经网络,如长短期记忆网络、门控循环单元、或经典循环神经网络。 这些模型在深度学习框架的高级API中都有涵盖。
- 总体而言,深度循环神经网络需要大量的调参(如学习率和隐藏层单元数等)来确保合适的收敛,模型的初始化也需要谨慎。
5. 全部代码
import torch
import d2l.torch
from torch import nn
batch_size, num_steps = 32, 35
train_iter, vocab = d2l.torch.load_data_time_machine(batch_size, num_steps)
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
input_size = vocab_size
device = d2l.torch.try_gpu()
deep_lstm = nn.LSTM(input_size, num_hiddens, num_layers=num_layers)
model = d2l.torch.RNNModel(deep_lstm, vocab_size)
model = model.to(device)
num_epochs, lr = 500, 2
d2l.torch.train_ch8(model, train_iter, vocab, lr, num_epochs, device, use_random_iter=False)
6. 链接
循环神经网络RNN第一篇:李沐动手学深度学习V2-NLP序列模型和代码实现 循环神经网络RNN第二篇:李沐动手学深度学习V2-NLP文本预处理和代码实现 循环神经网络RNN第三篇:李沐动手学深度学习V2-NLP语言模型、数据集加载和数据迭代器实现以及代码实现 循环神经网络RNN第四篇:李沐动手学深度学习V2-RNN原理 循环神经网络RNN第五篇:李沐动手学深度学习V2-RNN循环神经网络从零实现 循环神经网络RNN第六篇:李沐动手学深度学习V2-使用Pytorch框架实现RNN循环神经网络 循环神经网络GRU第七篇:李沐动手学深度学习V2-GRU门控循环单元以及代码实现 循环神经网络LSTM第八篇:李沐动手学深度学习V2-LSTM长短期记忆网络以及代码实现 深度循环神经网络第九篇:李沐动手学深度学习V2-深度循环神经网络和代码实现 双向循环神经网络第十篇:李沐动手学深度学习V2-双向循环神经网络Bidirectional RNN和代码实现
|