动手学深度学习——深层循环神经网络
2026/4/14 18:13:03 网站建设 项目流程

1. 前言

前面我们已经顺着李沐这条线,依次学习了:

  • RNN

  • RNN 从零开始实现

  • RNN 简洁实现

  • GRU

  • GRU 代码

  • LSTM

  • LSTM 代码

到这里,我们已经掌握了一个非常重要的主线:

循环神经网络的核心,不在于“是不是循环”,而在于“状态如何沿时间传递、如何管理记忆”。

但是,前面学的这些模型还有一个共同点:

默认都只有一层循环层。

也就是说,在每个时间步上,输入只经过一层循环单元处理。
这当然已经能建模序列,但一个很自然的问题是:

如果一层学到的表示还不够强,能不能像卷积网络、前馈网络那样,把循环层也堆叠起来?

答案就是可以。
这就引出了这一节的主题:

深层循环神经网络(Deep RNN)


2. 什么叫“深层”循环神经网络

“深层”两个字,并不是说时间步更多,
而是说:

在同一个时间步内,不止有一层循环单元,而是有多层循环层堆叠。

也就是说,原来单层 RNN 在某个时间步的计算可能是:

  • 输入X_t

  • 经过一层循环单元

  • 得到隐藏状态H_t

而深层循环网络则会变成:

  • 输入X_t

  • 第 1 层循环单元处理

  • 第 2 层循环单元继续处理

  • 第 3 层……

  • 最后得到更高层表示

所以“深”体现在:

层数增加了,而不是序列长度增加了。


3. 单层 RNN 有什么局限

为什么我们会想到把循环网络堆深?
原因和前面学 CNN、MLP 时其实很像。

3.1 单层表达能力有限

单层循环网络虽然能处理序列,
但它在每个时间步上能学到的特征层次相对有限。

3.2 不同层次的信息可能需要不同抽象程度

例如在文本中:

  • 底层可能更像字符或局部词法模式

  • 中层可能更像短语或局部依赖

  • 高层可能更像句法或语义结构

如果只有一层循环单元,所有这些模式都得挤在同一层里学,压力比较大。

3.3 更复杂任务需要更强表示能力

对于更复杂的语言建模、翻译、语音识别任务,一层循环层可能不够。

所以和前馈网络一样,循环网络也自然会走向“加深”。


4. 深层 RNN 的核心思想是什么

深层循环神经网络的核心思想可以概括为一句话:

在每个时间步上,让序列表示经过多层循环变换,从低层特征逐步提炼成高层特征。

这和深层卷积网络非常像。

底层循环层

更直接地接触输入,学习局部、底层模式。

高层循环层

接收低层的输出,进一步抽象和整合,形成更高层表示。

所以深层 RNN 的核心并不是“时间更长”,
而是:

同一时刻的表示更有层次。


5. 深层 RNN 在结构上怎么理解

假设我们有一个两层 RNN。

对于时间步t,它的计算可以理解为:

第一层

H_t^(1) = f(X_t, H_{t-1}^(1))

第二层

H_t^(2) = f(H_t^(1), H_{t-1}^(2))

也就是说:

  • 第 1 层接收原始输入X_t

  • 第 2 层不直接接原始输入,而是接收第 1 层当前时刻的输出

  • 同时,每一层还各自保留本层上一时刻的隐藏状态

所以深层 RNN 里同时存在两类连接:

时间方向连接

同一层里,前一时刻连到后一时刻。

深度方向连接

同一时刻里,低层连到高层。

这正是它“又循环、又分层”的本质。


6. 为什么深层 RNN 不是简单“多跑几次”

这点很值得强调。

你可能会想:

多层 RNN 不就是把一个 RNN 连着用几次吗?

表面上有点像,但本质上不只是“重复计算”,而是:

每一层都在学习不同层次的时序表示。

例如:

  • 第 1 层可能更关注局部模式和短依赖

  • 第 2 层在第 1 层基础上整合更长的上下文

  • 第 3 层再进一步做更高层抽象

所以深层结构带来的不是“算更多次”,
而是“表示层级更丰富”。


7. 深层 RNN 和时间展开图怎么画

如果画图的话,深层 RNN 往往看起来像一个二维网格:

  • 横向是时间步

  • 纵向是网络层数

例如两层 RNN 的结构会呈现出:

  • 第 1 层沿时间展开一条链

  • 第 2 层沿时间展开另一条链

  • 同时每个时间步上,第 1 层输出再传给第 2 层

所以它不像单层 RNN 那样只有一条时间链,
而是:

多条时间链在垂直方向上堆叠起来。

这也是“深层循环网络”最直观的结构特征。


8. 深层 RNN 为什么可能更强

8.1 更高的表示能力

多层结构让模型可以逐步提炼特征,不必把所有任务都压在一层里完成。

8.2 有利于学习不同抽象层次的时序模式

类似 CNN 的浅层看边缘、深层看语义,
深层 RNN 也能形成层级化的序列表示。

8.3 对复杂任务更适应

例如机器翻译、语音识别等任务中,深层循环结构通常比单层更强。

所以“加深”是一种非常自然的能力增强方式。


9. 深层 RNN 会不会更难训练

会,而且这也是它的一个现实问题。

9.1 时间维已经很长

循环网络本身就要沿时间传播梯度。

9.2 现在又多了深度维

不仅时间长,层数也深,优化难度进一步上升。

9.3 更容易带来梯度问题和训练不稳定

特别是在基础 RNN 结构中,这个问题会更明显。

所以实际中,深层循环网络往往更常配合:

  • GRU

  • LSTM

  • 正则化

  • 梯度裁剪

一起使用,而不是简单地把基础 RNN 一层层硬堆上去。


10. 深层 RNN 和深层前馈网络有什么共同点

它们的思路本质上是相通的:

单层前馈网络

表达能力有限。

深层前馈网络

通过多层变换逐步提炼表示。

单层循环网络

每个时间步上的表示层次有限。

深层循环网络

在时间步内部增加层次,让表示更丰富。

所以,深层 RNN 其实就是把“深度学习”里的“多层特征抽象”思想,引入到了序列建模中。


11. PyTorch 里深层 RNN 怎么实现

这一节在代码层面最核心的一点通常是:

PyTorch 已经帮我们把多层循环封装好了。

例如,在nn.RNNnn.GRUnn.LSTM中,都可以通过一个参数直接指定层数:

num_layers

例如:

rnn_layer = nn.LSTM(input_size=vocab_size, hidden_size=num_hiddens, num_layers=2)

这就表示:

  • 使用两层 LSTM

  • 每层都有自己的隐藏状态

  • 第 1 层输出会作为第 2 层输入

也就是说,深层循环网络在框架里实现起来其实非常自然。


12.num_layers=2到底意味着什么

当你写:

num_layers=2

并不是说:

  • 序列长度翻倍了

  • 或者模型重复看两遍输入

而是说:

每个时间步都会顺序通过两层循环单元。

例如时间步t

  1. 原始输入X_t进入第 1 层

  2. 第 1 层输出作为第 2 层输入

  3. 第 2 层得到更高层表示

然后再进入下一个时间步。

所以num_layers控制的是深度方向,不是时间方向


13. 多层循环网络的状态形状会怎么变化

这一点在代码里特别容易混。

对于单层 RNN / GRU / LSTM,状态形状通常是:

(num_layers * num_directions, batch_size, hidden_size)

如果是单层、单向,那么第一维就是 1。

如果是两层、单向,那么第一维就变成 2。

例如:

(2, batch_size, hidden_size)

这表示:

  • 第 1 层有一份状态

  • 第 2 层也有一份状态

如果是 LSTM,还要额外再有一份记忆单元C
所以状态会变成(H, C),而每个都具有这个三维结构。


14. 为什么多层循环网络的状态要按层堆叠

因为每一层都有自己的“时间记忆”。

例如两层 LSTM 中:

  • 第 1 层会沿时间保存自己的H^(1), C^(1)

  • 第 2 层也会沿时间保存自己的H^(2), C^(2)

它们虽然都在处理同一个序列,
但学到的是不同层次的特征,所以状态不能混在一起。

因此框架会把不同层的状态按第一维堆叠起来统一管理。


15. 深层 RNN 和 GRU/LSTM 有什么关系

深层循环神经网络不是某一种新的循环单元,
而是一种结构组织方式

也就是说,你可以有:

  • 深层基础 RNN

  • 深层 GRU

  • 深层 LSTM

它们的关系可以理解为:

RNN / GRU / LSTM

回答的是:

单个循环单元内部如何更新状态

深层循环网络

回答的是:

多个循环单元层之间如何堆叠

所以“门控”解决的是单元质量问题,
“深层”解决的是层次表达问题。


16. 为什么实际中深层 LSTM 很常见

因为在很多真实任务中,大家往往不会用“深层基础 RNN”,
而更常用:

  • 深层 GRU

  • 深层 LSTM

原因很直接:

基础 RNN 本来就容易有长期依赖问题

再堆深后训练更难。

LSTM 本身更适合处理长期依赖

再加上多层结构,就能同时获得:

  • 更强记忆能力

  • 更强层次表示能力

所以历史上很多经典 NLP / 语音模型,都是深层 LSTM。


17. 深层 RNN 有什么代价

模型更强,通常也意味着代价更高。

17.1 参数更多

层数增加,参数量也增加。

17.2 训练更慢

因为循环模型本身时间并行性就弱,多层后计算更重。

17.3 更容易过拟合

模型容量变大,如果数据不够多或正则不足,可能会过拟合。

17.4 更难调参

层数、隐藏维度、dropout 等都会影响效果。

所以深层不是越深越好,而是要和任务复杂度、数据规模匹配。


18. 李沐这一节最想让你理解什么

这一节最核心的不是复杂公式,而是结构认识:

第一,循环网络也可以做深

不只是 CNN、MLP 才能加深。

第二,深层体现在“同一时间步的层数增加”

不是时间步变长。

第三,多层循环网络让表示更有层次

低层更接近输入,高层更接近抽象语义。

第四,代码里通常只需改num_layers

这使深层循环网络在工程上很好实现。

所以这一节更像是:

在单元学习完之后,把结构维度再打开。


19. 本节总结

这一节我们学习了深层循环神经网络,核心内容可以总结为以下几点。

19.1 深层循环神经网络指的是在同一时间步上堆叠多层循环层

深度增加的是层数,不是时间长度。

19.2 多层结构能增强表示能力

让模型学习不同层次的时序特征。

19.3 深层循环网络既有时间方向传播,也有层方向传播

这使它形成了二维网格式结构。

19.4 在框架中通常通过num_layers实现

这是最直接的工程接口。

19.5 深层结构常和 GRU、LSTM 搭配使用

因为门控单元更适合训练较深的循环模型。


20. 学习感悟

这一节很有意思,因为它让你意识到:

循环神经网络不只是“会记忆”,它也可以像其他深度模型一样“分层理解”。

也就是说,序列建模不只是沿时间走得更远,
还可以沿层次走得更深。

这让循环网络的能力从“记住顺序”进一步提升到:

分层地理解顺序

这也是为什么深层循环模型在很多复杂序列任务中会更有表现力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询