跳到主要内容

循环神经网络

循环神经网络(RNN)在时间步之间复用参数并传递隐藏状态:

ht=ϕ(Wxhxt+Whhht1+bh),ot=Whoht+bo.\mathbf{h}_t =\phi(W_{xh}\mathbf{x}_t+W_{hh}\mathbf{h}_{t-1}+\mathbf{b}_h), \qquad \mathbf{o}_t=W_{ho}\mathbf{h}_t+\mathbf{b}_o.

ht\mathbf{h}_t 是为当前目标学习出的有限维摘要,不是原始历史的无损存储。这个压缩既是 RNN 的流式优势,也是长程信息丢失的来源。

序列目标不是一种

形式输出例子关键边界
many-to-one最后或汇聚后的状态序列分类最后状态是否能保留早期证据
many-to-many(对齐)每个时间步标注、预测padding 与 mask 是否正确
自回归下一个 token/值语言、时间序列训练输入与生成输入不同
encoder–decoder条件输出序列翻译单一 context 可能成为瓶颈

自回归分解为

p(x1:T)=t=1Tp(xtx<t).p(x_{1:T})=\prod_{t=1}^{T}p(x_t\mid x_{<t}).

teacher forcing 在训练时喂入真实前缀;推理时模型看到自己的历史错误,因此训练损失低不保证自由生成稳定。这种差异常称 exposure bias,但修复方式取决于任务,不能仅靠更长训练消除。

时间反向传播为何不稳定

把循环展开后,从时刻 tt 回传到 kk 的局部项包含 Jacobian 连乘:

hthk=j=k+1tdiag ⁣(ϕ(zj))Whh.\frac{\partial\mathbf{h}_t}{\partial\mathbf{h}_k} =\prod_{j=k+1}^{t} \operatorname{diag}\!\left(\phi'(\mathbf{z}_j)\right)W_{hh}.

如果连乘方向反复缩小,梯度消失;如果反复放大,梯度爆炸。序列长度、权重谱、激活饱和和数据轨迹共同作用,不能只用“RNN 太旧”解释。

  • gradient clipping 限制大更新,但不恢复已消失的梯度;
  • truncated BPTT 降低内存与计算,同时截断远距离 credit assignment;
  • 合理初始化、归一化和门控可改善训练,但不是无限记忆保证。

为明确连乘顺序,令 Jj=diag(ϕ(zj))WhhJ_j=\operatorname{diag}(\phi'(z_j))W_{hh},则上式的乘积为 JtJt1Jk+1J_tJ_{t-1}\cdots J_{k+1};矩阵因子一般不能倒序。同一组循环参数在每个时间步复用,因此其梯度要累加所有使用位置的贡献,包括经过后续状态的间接路径。这正是 BPTT 梯度问题背后的链式法则机制。

以下面的平滑递推为例,取 α=1/2\alpha=1/2h0=0h_0=0、输入 [2,0,4][2,0,4],状态依次为 [1,0.5,2.25][1,0.5,2.25]。三步后对 h0h_0 的敏感度为 α3=1/8\alpha^3=1/8。若在第二步后 detach 状态,下一步前向计算仍使用 0.50.5,但梯度不再传回此前片段。detach 与重置状态不同。对有填充的序列,如果后续使用最终状态,仅屏蔽损失还不够:应跳过填充位置的状态更新,或选取最后一个有效状态。

LSTM 的门控路径

长短期记忆网络(LSTM)除了隐藏状态 ht\mathbf h_t,还维护一个细胞状态 ct\mathbf c_t。遗忘门 ft\mathbf f_t 调节旧细胞状态的保留量,输入门 it\mathbf i_t 调节候选更新 c~t\tilde{\mathbf c}_t 的写入量,输出门 ot\mathbf o_t 则控制细胞状态如何形成隐藏状态。这里 σ\sigma 是 Sigmoid 函数,\odot 表示逐元素相乘,[ht1,xt][\mathbf h_{t-1},\mathbf x_t] 表示拼接两个向量。注意,下式的 ot\mathbf o_t 是输出门,不是开头 RNN 公式中的输出分数。一种常见写法是:

ft=σ(Wf[ht1,xt]+bf),it=σ(Wi[ht1,xt]+bi),\mathbf{f}_t=\sigma(W_f[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_f), \quad \mathbf{i}_t=\sigma(W_i[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_i), c~t=tanh(Wc[ht1,xt]+bc),ct=ftct1+itc~t,\tilde{\mathbf{c}}_t=\tanh(W_c[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_c), \quad \mathbf{c}_t=\mathbf{f}_t\odot\mathbf{c}_{t-1}+\mathbf{i}_t\odot\tilde{\mathbf{c}}_t, ot=σ(Wo[ht1,xt]+bo),ht=ottanh(ct).\mathbf{o}_t=\sigma(W_o[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_o), \quad \mathbf{h}_t=\mathbf{o}_t\odot\tanh(\mathbf{c}_t).

加法 cell-state 路径让信息和梯度更容易跨步传播。门的值是学习出的软控制,不等于可解释的“记忆开关”;不同实现还可能改变 bias、projection、peephole 或 gate 顺序。

示例:用一个状态做流式平滑

设标量状态

ht=αht1+(1α)xt,0<α<1.h_t=\alpha h_{t-1}+(1-\alpha)x_t, \qquad 0<\alpha<1.

这就是指数移动平均。它每步只需常数内存,新样本权重为 1α1-\alpha,距当前 mm 步的样本权重为 (1α)αm(1-\alpha)\alpha^m

这个例子展示了两面:RNN 无需保存完整序列即可在线更新;但早期信息按固定规律衰减,无法在需要时重新读取某一个旧值。学习出的 RNN 更灵活,却仍受有限状态和训练信号约束。注意力通过保存并按内容访问多个位置,改变了这一权衡。

状态、方向和数据边界

  • causal RNN 只看当前与过去,可用于流式预测;
  • bidirectional RNN 同时用未来上下文,不适用于未来尚不可见的在线决策;
  • batch 中的 padding 必须 mask;序列长度不能由 padding 泄露标签;
  • 隐状态应在独立实体之间重置,除非跨边界传递有明确语义;
  • 按随机窗口切分时间序列可能让相邻或重叠片段落入训练和测试。

最后一项是数据泄漏,不是架构性能。应按实体和时间设计划分。

RNN 之后的状态式序列模型

经典 RNN 不是状态式建模的终点。结构化状态空间模型(SSM)从连续或离散线性状态方程出发,利用结构化参数和并行算法兼顾长序列训练与递归推理。S4 展示了结构化 SSM 的长序列能力;Mamba 又让部分状态更新依赖输入,并用硬件感知 scan 实现;xLSTM 则继续修改 LSTM 的记忆与门控。

这些名称不能混为一种架构:

  • 经典 RNN 的非线性状态转移与 SSM 的结构化状态方程不同;
  • Mamba 论文中的线性序列扩展描述算法路径,不保证任何长度、硬件和 batch 下都比 attention 快;
  • xLSTM 延续门控循环路线,不等于“LSTM 已重新赢过 Transformer”;
  • 论文 benchmark 绑定数据、规模、kernel 与训练预算,需要目标任务复现。

截至 2026-08-11,这些方案应视为重要的竞争设计,而非新的永久默认。

RNN、SSM 与全自注意力

维度经典 RNN / 部分 SSM全自注意力
训练路径RNN 串行;结构化 SSM 可并行 scan/convolution同层位置可并行
推理状态可固定或受控大小常见 KV cache 随上下文增长
历史访问压缩进状态直接访问已表示的位置
长程代价依赖状态动力学与选择机制score 计算通常随长度平方增长
适合反例流式传感器、低内存、长序列大规模并行和灵活内容检索

因此“Transformer 出现后 RNN 无用”和“线性时间 SSM 必然取代 attention”都是过度概括。真正的选择依赖延迟、内存、序列长度、训练规模、kernel 与任务结构。

最小实验

  1. 用短序列 overfit 检查实现;
  2. 测试 mask 后改变 padding 是否影响输出;
  3. 打乱状态边界,确认测试能捕获污染;
  4. 分别报告 teacher-forced loss 与自由运行结果;
  5. 按时间/实体切分并与无状态、季节性或移动平均基线比较;
  6. 记录梯度范数、截断长度、隐藏维度和失败 seed。

本文偏重经典离散序列和监督训练;不覆盖所有现代状态空间模型、连续时间模型或序列决策方法。

探索关联打开关联网络