趋近智
requires_grad)backward()).grad)torch.nn 搭建模型torch.nn.Module 基类torch.nn 损失)torch.optim)torch.utils.data.Datasettorchvision.transforms)torch.utils.data.DataLoader前馈网络是独立处理输入的。然而,许多问题都涉及序列数据,其中顺序很重要,并且先前项的背景信息会影响当前项。例如,理解一个句子、预测股价或转录语音。每个词、价格点或声音片段都依赖于它之前的内容。标准的前馈网络缺乏一种内在机制来‘记住’序列中的过去信息。
这就是循环神经网络(RNN)的作用所在。它们通过引入循环的构想,专门设计用于处理序列数据。
RNN 的决定性特征是其内部循环。在处理序列的每一步,网络不仅考虑当前输入,还会考虑它从先前步骤中保留下来的信息。这些保留的信息存储在所谓的隐状态中。
设想你正在阅读一个句子。你不会孤立地处理每个词。你对当前词的把握会受到你已阅读词语的很大影响。RNN 中的隐状态就像这种运行中的总结或背景信息。它捕获了序列中先前元素的相关信息。
RNN 一次处理序列中的一个元素(或“时间步”)时。对于每个时间步 t:
重要的是,每个时间步都使用相同的一组权重(结合输入和先前状态以及生成输出的规则)。这种权重共享使得 RNN 效率高,并能使其将模式推广到不同长度的序列。
通常,通过在时间上“展开”RNN 会有所帮助。我们可以绘制一条链来表示网络在每个时间步的状态,而不是绘制循环。
一个在时间上“展开”的 RNN。相同的 RNN 单元(代表共享权重)处理输入 xt 和先前的隐状态 ht−1,以生成新的隐状态 ht 和可选的输出 yt。隐状态从一个时间步传递到下一个时间步。
从数学角度看,简单 RNN 单元在时间步 t 内的核心计算通常表示为:
计算新的隐状态 ht:
ht=tanh(Whhht−1+Wxhxt+bh)计算输出 yt:
yt=Whyht+by这里:
重要之处在于 ht 的循环公式,它同时依赖于当前输入 xt 和先前的隐状态 ht−1。正是这种依赖性赋予了 RNN 记忆能力。
RNN 在处理序列模式的任务中表现出色:
尽管功能强大,但像上面描述的简单 RNN 在学习长距离依赖时可能会遇到困难。来自早期时间步的信息在通过多个步骤传播时可能会被稀释或丢失,这个问题通常被称为梯度消失问题。反之,梯度有时可能会变得过大,这被称为梯度爆炸问题。
这些挑战促成了更精密的循环架构的发展,如长短期记忆(LSTM)和门控循环单元(GRU),它们使用门控机制来更好地控制信息流和记忆。本章稍后将简要提及这些内容。
目前,掌握循环的核心思想、隐状态的作用以及逐步处理过程就足够了。在接下来的部分中,我们将了解如何使用 PyTorch 的 nn.RNN 模块实现一个基本的 RNN。
这部分内容有帮助吗?
nn.RNN 模块的官方文档,展示了如何在 PyTorch 中实现基本的循环层。© 2026 ApX Machine Learning用心打造