Chapter 1: 深度学习回顾:从RNN到Seq2Seq的演进 / Deep Learning Review: Evolution from RNN to Seq2Seq
在深度学习自然语言处理(Natural Language Processing, NLP)的演进历程中,循环神经网络(Recurrent Neural Network, RNN)及其变体长期扮演着核心角色。它们的设计初衷是为了处理序列数据——文本、语音、时间序列——其中元素的顺序至关重要。然而,RNN家族的内在局限性,尤其是处理长序列时的困难,为后续革命性的Transformer架构埋下了伏笔。本章将系统回顾从朴素RNN到引入注意力机制的序列到序列(Sequence-to-Sequence, Seq2Seq)模型的完整演进路径,深入剖析每一阶段的技术创新与未解难题,从而建立“为什么需要Transformer”的坚实问题意识。
一、 循环神经网络(RNN)家族:序列建模的基石与隐痛
1.1 朴素RNN:朴素的时序假设与梯度消失/爆炸困境
循环神经网络的核心思想在于引入“隐状态”(Hidden State) $h_t$ 来捕捉序列的历史信息。在时间步 $t$,其输入为当前时刻的向量 $x_t$ 与前一时间步隐状态 $h_{t-1}$,通过一个共享参数的激活函数(通常为 $\tanh$ 或 $\text{ReLU}$)产生当前隐状态 $h_t$,并可能输出 $y_t$。其核心更新公式可简化为:
$$h_t = f(W_{hh} h_{t-1} + W_{xh} x_t + b_h)$$
其中 $W_{hh}$ 和 $W_{xh}$ 是权重矩阵,$b_h$ 是偏置项。这种“循环”结构使得网络在理论上能够将任意长度的历史信息压缩到固定维度的隐状态中。
教学提示:想象阅读一个句子,你大脑中的“理解状态”会随着每个新词的输入而不断更新,这个动态更新的状态就是RNN的隐状态。
然而,朴素RNN在实践中面临严峻挑战。当使用反向传播通过时间(Backpropagation Through Time, BPTT)算法训练时,损失函数对早期时间步权重的梯度,需要经过一系列雅可比矩阵的链式相乘。如果这些矩阵的谱半径(主导特征值的模)持续小于1,梯度将呈指数级衰减,导致早期时间步的权重几乎无法更新,这就是梯度消失(Vanishing Gradient)。反之,若谱半径持续大于1,则梯度会指数级爆炸,导致训练不稳定,即梯度爆炸(Exploding Gradient)。对于长序列(如长文档、长语音),梯度消失使得模型难以学习到远距离依赖关系。
实例分析:在机器翻译任务中,一个英语长句的句首主语“The scientist”可能决定后面几十个词后的动词单复数。朴素RNN在翻译到句末动词时,很难再有效利用句首主语的信息,因为梯度在传播过程中已几乎消失。
数据支撑:早期实验表明,在标准语言建模数据集(如Penn Treebank)上,朴素RNN的有效记忆长度通常不超过10-15个时间步,远不足以处理真实世界中常见的长距离依赖。
1.2 LSTM与GRU:门控机制的救赎
为克服梯度消失问题,长短期记忆网络(Long Short-Term Memory, LSTM)及其简化版门控循环单元(Gated Recurrent Unit, GRU)应运而生。它们的核心创新是门控机制(Gating Mechanism),通过设计精妙的“信息高速公路”来控制信息的流动与遗忘。
LSTM 引入了细胞状态(Cell State) $C_t$ 作为信息的“长期记忆载体”,并设计了三个门: 1. 遗忘门(Forget Gate) $f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$:决定从细胞状态中丢弃哪些信息。 2. 输入门(Input Gate) $i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$ 与候选细胞状态 $\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)$:决定将哪些新信息存入细胞状态。 3. 输出门(Output Gate) $o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$:决定从细胞状态中输出哪些信息到隐状态。
细胞状态的更新是线性的(加法操作): $$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$$ 其中 $\odot$ 表示逐元素相乘。这种线性操作是缓解梯度消失的关键——在反向传播中,梯度可以沿这条“高速公路”几乎无衰减地流动,因为 $\frac{\partial C_t}{\partial C_{t-1}} \approx f_t$,而遗忘门的设计允许梯度在接近1时长期保持。
GRU 则进行了简化,将遗忘门和输入门合并为更新门(Update Gate) $z_t$,并引入了重置门(Reset Gate) $r_t$: $$z_t = \sigma(W_z \cdot [h_{t-1}, x_t] + b_z)$$ $$r_t = \sigma(W_r \cdot [h_{t-1}, x_t] + b_r)$$ 候选隐状态 $\tilde{h}_t = \tanh(W \cdot [r_t \odot h_{t-1}, x_t] + b)$ 最终隐状态 $h_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t$
GRU参数更少,计算效率更高,在许多任务上表现与LSTM相当,成为更流行的选择。
架构对比表格(适用于纸质书/电子版)
| 特性 | 朴素RNN | LSTM | GRU | | :--- | :--- | :--- | :--- | | 核心结构 | 单一隐状态 $h_t$ | 隐状态 $h_t$ + 细胞状态 $C_t$ | 单一隐状态 $h_t$ | | 门控数量 | 0 | 3(遗忘、输入、输出) | 2(更新、重置) | | 参数量 | 较少 | 较多(约4倍于RNN单元) | 中等(约3倍于RNN单元) | | 主要优势 | 结构简单 | 强长程依赖建模能力 | 计算高效,性能接近LSTM | | 主要劣势 | 梯度消失/爆炸严重 | 计算成本高,结构复杂 | 在某些极长序列任务上略逊于LSTM | | 典型应用场景 | 简单序列任务(已较少使用) | 需要强长期记忆的任务(如文档摘要) | 通用序列任务(如机器翻译、语音识别) |
教学提示:可以将LSTM的细胞状态比作一条贯穿整个序列的“信息传送带”,门则是控制这条传送带上物品进出、丢弃的开关。
尽管LSTM/GRU显著改善了长序列建模能力,但它们本质上仍是顺序处理的。每个时间步的计算必须等待前一个时间步完成,这种固有的序列依赖性(Sequential Dependency) 造成了两个根本性瓶颈: 1. 训练并行化困难:无法像卷积神经网络(CNN)那样对序列不同部分进行并行计算,训练速度受限于序列长度。 2. 信息压缩瓶颈:所有历史信息必须被压缩进一个固定长度的隐状态向量 $h_t$(或 $C_t$)中。当序列极长时,这个向量可能成为信息瓶颈,导致早期信息在传递过程中逐渐模糊或丢失。
1.3 RNN家族的实践局限:一个机器翻译的启示
在2014-2015年,基于LSTM/GRU的编码器-解码器(Encoder-Decoder) 架构成为神经机器翻译(Neural Machine Translation, NMT)的主流范式。编码器(通常是一个双向LSTM)将源语言句子编码为一个固定长度的上下文向量 $C$(通常是编码器最后时刻的隐状态),解码器(一个LSTM)则基于 $C$ 和已生成的目标词,自回归地生成翻译。
实例分析:将英语句子 “I am a student.” 翻译为法语 “Je suis un étudiant.”。编码器处理完整个英文句后,其最终隐状态 $h_{end}$ 被视作整个句子的“精髓” $C$。解码器在生成第一个词 “Je” 时,仅依赖这个 $C$。问题显而易见:一个固定长度的向量 $C$ 能否充分捕捉一个复杂、冗长句子的全部语义和语法信息? 实证研究表明,对于超过30-40词的句子,翻译质量会显著下降。这就是著名的信息瓶颈(Information Bottleneck) 问题。
此外,在解码器生成目标词时,它必须依次生成:生成第 $t$ 个词依赖于前 $t-1$ 个词。这种自回归特性虽然符合语言生成的自然过程,但严重限制了推理(Inference)速度,因为无法并行生成序列。
数据支撑:在WMT英德翻译基准测试上,早期基于LSTM的Seq2Seq模型在长句(>50词)上的BLEU分数比短句(<20词)平均低5-8个百分点,且解码速度约为每秒2-5个词,远低于人类翻译速度。
二、 序列到序列(Seq2Seq)与注意力机制:突破信息瓶颈的首次尝试
2.1 Seq2Seq架构:编码器-解码器范式
Seq2Seq模型并非特指某种网络,而是一种通用的序列转换框架。其核心在于两个组件:
- **编码器(Encoder)**:读取输入序列 $X = (x_1, x_2, ..., x_m)$,将其压缩为一个中间表示(中间向量或向量序列)。
- **解码器(Decoder)**:基于编码器的表示,自回归地生成输出序列 $Y = (y_1, y_2, ..., y_n)$。
早期实现(如Sutskever et al., 2014)使用一个RNN(LSTM)作为编码器,将最终隐状态 $h_m$ 作为上下文向量 $C$ 传递给解码器RNN。解码器以 $C$ 和起始符 `<sos>` 为初始状态,逐步生成目标词。
Mermaid 流程图:朴素Seq2Seq架构
```mermaid graph LR A[输入序列 X] --> B[编码器 RNN] B --> C[最终隐状态 C] C --> D[解码器 RNN] D --> E[输出序列 Y] style C fill:#f9f,stroke:#333 ```
核心缺陷:如图中高亮所示,所有信息必须通过单个向量 $C$ 传递。这相当于要求一个人读完一本小说后,仅用一句话总结其全部内容,然后基于这句话复述故事。对于复杂、长篇内容,这是不可能完成的任务。
2.2 Bahdanau注意力:让解码器“回头看”
2014年,Bahdanau等人(《Neural Machine Translation by Jointly Learning to Align and Translate》)提出了划时代的注意力机制(Attention Mechanism),首次在NMT中实现了编码器隐藏状态与解码器生成过程的动态对齐。
核心洞见:在生成每个目标词 $y_t$ 时,不应只依赖编码器的最终状态 $C$,而应有权重地“关注”输入序列的所有隐藏状态。这样,模型可以动态决定在生成当前词时,应该更“注意”输入序列的哪些部分。
具体实现(Bahdanau/加性注意力): 1. 编码器是一个双向RNN,产生每个输入词 $x_i$ 的隐藏状态序列 $(h_1, h_2, ..., h_m)$。 2. 在解码器生成第 $t$ 个词时,其上一时刻隐状态 $s_{t-1}$ 与每个编码器状态 $h_i$ 计算对齐分数(Alignment Score) $e_{ti}$: $$e_{ti} = \text{score}(s_{t-1}, h_i) = v_a^T \tanh(W_a [s_{t-1}; h_i])$$ 其中 $W_a$ 和 $v_a$ 是可学习参数,$[;]$ 表示拼接。 3. 将分数归一化为注意力权重(Attention Weights) $\alpha_{ti}$: $$\alpha_{ti} = \frac{\exp(e_{ti})}{\sum_{j=1}^m \exp(e_{tj})}$$ $\alpha_{ti}$ 表示生成 $y_t$ 时,对输入位置 $i$ 的关注程度。 4. 计算上下文向量(Context Vector) $c_t$,作为当前所有编码器状态的加权和: $$c_t = \sum_{i=1}^m \alpha_{ti} h_i$$ 5. 将 $c_t$ 与当前解码器输入(如前一时刻的词嵌入)拼接,送入解码器RNN,预测 $y_t$。
教学提示:注意力机制就像一个“高亮笔”。在翻译法语 “Je suis un étudiant” 时:
- 生成 “Je” 时,模型会给英语 “I” 很高的注意力权重。
- 生成 “étudiant” 时,模型会高度关注英语 “student”。
- 生成 “suis” 时,模型可能需要同时关注 “am” 和整个句子结构以确定时态。
Mermaid 流程图:带注意力的Seq2Seq
```mermaid graph TD X[输入序列 X] --> Encoder[编码器 Bi-RNN] Encoder --> H[隐藏状态序列 h1...hm]
DecoderStart[解码器初始状态] --> Loop subgraph 解码循环 Loop[当前解码状态 s_{t-1}] --> Score[计算对齐分数 e_ti] Score --> Alpha[计算注意力权重 α_ti] Alpha --> Context[计算上下文向量 c_t] Context --> Predict[预测 y_t] Predict --> Next[下一时刻状态 s_t] Next --> Loop end
H --> Score style Context fill:#bbf,stroke:#333 ```
2.3 注意力的革命性意义
注意力机制的引入带来了三重突破: 1. 缓解信息瓶颈:解码器在每一步都可以直接访问编码器的全部隐藏状态,不再依赖单一固定向量。长句翻译的BLEU分数显著提升,尤其是长句部分。 2. 提供可解释性:注意力权重 $\alpha_{ti}$ 可以可视化,形成对齐图(Alignment Matrix)。研究人员可以直观检查模型在翻译某个词时,是否关注了正确的源词,这为调试和理解模型提供了宝贵窗口。 3. 为并行化铺路(思想萌芽):注意力计算中,所有 $e_{ti}$ 可以同时计算(因为 $s_{t-1}$ 固定时,它与所有 $h_i$ 的交互独立)。这暗示了序列元素间关系可以并行计算,为后来Transformer完全抛弃RNN的并行架构奠定了思想基础。
实例分析:对齐可视化 下图展示了一个英德翻译模型学习到的部分注意力权重(行=目标词,列=源词)。可以看到,“student” 对应 “Student”, “scientist” 对应 “Wissenschaftler”(德语科学家),甚至 “the” 的复数含义被 “die” 正确捕捉。这种软对齐(Soft Alignment)比之前基于短语的统计机器翻译的硬对齐更灵活。
``` the scientist will publish ... die 0.01 0.02 0.05 0.03 ... der 0.85 0.10 0.02 0.01 ... <- “der” (the, masc.) 高度关注 “the” 和 “scientist” die 0.02 0.75 0.08 0.05 ... <- “die” (the, fem./pl.) 可能对应其他词 ... ```
2.4 遗留的根本挑战:顺序计算与全局依赖建模的代价
尽管注意力机制是巨大的进步,但基于RNN的Seq2Seq+Attention架构仍未摆脱RNN的根本约束:
1. 编码器仍为顺序RNN:编码器处理输入序列仍需 $O(m)$ 步顺序计算,无法并行。对于超长文档(如书籍、法律合同),编码时间仍是瓶颈。 2. 解码器仍为自回归RNN:解码器生成每个词必须等待前一个词生成完毕,推理速度慢,难以应用于实时场景(如实时翻译、对话系统)。 3. 注意力计算复杂度为 $O(m \times n)$:对于长度为 $m$ 的输入和 $n$ 的输出,注意力权重的计算复杂度是序列长度的乘积。虽然可并行,但当 $m$ 和 $n$ 很大时(如长文档摘要),显存占用和计算量依然可观。且经典实现中,注意力是“每步”计算,与解码器的RNN步骤耦合。 4. 局部依赖建模能力有限:RNN的归纳偏置(Inductive Bias)使其更擅长捕捉局部、时序邻近的依赖,但对于序列中两个相距很远但逻辑相关的元素(如文档开头的问题与结尾的答案),即使有注意力,RNN编码的表示本身可能已丢失早期细节,注意力难以“无中生有”地恢复。
结论:注意力机制证明了直接建模任意两个位置间关系的有效性,但它只是“嫁接”在RNN这棵“树”上的一颗“果实”。要彻底释放注意力的潜力,必须找到一种不依赖RNN、完全基于注意力的架构。这,正是Transformer的使命。
三、 本章小结:通往Transformer的必然之路
本章我们完成了对深度学习NLP发展至2017年之前的关键阶段回顾。我们看到了:
- **RNN家族(RNN/LSTM/GRU)** 作为序列建模的早期基石,其循环结构天然适合处理变长序列,但受困于**梯度消失/爆炸**和**顺序计算**的根本缺陷。
- **Seq2Seq架构** 将序列转换任务形式化,但其**信息瓶颈**问题严重制约了长序列性能。
- **注意力机制(Bahdanau)** 的引入是第一个重大突破,它让模型能够**动态聚焦**于相关部分,显著提升了模型表现并提供了可解释性,但其计算仍**依附于RNN的序列处理框架**。
这一演进脉络清晰地指向一个核心矛盾:我们渴望一种能够并行处理整个序列、直接建模任意位置间长程依赖、且不受固定长度向量瓶颈限制的模型。所有先前的尝试都在修补RNN的框架,而真正的革命,需要一套全新的、以**自注