循环神经网络 RNN、LSTM、GRU 是什么?为什么能处理序列?

循环神经网络是什么?机器如何学会"记住"过去
上篇我们聊完CNN,看它怎么像放大镜一样,逐块扫图像、提取特征。
但有一类数据,CNN处理起来很吃力——什么数据呢?
有时间顺序的数据。
你跟 Siri 说的那句"嘿,明天早上七点叫我起床"——这串声音信号得按顺序听完,才能理解意思。少听任何一个字,意思就变了。
这种"前面影响着后面"的数据,就是序列数据。
今天咱们来看看,专门处理这类数据的循环神经网络(RNN),是怎么工作的。
什么是序列数据?
先说清楚我们要对付的是什么。
序列数据,就是按顺序排排坐、后面的人跟前面有关联的数据。
举个例子:
- 文本:读句子"这个小哥长得真__",填"帅"还是"丑"?得看前面说的是好话还是坏话。
- 语音:听到"java"是咖啡还是编程语言?得结合前后语调判断。
- 股票价格:今天涨了,昨天呢?上周呢?光看今天啥也不知道。
- 视频:前一帧是狗跑过去,下一帧可能就是这个狗的特写。
这类数据的共同点:顺序即信息。
你把一句话的词打乱顺序,意思可能全变了。但把一张图片的像素打乱,CNN 还能认出是只猫。
这就是序列数据和空间数据的本质区别。
传统神经网络假设每个输入都是独立的,看完就忘。但序列数据需要记着前面,才能理解后面。
机器怎么做到?
靠 RNN。

RNN的基本原理——让网络拥有"记忆"
RNN 的全称是 Recurrent Neural Network,循环神经网络。
"循环"这两个字很关键。
普通神经网络:输入 → 输出,然后就结束了。
RNN:输入 → 处理 → 输出,同时把自己算出来的东西再塞回来,传给下一步。
什么意思?
想象你在追剧。
第一集看完,你脑子里有了印象:谁是谁、啥关系。第二集来了,你不傻站着重新认识所有人,而是结合已经记住的印象继续看。
第三集、第四集同理。每集都在旧的记忆上加新内容。
RNN就是这么工作的。
它在每个时间步,都会把"上一步算出来的结果"和"这一步的新输入"放一起,一起决定"这一步该输出什么"。
这就叫隐藏状态(hidden state)——就是网络此刻的"记忆"。
用一个公式表示:
当前隐藏状态 = f(当前输入, 上一步隐藏状态)你看,这个f是同一个函数。每一步都用同样的规则处理输入和记忆。
这叫参数共享——一个大脑处理所有时间步,而不是每一步都长个新脑子。

画成展开图就是这样:
t=1 时刻:输入x₁ + 初始记忆h₀ → 输出h₁
t=2 时刻:输入x₂ + h₁(记忆) → 输出h₂
t=3 时刻:输入x₃ + h₂(记忆) → 输出h₃
……
每一步的输出,既给当前用,也传给下一步。
循环就是这样形成的。
BPTT——RNN是怎么学习的
现在你理解了 RNN 的工作流程:记住过去,理解现在。
但还有一个问题:RNN 怎么知道该记住什么?
它得学习。
RNN 用的是 BPTT 算法,全称 Backpropagation Through Time——穿越时间的反向传播。
名字挺唬人,其实原理不复杂。
神经网络的学习都靠反向传播:算出来的结果跟正确答案比一比,错了就往回找原因,告诉网络"你哪里算错了、该往哪改"。
RNN 也是这个思路,只是它的时间步展开了。
从最后一个时间步,一路往前推。看看最终结果错在哪,然后一级一级往前问:"你们谁的责任更大?"
这就是"穿越时间"的含义——从结果倒推到开头。
但问题来了。
序列很长的时候,这种"问责链"就很长。开头的信息要传到结尾,就像跑一场马拉松。
信号每传一层,可能会变强(梯度爆炸)或变弱(梯度消失)。
什么意思?
- 梯度爆炸:网络学过头了,一改就改得特别大,参数乱跳,训练不稳定
- 梯度消失:网络学不动了,前面的信息传过来已经弱到忽略不计,根本学不会长依赖
你想想,让你复述一部两小时电影的全部情节,从头讲到尾细节还能对?
很难对吧。人脑也有类似问题,叫"遗忘"。
RNN 的问题是:短期记忆还行,长期记忆不太行。
这就是 RNN 的局限性。
那怎么办?
聪明的研究者给 RNN 加了点东西,发明了 LSTM。
LSTM——给记忆装上"阀门"
LSTM,Long Short-Term Memory Networks,长短期记忆网络。
名字已经透露了关键:它想解决"长期依赖"的问题。
怎么做到的?
它给网络加了一套门控机制。
你可以把 LSTM 想象成一个有策略的秘书。不是所有信息都往脑子里塞,而是先过一遍安检:该记的记,该忘的忘。
具体来说,LSTM 有三个门:
1. 遗忘门
决定:上次的记忆,哪些该扔掉?
举个例子。
你读小说,第一章记住了"主角叫张三"。读到第五章,主角改名叫李四了。遗忘门就会说:"张三这个名字,忘了它。"
公式长这样:
遗忘门 = σ(Wf · [上一步隐藏状态, 当前输入] + bf)σ 是 sigmoid 函数,输出 0 到 1 之间的值。越接近 0,越该忘掉;越接近 1,越该记住。
2. 输入门
决定:新来的信息,哪些该记住?
你读到第五章,发现主角性格大变。输入门会说:"这个性格特点,很重要,记下来。"
同时,还有一个候选记忆——新鲜滚热辣的新信息,待会儿一起决定加不加进记忆。
3. 输出门
决定:当前时刻,该输出什么?
记忆很多,但不是所有都跟当前任务有关。输出门负责筛选:"现在这个场景,我该让你看到什么?"
还有一个关键创新:细胞状态(Cell State)。
它像一条传送带,信息可以从头传到尾,不用每一步都重新判断该记什么。
这条传送带上,有遗忘门把关,哪些旧记忆该删;也有输入门把关,哪些新记忆该加。
记忆的流动更稳定了,梯度消失的问题也缓解了。

LSTM 的设计很精妙。它不是死板的规则,而是让网络自己学习:什么时候该记住,什么时候该忘记。
读小说遇到转折点,遗忘门自动加强。遇到重要情节,输入门自动激活。
这就是"智能"的体现。
GRU——更简洁的门控高手
LSTM 效果很好,但结构复杂。三个门加细胞状态,参数多,训练慢。
有没有更简单但同样有效的方案?
有。GRU。
GRU,Gated Recurrent Unit,门控循环单元。
它的改进很直接:能用一个门解决的事,就别用两个。
LSTM 有三个门(遗忘、输入、输出),外加一条细胞状态。
GRU 只有两个门:
1. 更新门
合并了 LSTM 的遗忘门和输入门。
它决定:该保留多少旧记忆,该吸收多少新信息。
更新门值高 = 更多保留旧记忆
更新门值低 = 更多接受新信息
2. 重置门
决定:该如何看待过去的记忆。
重置门值高 = 忘掉过去,从头理解
重置门值低 = 结合过去,一起理解
GRU 还取消了细胞状态,隐藏状态直接承担记忆功能。
结构简化了,但核心能力没丢。

实际应用中,GRU 和 LSTM 性能往往不相上下。
怎么选?
- 资源有限、追求效率:选 GRU,参数量少约 25%,训练更快
- 序列很长、依赖关系很复杂:LSTM 的额外结构可能带来一点点优势
- 不确定:先试 GRU,不行再换
大多数场景,GRU 是更务实的选择。
RNN家族一览——各有所长
聊完三个成员,我们来横向对比一下。
| 模型 | 门结构 | 复杂度 | 长期依赖 | 适用场景 |
|---|---|---|---|---|
| 标准RNN | 无 | 最低 | 弱 | 短序列、简单任务 |
| LSTM | 三个门+细胞状态 | 高 | 强 | 长序列、复杂依赖 |
| GRU | 两个门 | 中 | 强 | 长序列、追求效率 |
还有几个值得了解的变体:
双向RNN(Bi-RNN)
普通 RNN 只能"看"过去。但有些任务,"未来"的信息也有用。
比如读"这个电影很___"——填"好看"还是"难看",得看后面有没有"但是"两个字。
双向 RNN 就是同时从前往后、从后往前读,合并两边的信息。
深度RNN
多堆几层隐藏状态,像加深普通神经网络一样加深 RNN,提升表达能力。
但也不是越深越好,训练难度也会增加。
还有一个问题:RNN 过时了吗?
这两年 Transformer 火得一塌糊涂,Attention 机制横扫 NLP 领域。很多人觉得 RNN 该淘汰了。
但未必。
RNN 在处理超长序列、实时流数据、资源受限的场景下,依然有优势。
它的记忆机制是"按顺序"的,不需要像 Transformer 那样两两计算关系。
就好比汽车发明了,自行车也没消失。
最新最强 ≠ 所有场景最优。

记忆的代价与进化
从标准 RNN 到 LSTM 再到 GRU,我们看到了一条清晰的进化路线:
让机器学会更聪明地记忆。
标准 RNN 什么都记,容易忘。LSTM 学会了筛选,但结构复杂。GRU 做了权衡,用更少的资源达到接近的效果。
但万变不离其宗:这些模型都在努力解决同一个问题——如何让信息在时间的长河里有效传递。
你可能会问:为什么非得记住过去?直接"看全身"不行吗?
Transformer 就是这个思路:不靠记忆,靠"一眼看到所有"。
效果确实更好。但代价是计算量随序列长度平方增长。
而 RNN 的计算量是线性增长的。序列越长,这个优势越明显。
所以,没有完美的模型,只有更适合当前场景的模型。
理解 RNN 的工作原理,不只是为了知道一门"老技术",更是理解所有序列模型演进的起点。
下次你对着手机说话被准确识别,或者看到机器翻译流畅输出时,不妨想想背后这些"记忆大师"们的功劳。
不过,记忆终究有极限。
当序列越来越长,依赖关系越来越复杂,RNN 家族就开始吃力了。
怎么办?
下一个突破,就是Attention 机制——让模型学会"重点关注"。
它是怎么工作的?
