上一篇:现代循环神经网络-2.长短期记忆网络(LSTM)【动手学深度学习v2】
3.深度循环神经网络
在前面几篇文章中,只讨论了具有一个单向隐藏层的循环神经网络。 其中,隐变量和观测值与具体的函数形式的交互方式是相当随意的。 只要交互类型建模具有足够的灵活性,这就不是一个大问题。 然而,对于一个单层来说,这可能具有相当的挑战性。 之前在线性模型中,我们通过添加更多的层来解决这个问题。 而在循环神经网络中,我们首先需要确定如何添加更多的层, 以及在哪里添加额外的非线性,因此这个问题有点棘手。
事实上,我们可以将多层循环神经网络堆叠在一起, 通过对几个简单层的组合,产生了一个灵活的机制。 特别是,数据可能与不同层的堆叠有关。 例如,我们可能希望保持有关金融市场状况 (熊市或牛市)的宏观数据可用, 而微观数据只记录较短期的时间动态。
下图描述了一个具有个隐藏层的深度循环神经网络, 每个隐状态都连续地传递到当前层的下一个时间步和下一层的当前时间步。
H
t
(
l
)
=
?
l
(
H
t
l
?
1
W
x
h
(
l
)
+
H
(
l
)
t
?
1
W
h
h
(
l
)
+
b
h
l
)
H^{(l)}_t = \phi_{l}(H^{l-1}_t W^{(l)}_{xh}+H^(l)_{t-1} W^{(l)}_{hh} + b^{l}_{h})
Ht(l)?=?l?(Htl?1?Wxh(l)?+H(l)t?1?Whh(l)?+bhl?)
O
t
=
H
t
(
l
)
W
h
q
+
b
q
O_t = H^{(l)}_t W_{hq} + b_q
Ot?=Ht(l)?Whq?+bq?
其中l是循环神经网络的层数,t代表时间步,L是最后一层隐藏层。
H
t
H_t
Ht?需要考虑上一层的隐藏单元和上一时间步的隐藏单元的影响。
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, num_epochs, device)
perplexity 1.0, 222604.4 tokens/sec on cuda:0
time traveller for so it will be convenient to speak of himwas e
travelleryou can show black is white by argument said filby
对比单层网络来说,收敛速度明显增快。
|