
RNN 处理序列数据的基本原理1. 核心思想带记忆的循环结构传统前馈网络MLP/CNN处理的是固定大小的独立输入每个输入之间没有关联。RNN 的关键创新是引入了隐藏状态hidden state在时间步之间传递信息形成对序列的记忆。时间步 t1: h₁ f(W_xh · x₁ W_hh · h₀ b) 时间步 t2: h₂ f(W_xh · x₂ W_hh · h₁ b) 时间步 t3: h₃ f(W_xh · x₃ W_hh · h₂ b) ...其中xₜ当前时间步的输入hₜ₋₁上一时间步的隐藏状态即记忆hₜ当前时间步的隐藏状态W_xh、W_hh所有时间步共享的权重矩阵f非线性激活函数通常为 tanh 或 ReLU2. 展开图示RNN 在时间维度上展开后等价于一个深层网络x₁ → [RNN cell] → h₁ → [RNN cell] → h₂ → [RNN cell] → h₃ → ... ↑ ↑ ↑ h₀ h₁ h₂每个时间步接收当前输入xₜ和前一步隐藏状态hₜ₋₁计算新的隐藏状态hₜ可选地输出yₜ g(W_hy · hₜ b)3. 参数共享的意义RNN 在所有时间步使用同一组参数W_xh、W_hh、W_hy这带来两个关键优势模型大小与序列长度无关无论输入序列有 10 个词还是 1000 个词参数量不变位置无关的规律学习序列中出现的模式无论在哪个位置都能被同一组参数捕获为什么能处理变长输入RNN 处理变长输入的能力来自以下机制机制一逐步处理无需预知长度RNN 按时间步逐个处理输入每一步只看一个元素。不需要预先知道序列总长度循环结构天然支持处理到序列结束为止序列 A (长度 3): x₁ → x₂ → x₃ → 结束 序列 B (长度 5): x₁ → x₂ → x₃ → x₄ → x₅ → 结束同一个 RNN cell 可以处理任意长度的序列因为参数共享不依赖序列长度。机制二灵活的输入输出模式RNN 通过不同的输入输出配置适配各种变长场景(1) 多对多等长序列标注 x₁ → h₁ → y₁ x₂ → h₂ → y₂ x₃ → h₃ → y₃ (2) 多对一文本分类 x₁ → h₁ x₂ → h₂ x₃ → h₃ → y 只用最后一步的隐藏状态做分类 (3) 一对多文本生成 x₁ → h₁ → y₁ → y₂ → y₃ (4) 多对多不等长机器翻译Encoder-Decoder 编码器: x₁ → h₁, x₂ → h₂, x₃ → h₃ → context 解码器: context → y₁ → y₂ → y₃ → y₄机制三填充与打包工程实现实际工程中为了批量训练通常用Padding Packing处理变长原始批次: 序列1: [a, b, c] 长度 3 序列2: [d, e] 长度 2 序列3: [f, g, h, i, j] 长度 5 Padding 到等长: 序列1: [a, b, c, PAD, PAD] 序列2: [d, e, PAD, PAD, PAD] 序列3: [f, g, h, i, j] Packing记录真实长度跳过 PAD 位置的计算: → RNN 只在真实 token 上运算不浪费计算资源PyTorch 中对应pack_padded_sequence/pad_packed_sequence。RNN 的核心问题虽然 RNN 能处理变长序列但存在一个严重缺陷——梯度消失/爆炸反向传播时梯度沿时间链式传播: ∂L/∂h₁ ∂L/∂h₃ · (∂h₃/∂h₂) · (∂h₂/∂h₁) ↑ ↑ 每步都乘 W_hh连乘 T 次 当 T 很大时: ||W_hh|| 1 → 梯度爆炸 ||W_hh|| 1 → 梯度消失长距离依赖丢失这导致标准 RNN 实际只能捕获5-10 步以内的依赖关系。后续改进方案模型解决方式LSTM引入门控机制遗忘门、输入门、输出门 细胞状态让梯度有高速公路直通GRULSTM 的简化版合并门控减少参数Transformer彻底放弃循环结构用自注意力直接建模任意距离的依赖总结RNN 处理序列数据的基本原理是通过隐藏状态在时间步之间传递信息形成对历史输入的记忆且所有时间步共享同一组参数。它能处理变长输入的根本原因是逐步循环处理 参数共享——模型结构不绑定固定长度循环可以自然地进行到序列结束。但其梯度链式传播的特性导致长距离依赖建模困难这也是 LSTM/GRU/Transformer 相继出现的直接动因。