Run this notebook online: or Colab:

# 9.3. 深度循环神经网络¶

fig_deep_rnn描述了一个具有$$L$$个隐藏层的深度循环神经网络， 每个隐状态都连续地传递到当前层的下一个时间步和下一层的当前时间步。

.. _fig_deep_rnn:

## 9.3.1. 函数依赖关系¶

(9.3.1)$\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)}),$

(9.3.2)$\mathbf{O}_t = \mathbf{H}_t^{(L)} \mathbf{W}_{hq} + \mathbf{b}_q,$

## 9.3.2. 简洁实现¶

%load ../utils/djl-imports
%load ../utils/plot-utils
%load ../utils/Functions.java
%load ../utils/PlotUtils.java

%load ../utils/StopWatch.java
%load ../utils/Accumulator.java
%load ../utils/Animator.java
%load ../utils/Training.java
%load ../utils/timemachine/Vocab.java
%load ../utils/timemachine/RNNModel.java
%load ../utils/timemachine/RNNModelScratch.java
%load ../utils/timemachine/TimeMachine.java
%load ../utils/timemachine/TimeMachineDataset.java

NDManager manager = NDManager.newBaseManager();

int batchSize = 32;
int numSteps = 35;

TimeMachineDataset dataset = new TimeMachineDataset.Builder()
.setManager(manager)
.setMaxTokens(10000)
.setSampling(batchSize, false)
.setSteps(numSteps)
.build();
dataset.prepare();
Vocab vocab = dataset.getVocab();


int vocabSize = vocab.length();
int numHiddens = 256;
int numLayers = 2;
Device device = manager.getDevice();
LSTM lstmLayer =
LSTM.builder()
.setNumLayers(numLayers)
.setStateSize(numHiddens)
.optReturnState(true)
.optBatchFirst(false)
.build();

RNNModel model = new RNNModel(lstmLayer, vocabSize);


## 9.3.3. [训练]与预测¶

int numEpochs = Integer.getInteger("MAX_EPOCH", 500);

int lr = 2;
TimeMachine.trainCh8(model, dataset, vocab, lr, numEpochs, device, false, manager);

INFO Training on: 1 GPUs.
INFO Load MXNet Engine Version 1.9.0 in 0.065 ms.

perplexity: 1.0, 61843.6 tokens/sec on gpu(0)
time traveller a society of timaterere i have not alo the time d
traveller three dimensions they could move a little up and


## 9.3.4. 小结¶

• 在深度循环神经网络中，隐状态的信息被传递到当前层的下一时间步和下一层的当前时间步。

• 有许多不同风格的深度循环神经网络， 如长短期记忆网络、门控循环单元、或经典循环神经网络。 这些模型在深度学习框架的高级API中都有涵盖。

• 总体而言，深度循环神经网络需要大量的调参（如学习率和修剪） 来确保合适的收敛，模型的初始化也需要谨慎。

## 9.3.5. 练习¶

1. 基于我们在 Section 8.5中讨论的单层实现， 尝试从零开始实现两层循环神经网络。

2. 在本节训练模型中，比较使用门控循环单元替换长短期记忆网络后模型的精确度和训练速度。

3. 如果增加训练数据，你能够将困惑度降到多低？

4. 在为文本建模时，是否可以将不同作者的源数据合并？有何优劣呢？