Skip to content

RNN 与序列建模

本页速览 循环神经网络是为序列数据设计的递归架构,是语言模型、机器翻译与语音识别的地基。本文拆解 RNN 展开图、BPTT 与梯度消失、LSTM 三门结构与 GRU,对比 Transformer 的差异,并盘点流式语音、在线预测等现存场景。

RNN 与序列建模

一句话定义:循环神经网络(Recurrent Neural Network, RNN)是在时间维度上共享权重的网络,通过"隐藏状态"把过去的输入逐步传递下去,从而显式建模序列的先后依赖——它是深度学习处理"带顺序的数据"的第一代主力架构(想先建立整体画面可读深度学习总体架构解剖)。

一、为什么序列需要专门的网络

语言、语音、视频、时间序列的共同点是:元素之间有顺序,且顺序携带信息。"我打你"和"你打我"是同样的三个字,语义完全不同;股票今天和昨天的价格有关联。用普通的神经网络基础处理序列有两种笨办法:

  1. 把整条序列拼成一个超长向量——长度不定没法对齐,还丢失位置结构;
  2. 滑窗取固定长度——窗口外的长程依赖永远看不到,窗口内也只是"特征拼接"而非"时间推理"。

RNN 的回答是循环:同一套权重(W)在每个时间步重复使用,把上一步的隐藏状态 $h_{t-1}$ 与当前输入 $x_t$ 一起算出新状态 $h_t$。这样网络就有了"记忆",而且不管序列多长,参数量恒定——这正是权值共享思想在时间维度的翻版(空间维度的翻版见CNN 与计算机视觉)。

二、RNN 原理与展开图

单个时间步的计算(以 tanh 版本为例):

$$ h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b) $$

输出(若每步都要)为 $y_t = W_{hy} h_t + b_y$。把一个 RNN 按时间展开,就是一张"每个时刻复刻同一组参数"的前馈网络:

x1 → h1 → x2 → h2 → x3 → h3 → … → xt → ht → yt

展开之后,RNN 退化成"非常深的共享权重网络",深度等于序列长度。这个视角非常关键——它解释了 RNN 的数学本质,也预告了它的命运(后文 BPTT 一节)。

RNN 的变体按输入输出关系分四类:many-to-one(整句情感分类)、one-to-many(图生文)、many-to-many 同步(逐帧标注)、many-to-many 异步(机器翻译的编码器-解码器)。

三、BPTT 与梯度消失

训练 RNN 用沿时间反向传播(Backpropagation Through Time, BPTT):先把序列展开成前馈图,再按反向传播与自动微分的链式法则求梯度,只是对共享权重 W 要累加所有时间步的贡献。

问题出在链式法则的连乘上。误差要穿过 $k$ 个时间步,梯度里就会出现 $k$ 个 $\tanh'$(≤1)和 $W$ 的连乘:

$$ \frac{\partial L}{\partial h_{t-k}} \propto \prod_{i=1}^{k} \text{diag}(\tanh'(h_{t-i})) , W_{hh} $$

当 $W_{hh}$ 的最大奇异值 < 1,连乘随 $k$ 指数衰减→梯度消失,网络记不住远距离的信息;> 1 则指数爆炸→梯度爆炸(好在可用梯度裁剪兜底)。于是经典 RNN 的实际有效记忆只有约 5~10 步。这解释了为什么 RNN 学不会"主语和几十个词后的谓语保持一致"这类长程依赖。

本质

梯度消失不是"bug",而是深度与共享权重结构下的数学必然:任何把深度网络误差信号经过大量非线性连乘的架构都会遇到它。RNN 的深度=序列长度,所以它首当其冲。缓解手段的一大部分见初始化与归一化,但结构级修复要交给 LSTM。

四、LSTM 三门结构与 GRU

LSTM(长短期记忆,1997)

LSTM 的核心是给网络加一条"细胞状态传送带" $C_t$:信息沿时间轴直通,误差可以无损耗地传很远。它的控制机关是三个门(都用 sigmoid 输出 0~1 的"开度",并用 tanh 生成候选值):

  • 遗忘门 $f_t = \sigma(W_f [h_{t-1}, x_t] + b_f)$:决定旧细胞状态留多少;
  • 输入门 $i_t = \sigma(W_i [h_{t-1}, x_t] + b_i)$:决定新信息写多少;
  • 输出门 $o_t = \sigma(W_o [h_{t-1}, x_t] + b_o)$:决定当前状态对外暴露多少。

细胞状态更新 $C_t = f_t \odot C_{t-1} + i_t \odot \tilde C_t$,隐藏状态 $h_t = o_t \odot \tanh(C_t)$。关键看 $C_t$ 那条线:它只有一次逐元素乘加,误差可以近乎恒等地穿回去,从而把有效记忆窗口从 5~10 步拉到数百步。

GRU(门控循环单元,2014)

GRU 是 LSTM 的"精简版":把三个门合并成更新门重置门两个,不单独保留细胞状态,参数比 LSTM 少约 1/3。实践中 GRU 与 LSTM 效果相当、训练更快,在小数据集上常被优先选择。选型经验:数据少选 GRU,追求极致长程或已有 LSTM 基建选 LSTM,两者几乎总能被更大规模的 Transformer 架构压过。

五、序列任务

  • 语言模型:按"预测下一个词"训练,是 N-gram 的神经化,也是后来大语言模型(LLM)的雏形。RNN-LM 靠隐藏状态记忆上文,配合 softmax 输出词表概率(输出层设计见损失函数与输出层);
  • 机器翻译:编码器把源语言"读"成语义向量,解码器逐词生成目标语言。Bahdanau 注意力(2015)让解码器在每一步"回看"编码器的关键位置,这个机制后来在 Transformer 中被推到极致(见注意力机制);
  • 语音识别/合成:RNN/LSTM 曾长期是语音模型的主力(WaveNet 也含扩张因果卷积),至今流式语音场景仍有应用,详见语音与音频
  • 时间序列预测:销量、流量、股票预测,RNN 依然是与 CNN、Transformer 并列的常见基座之一。

六、与 Transformer 的对比

2017 年 Transformer 几乎在所有序列任务上取代了 RNN,对比要理解"为什么":

维度RNN / LSTMTransformer
并行性串行:$h_t$ 依赖 $h_{t-1}$,无法并行自注意力一次性看到整句,可完全并行
长程依赖靠门控缓解,仍受路径长度限制任意两位置路径长度为 1,直接建模
计算复杂度(序列长 n)每步 O(1),总 O(n),能流式处理每层 O(n²),长序列昂贵(有 FlashAttention 等优化)
归纳偏置天然的"顺序感",小数据更友好依赖位置编码注入顺序
成本便宜、可部署在端侧大模型需要海量算力

RNN 输在了"串行"这个根子上:GPU 并行能力无法发挥,序列一长训练就极慢,而注意力的 O(n²) 在长度适中时完全可接受。但注意 RNN 有 Transformer 没有的特性:状态是定长的、恒定的推理开销、天然流式——这正是它至今仍存活的原因(见下节)。

七、现存场景

"Transformer 取代 RNN"是主流叙事,但工程世界是多元的:

  • 流式语音识别:边听边识别要求"当前输出只依赖已输入的部分",RNN/TDNN 等因果结构天然合适,可实时推理且延迟恒定;
  • 在线预测与边缘部署:设备端时间序列预测(心跳、传感器)、增量式在线学习,RNN 状态小、无二次复杂度,比注意力更省;
  • 状态空间模型的理论对照:Mamba 等新模型把 RNN"定长状态、线性复杂度"的思想重新发扬,可视为 RNN 的现代复兴——也提醒我们:架构会过时,思想会循环

学习建议

RNN/LSTM 可能不再是你简历上的"主力武器",但它浓缩了深度学习最核心的三件事:共享权重、时间展开、梯度消失的本质。把这些吃透,理解 Transformer 的 Pre-Norm、残差和 KV cache(见Transformer 架构)都会顺畅得多。

八、权衡与取舍

  • RNN vs 注意力:序列长且要流式→RNN/状态空间模型;离线训练、需要强长程建模→注意力;
  • LSTM vs GRU:参数与效果几乎等价,选实现简单、生态好的那个,别在两者间纠结过度;
  • 单向 vs 双向:双向 LSTM 能看到未来上下文、效果更好,但无法流式——语音/翻译的线上系统常被迫回到单向;
  • 深度与训练难度:堆叠多层 LSTM 有收益但梯度仍有限,务必备好梯度裁剪与合适的初始化(见训练配方与调参)。

延伸阅读

参考资料