RNN,也就是循环神经网络,是一种为序列数据设计的神经网络,比如文本、语音或时间序列。在每一步中,它都会把当前输入与前一步的隐藏状态结合起来,因此当前输出可以依赖之前出现过的信息。
这就是它的核心思想:RNN 具有一种持续运行的记忆。LSTM 是一种带门控机制的 RNN,当重要信息需要跨越很多步保留下来时,它能更谨慎地管理这份记忆。
RNN 在每个时间步做什么
在时间步 ,一个简单的 RNN 会按如下规则更新隐藏状态:
这里, 是当前输入, 是前一个隐藏状态, 是新的隐藏状态。矩阵 、 和偏置 都是在训练过程中学习得到的。
如果模型还会在每一步产生输出,一个常见形式是:
具体的输出规则取决于任务本身。有些问题需要每一步都输出,而另一些只使用最终的隐藏状态。
为什么隐藏状态很重要
前馈神经网络看完一个输入就继续处理下一个。RNN 会重复利用前一步计算的一部分结果。正是这种重复利用,让它适合处理文本、语音、时间序列以及其他有顺序的数据。
你可以把隐藏状态理解成模型在每一步之后写给自己的一张简短便条。下一步会读取这张便条,对它进行更新,再把修改后的版本继续传下去。
如果你改变同一组输入的顺序,隐藏状态通常也会随之改变。也就是说,序列顺序是重要的。
RNN 示例
真实的 RNN 通常使用向量和非线性激活函数。为了让计算更容易看清,我们先用一个只有单个数值的玩具状态:
现在处理序列 、、。
第一步:
第二步:
第三步:
这里真正重要的不是这个公式本身,而是它依赖前一个状态。在第 2 步,更新不仅使用了 ,还使用了从第 1 步传下来的信息。这正是 RNN 的核心思想。
如果你交换顺序,改成 、、,那么:
虽然出现的是同样几个数字,但最终状态已经不同了。这正说明为什么 RNN 是序列模型,而不是把输入当成无序集合的模型。
为什么基础 RNN 难以处理长序列
在基础 RNN 中,较早的信息必须经过很多次重复更新才能一直保留下来。如果序列很长,这会变得困难。有用的信号可能逐渐衰减,而在训练时,梯度也可能在跨越很多步时变得很小或迅速爆炸。
这就是为什么普通 RNN 在任务依赖于序列中很久之前的信息时,往往表现不佳。问题不在于循环这种机制本身有错,而在于用简单的隐藏状态更新来维持长程记忆并不容易。
LSTM 如何改进 RNN 的记忆能力
LSTM 是 long short-term memory 的缩写,中文通常叫长短期记忆网络。它是一种带门控机制的 RNN。它引入了一条结构更清晰的记忆通路,通常称为细胞状态(cell state),同时还有一些门来控制哪些信息被遗忘、哪些新信息被写入,以及哪些部分作为输出暴露出来。
你不需要写出完整的门控方程,也能理解它的重点。这样的设计让模型对记忆有了更强的控制能力。如果某个细节需要跨越很多步保留下来,LSTM 通常比普通 RNN 更有能力做到这一点。
但这并不意味着 LSTM 会永远记住所有内容。它的意思是,这种结构更擅长学习什么时候保留信息,什么时候丢弃信息。
用通俗的话理解 RNN 和 LSTM 的区别
基础 RNN 只有一个持续更新的状态,并不断重复更新它。LSTM 则在这个思路外增加了更强的记忆机制。
如果序列较短,而且依赖关系比较局部,普通 RNN 可能已经足够。如果任务依赖于序列中更早之前的信息,LSTM 往往是更稳妥的选择。
RNN 和 LSTM 的常见误区
以为 RNN 会一次性看到整个序列
通常不是。标准的处理方式是一步一步地处理,并把状态向前传递。
认为 LSTM 能完美解决记忆问题
它确实有助于处理长程依赖,但它仍然是一个经过训练的模型,容量有限,也有实际限制。
忽视序列顺序
RNN 就是为有序数据设计的。打乱序列元素会改变计算结果。
把隐藏状态当成人类可读的记忆
隐藏状态是模型学到的数值表示,不是像句子那样清晰可读的摘要。
RNN 和 LSTM 用在什么场景
它们常用于语言建模、语音、手写识别、传感器数据流和时间序列预测等序列问题。如今,很多语言任务更常使用 transformer,但 RNN 和 LSTM 仍然重要,因为它们能非常清楚地展示序列记忆的概念,而且在较小规模或特定场景中依然有用。
自己动手试一试
自己写一个四步序列,并应用这个玩具规则 。然后交换其中两个输入的顺序,再比较最终状态。这个小实验会比只看缩写更清楚地说明“循环”到底起了什么作用。
如果你还想比较另一种情况,可以把本页和 transformer 或马尔可夫链的讲解放在一起看,观察每种模型是如何利用过去信息的。