Lecture 5 学习笔记:Recurrent Neural Networks
// @order: 999
下面是 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 的主要问题:
- 难以高效并行化;
- 需要 backpropagation through sequence;
- 局部信息和全局信息都要通过 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. 期末复习抓重点
最应该掌握的是:
- Vanilla RNN 三个方程:
- BPTT 的 hidden gradient 递推:
- 梯度消失/爆炸的数学原因:
- LSTM cell update:
- GRU final memory:
- Attention context vector:
- Scaled dot-product attention:
- Mamba selective update:
一句话总结本章:
RNN 通过 recurrent hidden state 解决变长序列建模;LSTM/GRU 用门控解决长期记忆;Attention/Transformer 用全局交互解决 RNN 的瓶颈;Mamba 又回到 recurrent state evolution,但通过 selective scan 实现长序列高效建模。