下面是 Lecture 5: Recurrent Neural Networks 的系统复习笔记,基于课件内容整理。核心主线是:

序列建模问题 → Vanilla RNN → BPTT 与梯度问题 → LSTM/GRU 门控记忆 → 双向/深层 RNN → Encoder-Decoder → Attention → Transformer → SSM/Mamba

Lecture 5 学习笔记:Recurrent Neural Networks

0. 本章核心目标

本章要解决的问题是:如何建模长度可变、具有时间/顺序依赖的序列数据

普通 feedforward neural network 的输入输出维度通常固定,不能自然处理:

  • 文本句子:长度可变;
  • 语音信号:时间序列;
  • 机器翻译:输入输出长度不同;
  • POS tagging:每个输入 token 对应一个输出 tag;
  • sentiment analysis:整段序列压缩成一个类别。

所以本章的技术演进可以概括为:

固定长度输入输出

RNN:用 hidden state 递归保存历史信息

BPTT:在展开后的时间图上训练

梯度消失/爆炸:长程依赖难学

LSTM / GRU:用门控机制控制记忆保留与更新

BiRNN / Deep BiRNN:引入未来上下文与更深表示

Encoder-Decoder:处理输入输出长度不同的 seq2seq

Attention:解除固定向量瓶颈,让 decoder 动态“看”输入

Transformer:完全用 self-attention 替代 recurrence

SSM / Mamba:为长上下文重新引入硬件友好的 recurrent memory

重要程度标注: ★★★★★ 必考核心★★★★ 高频重点★★★ 理解即可

1. 为什么需要 RNN?【★★★★★】

RNN 的根本动机是处理 variable-length sequences。课件指出,RNN 与 feedforward network 的区别在于:RNN 的连接形成 directed cycle,因此可以使用 internal memory 处理任意长度序列。

1.1 序列任务类型

RNN 的灵活性来自它可以处理不同输入输出结构:

| 类型 | 形式 | 例子 | 重要程度 | | —————– | ———– | ——————- | —– | | One-to-one | 单输入 → 单输出 | 普通神经网络分类 | ★★ | | One-to-many | 单输入 → 序列输出 | Image captioning | ★★★ | | Many-to-one | 序列输入 → 单输出 | Sentiment analysis | ★★★★★ | | Many-to-many,同长度 | 序列输入 → 序列输出 | POS tagging | ★★★★★ | | Many-to-many,不同长度 | 输入序列 → 输出序列 | Machine translation | ★★★★★ |

直觉上,RNN 的核心思想是:

当前输出不仅依赖当前输入 x^(t),还依赖之前积累的状态 h^(t-1)

也就是:

其中 是“到第 (t) 步为止,模型对历史的压缩记忆”。

2. Vanilla RNN 结构与公式【★★★★★】

2.1 基本更新方程

课件中的 Vanilla RNN 更新为:

其中:

  • :第 (t) 个输入向量;
  • :第 (t) 个 hidden state;
  • :上一时刻 hidden state;
  • :输出层 logits;
  • :模型预测的类别概率分布;
  • (U):input-to-hidden 权重矩阵;
  • (W):hidden-to-hidden recurrent 权重矩阵;
  • (V):hidden-to-output 权重矩阵;
  • (b):hidden bias;
  • (c):output bias;
  • :非线性激活函数;
  • :把 logits 转成概率分布。

这里最核心的是 。它让模型把过去的信息传到当前,因此 RNN 可以处理序列。

2.2 概率解释与 Loss【★★★★★】

对于一个输入序列:

以及目标序列:

课件给出的单个训练样本 loss 是:

其中:

  • (L):序列级负对数似然损失;
  • :序列长度;
  • :模型在看过前 (t) 个输入后,对正确标签 的预测概率;
  • 这个概率从 中取出对应 的 entry。

训练目标是最小化所有训练 pair 的总 loss,优化参数:

其中 是 embedding vectors。

直觉: RNN 在每个时间步都做一次预测,因此总 loss 是所有时间步 loss 的求和。

3. BPTT:Backpropagation Through Time【★★★★★】

RNN 训练的关键是 BPTT。课件强调,RNN 需要计算:

这些梯度是在展开后的 computational graph 上通过 backpropagation through time 得到的。

3.1 为什么叫 Through Time?

RNN 参数在所有时间步共享。展开后形式类似:

x^(1) → h^(1) → o^(1) → L^(1)

x^(2) → h^(2) → o^(2) → L^(2)

x^(3) → h^(3) → o^(3) → L^(3)

同一个 (W, U, V) 在每个时间步重复使用。因此总梯度必须把每个时间步对参数的贡献加起来。

3.2 Softmax + Cross Entropy 梯度【★★★★★】

定义:

则标准结果是:

其中:

  • (i):类别 index;
  • :模型对类别 (i) 的预测概率;
  • :indicator function,如果 ,则为 1,否则为 0。

因此:

直觉: 预测概率减真实 one-hot 标签。预测过高的错误类别会被压低,正确类别会被拉高。

3.3 输出层参数梯度【★★★★★】

因为:

所以:

其中:

  • :所有时间步 output bias 的梯度相加;
  • :每个时间步的 output error 与 hidden state 做 outer product 后求和。

3.4 Hidden State 梯度递推【★★★★★】

课件中指出, 到总 loss 有两条路径:

路径 1:h^(t) → o^(t) → L^(t)
路径 2:h^(t) → h^(t+1) → h^(t+2) → ... → future losses

因此:

定义 pre-activation:

定义:

因为:

所以:

合并得到:

并且边界条件:

直觉: 当前 hidden state 的梯度来自当前输出误差,也来自未来时间步通过 recurrent connection 传回来的误差。

3.5 (W, U, b) 的梯度【★★★★★】

由:

得到:

其中:

  • (W):控制历史 hidden state 如何影响当前;
  • (U):控制当前输入如何写入 hidden state;
  • (b):每个时间步共享的 hidden bias;
  • :第 (t) 步 hidden pre-activation 的误差信号。

4. Output Recurrence 与 Teacher Forcing【★★★★】

除了 hidden-to-hidden recurrence,还有一种结构是 output recurrence:上一时刻输出影响下一时刻 hidden/input。课件给出 teacher forcing 的条件似然:

更一般地:

Teacher forcing 的训练方式是:训练时把真实的上一时刻 token 输入给模型,而不是模型自己生成的

优点:

  • 时间步之间可以部分 decouple;
  • 训练更稳定;
  • 可以并行化部分计算。

缺点:

  • 训练时看到真实历史,测试时看到自己生成的历史;
  • 产生 exposure bias;
  • 没有 hidden-to-hidden recurrence 时表达能力更弱。

课件给出的折中方案是:随机选择使用 generated values 或 actual values 作为输入,即类似 scheduled sampling。

5. 梯度消失与梯度爆炸【★★★★★】

这是 RNN 的核心瓶颈。

5.1 线性 RNN 情况

考虑无非线性的 RNN:

则:

若:

则:

其中:

  • 的第 (i) 个特征值;
  • (t-k):梯度需要跨越的时间距离。

如果:

则:

产生梯度爆炸。

如果:

则:

产生梯度消失。

直觉: RNN 的长程梯度本质上是在不断乘同一个矩阵。只要矩阵谱半径不接近 1,梯度就会指数级放大或缩小。

5.2 非线性 RNN 情况

考虑:

则:

其范数满足:

非线性激活的作用是双面的:

  • 它可以 bound recurrent dynamics,因此缓解 exploding gradient;
  • 但如果 (f’) 很小,比如 sigmoid/tanh 饱和区,就会让 vanishing gradient 更严重。

6. 缓解梯度问题的方法【★★★★★】

6.1 Gradient Clipping:解决爆炸【★★★★★】

课件给出 norm clipping:

其中:

  • :原始梯度;
  • :模型参数;
  • :训练目标;
  • :梯度范数阈值。

直觉: 方向不变,只限制梯度长度,防止一次更新过大导致训练崩溃。

6.2 Identity Initialization + ReLU:缓解消失【★★★★】

课件提到可以初始化 recurrent matrix 为单位矩阵:

并使用:

也就是 ReLU。

直觉:

如果 (W = I),那么历史信息更容易原样传递,不会每一步都被压缩或旋转到消失。

但这不是根本解决方案,所以后续引入 LSTM/GRU。

7. LSTM:Long Short-Term Memory【★★★★★】

LSTM 的核心目标是解决 Vanilla RNN 难以学习 long-term dependency 的问题。它通过 cell state 建立一条较稳定的信息高速通道,并用 gates 控制信息的遗忘、写入和输出。

7.1 LSTM 总公式

课件公式为:

其中:

  • :forget gate;
  • :input gate;
  • :output gate;
  • :cell state;
  • :hidden state;
  • :Hadamard prod,即逐元素乘法;
  • :sigmoid 函数,输出在 ([0,1]);
  • :hidden-to-gate 权重;
  • :input-to-gate 权重;
  • :bias。

7.2 Forget Gate【★★★★★】

课件另一种写法:

含义:

  • :保留旧 cell state;
  • :遗忘旧 cell state。

它回答的问题是:

过去的信息哪些应该留下?

7.3 Input Gate 与 Candidate State【★★★★★】

其中:

  • (i_t):决定哪些维度需要更新;
  • :候选新记忆。

它回答的问题是:

当前输入中哪些新信息应该写入记忆?

7.4 Cell State Update【★★★★★】

含义:

新记忆 = 保留下来的旧记忆 + 写入的新候选信息

这是 LSTM 最关键的公式。它让梯度可以沿着 cell state 的加法路径传播,缓解长程依赖中的梯度消失。

7.5 Output Gate【★★★★】

含义:

  • (C_t):内部记忆;
  • (h_t):暴露给外部或下一层的 hidden representation;
  • (o_t):决定哪些记忆对当前输出可见。

它回答的问题是:

记忆中的哪些内容应该用于当前输出?

8. GRU:Gated Recurrent Unit【★★★★★】

GRU 是更简洁的门控 RNN。它没有单独的 cell state,而是直接在 hidden state 上做更新。课件公式为:

其中:

  • :update gate,控制保留多少旧 hidden state;
  • :reset gate,控制生成候选记忆时是否忽略过去;
  • :candidate hidden state;
  • :最终 hidden state。

8.1 Reset Gate 的直觉

如果:

则:

模型生成 时几乎不看过去,相当于“重置记忆”。

8.2 Update Gate 的直觉

如果:

则:

说明主要保留旧状态。

如果:

则:

说明主要使用新候选状态。

9. LSTM vs GRU【★★★★】

| 比较维度 | LSTM | GRU | | —– | ————————- | —————— | | 状态 | hidden state + cell state | 只有 hidden state | | 门 | forget/input/output gates | update/reset gates | | 参数量 | 更多 | 更少 | | 训练速度 | 通常较慢 | 通常较快 | | 小数据表现 | 不一定占优 | 常较好 | | 长距离依赖 | 通常更强 | 稍弱 | | 结构复杂度 | 高 | 低 |

课件总结:GRU 在很多任务上与 LSTM 表现相近,在较少训练数据上训练更快;但 LSTM 在需要建模长距离关系的任务中通常更强。

10. Bidirectional RNN【★★★★★】

普通 RNN 只能从左到右建模:

但很多任务中,当前 token 的标签依赖未来上下文。例如 POS tagging 中:

I saw a saw.

第二个 saw 的词性需要看上下文。

Bidirectional RNN 使用两个方向:

输出为:

其中:

  • :从左到右的 hidden state;
  • :从右到左的 hidden state;
  • :拼接两个方向的信息。

注意: BiRNN 适合 classification、tagging、encoding,不适合严格在线的 autoregressive generation,因为它需要看到未来 token。

11. Deep Bidirectional RNN【★★★★】

Deep BiRNN 将 bidirectional RNN 堆叠多层:

其中:

  • (i):第 (i) 层;
  • (L):总层数;
  • :下层前向表示;
  • :当前层前向表示。

直觉: 底层捕捉局部模式,高层捕捉抽象语义。

12. Encoder-Decoder Seq2Seq【★★★★★】

前面的 RNN 可以处理同长度 many-to-many,但机器翻译、语音识别、问答等任务中,输入输出长度不一定相同。

因此引入 Encoder-Decoder:

Encoder: x_1, ..., x_T → context vector C
Decoder: C → y_1, ..., y_S

课件指出,当 (C) 是 fixed-size vector 时,该结构可看成:

sequence → fixed-size vector
fixed-size vector → sequence

但问题是:

可能太小,无法总结长序列。

这就是 naive seq2seq 的 fixed-vector bottleneck。

13. Attention Mechanism【★★★★★】

Attention 的核心动机是解决固定 context vector (C) 的瓶颈。Bahdanau attention 的思想是:不要把整个输入压成一个固定向量,而是让 decoder 在每个输出位置动态选择输入中最相关的位置。

13.1 Decoder 预测公式

课件给出:

其中:

  • (y_t):当前要生成的 token;
  • :上一个 token;
  • (s_t):decoder hidden state;
  • (c_t):当前时间步的 context vector;
  • (x):输入序列;
  • (g):输出概率函数。

Decoder hidden state:

13.2 Context Vector

Encoder 把输入映射成 annotations:

每个 (h_j) 表示输入第 (j) 个位置的上下文表示。

Attention context vector:

其中:

  • (c_t):decoder 第 (t) 步使用的上下文;
  • :第 (t) 个输出位置对第 (j) 个输入位置的注意力权重;
  • (h_j):encoder 第 (j) 个位置的 hidden annotation。

直觉: (c_t) 是输入表示的加权平均。权重越大,说明当前输出越关注该输入位置。

13.3 Attention Weight

课件公式为:

其中:

  • :alignment score;
  • :alignment model,通常是 feedforward neural network;
  • :decoder 上一步状态;
  • (h_j):encoder 第 (j) 个位置表示。

完整形式:

这个机制解决了:

固定 C 太小的问题

因为每个 decoder step 都有自己的 (c_i),可以动态访问整个输入序列。

14. RNN 的问题与向 Transformer 演进【★★★★★】

课件总结 RNN 的主要问题:

  1. 难以高效并行化;
  2. 需要 backpropagation through sequence;
  3. 局部信息和全局信息都要通过 hidden state 这个 bottleneck 传递。

因此出现 convolutional sequence models,比如 Neural GPU、ByteNet、ConvS2S。但卷积模型也受限于 convolution window size。

Self-attention 的优势是:

任意两个位置之间的路径长度是常数
每层内部容易并行

这就是 Transformer 替代 RNN 的核心原因。

15. Scaled Dot-Product Attention【★★★★★】

课件公式为:

其中:

  • (Q):queries;
  • (K):keys;
  • (V):values;
  • (d_k):query/key 向量维度;
  • :query 与 key 的相似度矩阵;
  • :缩放因子;
  • softmax:把相似度转成注意力权重。

为什么要除以

如果 (Q,K) 维度很高,dot product 的方差会变大,导致 softmax 输入过大,使 softmax 饱和,梯度变小。因此 scaling 可以稳定训练。

16. Multi-Head Attention【★★★★★】

单个 scaled dot-product attention 本质上是 weighted average。课件指出它缺少类似 convolution 中“不同相对位置使用不同线性变换”的能力。解决方案是 Multi-Head Attention。

公式:

其中:

  • (h):“head” 数量;
  • :第 (i) 个 “head” 的 query projection;
  • :第 (i) 个 “head” 的 key projection;
  • :第 (i) 个 “head” 的 value projection;
  • :输出 projection;
  • :把多个 “head” 拼接。

直觉: 不同 “head” 可以学习不同关系,例如:

  • 语法依赖;
  • 长距离 coreference;
  • 局部 phrase;
  • 位置关系;
  • 语义相似性。

17. Transformer【★★★★】

课件总结 Transformer:

  • 完全基于 attention;
  • 去掉 recurrence;
  • 去掉 convolution;
  • Encoder:6 层 self-attention + feedforward network;
  • Decoder:6 层 masked self-attention + encoder output attention + feedforward。

Transformer 相比 RNN 的优势:

| 维度 | RNN | Transformer | | —— | —————————– | ——————– | | 序列依赖路径 | (O(T)) | (O(1)) per layer | | 并行化 | 差 | 强 | | 长程依赖 | 难 | 更容易 | | 记忆机制 | hidden state recurrent memory | all-pairs attention | | 时间/显存 | 通常 (O(T)) recurrent | attention 为 (O(T^2)) |

Transformer 的核心代价是:

因为它需要计算所有 token pair 的 attention score。

18. 从 Transformer 到 SSM / Mamba【★★★★】

课件最后讨论 attention 的瓶颈:

其时间和显存复杂度都是:

长上下文训练和推理昂贵。因此问题变成:

能否用硬件友好的 recurrent memory 替代显式 all-pairs interaction?

18.1 RNN → SSM → Mamba

Classic RNN:

Linear RNN / Discrete SSM:

Mamba:

核心区别:

| 模型 | 状态更新 | | —– | —————————- | | RNN | 非线性 recurrent update | | SSM | 结构化线性状态演化 | | Mamba | 输入依赖的 selective state update |

18.2 Selective Mechanism

传统 SSM:

Mamba:

直觉:

  • 重要 token 强烈更新 memory;
  • 不重要 token 几乎不改变 memory;
  • 类似 LSTM 的 gating,但放在 structured state-space evolution 中。

18.3 为什么 Mamba 可以并行化?

考虑 time-varying linear recurrence:

展开:

这是 prefix product + prefix sum 结构,可以用 parallel scan 计算。

因此:

  • 总 work 仍是 (O(T));
  • GPU utilization 更好;
  • 避免 attention 的 memory。

19. 总结对比表【★★★★★】

| 阶段 | 核心方法 | 解决什么问题 | 新问题 | | —————– | ———————– | ——————— | ————————————- | | Feedforward NN | 固定输入输出 | 普通分类/回归 | 无法处理变长序列 | | Vanilla RNN | hidden state recurrence | 处理序列历史 | 长程依赖难学,梯度消失/爆炸 | | BPTT | 时间展开反传 | 训练 recurrent model | 序列长时计算昂贵 | | Gradient clipping | 限制梯度范数 | 缓解 exploding gradient | 不解决 vanishing gradient | | LSTM | cell state + gates | 保留长期记忆 | 参数多,训练慢 | | GRU | update/reset gates | 简化 LSTM | 长程建模略弱 | | BiRNN | 双向上下文 | 利用过去和未来 | 不适合在线生成 | | Encoder-Decoder | seq2seq | 输入输出长度不同 | fixed vector bottleneck | | Attention | 动态选择输入位置 | 缓解 context bottleneck | 计算注意力仍较复杂 | | Transformer | self-attention | 并行、短路径长程依赖 | (O(T^2)) 长上下文昂贵 | | SSM/Mamba | selective state update | 长序列高效建模 | all-pairs interaction 不如 attention 直接 |

20. 期末复习抓重点

最应该掌握的是:

  1. Vanilla RNN 三个方程

  1. BPTT 的 hidden gradient 递推

  1. 梯度消失/爆炸的数学原因

  1. LSTM cell update

  1. GRU final memory

  1. Attention context vector

  1. Scaled dot-product attention

  1. Mamba selective update

一句话总结本章:

RNN 通过 recurrent hidden state 解决变长序列建模;LSTM/GRU 用门控解决长期记忆;Attention/Transformer 用全局交互解决 RNN 的瓶颈;Mamba 又回到 recurrent state evolution,但通过 selective scan 实现长序列高效建模。