动手学深度学习——深层循环神经网络

张开发
2026/4/15 23:40:29 15 分钟阅读

分享文章

动手学深度学习——深层循环神经网络
1. 前言前面我们已经顺着李沐这条线依次学习了RNNRNN 从零开始实现RNN 简洁实现GRUGRU 代码LSTMLSTM 代码到这里我们已经掌握了一个非常重要的主线循环神经网络的核心不在于“是不是循环”而在于“状态如何沿时间传递、如何管理记忆”。但是前面学的这些模型还有一个共同点默认都只有一层循环层。也就是说在每个时间步上输入只经过一层循环单元处理。这当然已经能建模序列但一个很自然的问题是如果一层学到的表示还不够强能不能像卷积网络、前馈网络那样把循环层也堆叠起来答案就是可以。这就引出了这一节的主题深层循环神经网络Deep RNN2. 什么叫“深层”循环神经网络“深层”两个字并不是说时间步更多而是说在同一个时间步内不止有一层循环单元而是有多层循环层堆叠。也就是说原来单层 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 结构中这个问题会更明显。所以实际中深层循环网络往往更常配合GRULSTM正则化梯度裁剪一起使用而不是简单地把基础 RNN 一层层硬堆上去。10. 深层 RNN 和深层前馈网络有什么共同点它们的思路本质上是相通的单层前馈网络表达能力有限。深层前馈网络通过多层变换逐步提炼表示。单层循环网络每个时间步上的表示层次有限。深层循环网络在时间步内部增加层次让表示更丰富。所以深层 RNN 其实就是把“深度学习”里的“多层特征抽象”思想引入到了序列建模中。11. PyTorch 里深层 RNN 怎么实现这一节在代码层面最核心的一点通常是PyTorch 已经帮我们把多层循环封装好了。例如在nn.RNN、nn.GRU、nn.LSTM中都可以通过一个参数直接指定层数num_layers例如rnn_layer nn.LSTM(input_sizevocab_size, hidden_sizenum_hiddens, num_layers2)这就表示使用两层 LSTM每层都有自己的隐藏状态第 1 层输出会作为第 2 层输入也就是说深层循环网络在框架里实现起来其实非常自然。12.num_layers2到底意味着什么当你写num_layers2并不是说序列长度翻倍了或者模型重复看两遍输入而是说每个时间步都会顺序通过两层循环单元。例如时间步t原始输入X_t进入第 1 层第 1 层输出作为第 2 层输入第 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. 学习感悟这一节很有意思因为它让你意识到循环神经网络不只是“会记忆”它也可以像其他深度模型一样“分层理解”。也就是说序列建模不只是沿时间走得更远还可以沿层次走得更深。这让循环网络的能力从“记住顺序”进一步提升到分层地理解顺序这也是为什么深层循环模型在很多复杂序列任务中会更有表现力。

更多文章