从 RNN 到 Transformer--序列建模架构的演进与变革(一)
目录
一、人工智能发展简史:四条主线与三次范式迁移
理解 Transformer 为什么会出现,先要理解它要替代的东西是在什么背景下长出来的。人工智能七十多年的发展,可以粗略划分为四个阶段。
1.1 符号主义时代(1950s–1980s):规则与搜索
| 年份 | 事件 | 意义 |
|---|---|---|
| 1943 | McCulloch-Pitts 神经元模型 | 用数学形式描述神经元,连接主义的种子 |
| 1950 | 图灵《计算机器与智能》提出图灵测试 | 从哲学层面定义”机器能否思考” |
| 1956 | 达特茅斯会议 | “Artificial Intelligence” 一词正式诞生,领域确立 |
| 1958 | Rosenblatt 感知机(Perceptron) | 第一个可学习的线性分类器,硬件实现 Mark I |
| 1969 | Minsky & Papert《Perceptrons》 | 指出感知机无法解决 XOR,第一次 AI 寒冬的直接导火索 |
这一阶段的核心假设是**“智能 = 符号操作 + 逻辑推理”**:知识用规则显式编码,问题求解靠搜索。典型产物是专家系统(如 MYCIN)和定理证明器。
架构特征:系统由”知识库 + 推理引擎”两部分硬耦合构成,知识获取依赖人工录入。这条路线最终撞上了知识获取瓶颈——现实世界的常识无法被穷举成规则。
1.2 连接主义复兴与统计学习(1980s–2000s):从规则到数据
- 1982:Hopfield 网络,用能量函数把记忆与联想引入神经网络。
- 1986:Rumelhart、Hinton、Williams 系统阐述反向传播算法,让多层网络的训练成为可能。
- 1989 / 1998:LeCun 的 LeNet 用于手写数字识别,卷积的局部感受野 + 权值共享思想成型,成为此后二十年视觉架构的范式。
- 1990s–2000s:SVM、决策树、Boosting、概率图模型等统计机器学习方法占据主流。它们有扎实的理论基础、在小数据上表现优异,但依赖人工特征工程。
范式迁移的第一次转折:智能的来源从”人写规则”转向”从数据中学习参数”。但受限于算力和数据规模,网络做不深,特征仍需人工设计。
1.3 深度学习爆发(2006–2017):表征学习的胜利
三个条件同时成熟:大规模标注数据(ImageNet)+ GPU 算力 + 深层网络训练技巧。
- 2006:Hinton 提出深度信念网络与逐层预训练,重启对”深度”的信心。
- 2012:AlexNet 在 ImageNet 上以压倒性优势夺冠,ReLU、Dropout、GPU 并行训练三板斧成为标配。计算机视觉被彻底重构。
- 2014:
- Sutskever 等提出 Seq2Seq(Encoder-Decoder),把 RNN 用于机器翻译,序列到序列学习范式确立;
- Bahdanau 等在 Seq2Seq 上引入 Attention,让解码器在每一步动态”回看”编码器所有时刻的状态——这是 Transformer 最直接的思想源头;
- Goodfellow 提出 GAN,生成模型进入对抗范式。
- 2015:ResNet 用残差连接把网络深度推到上百层,解决了深度网络的优化难题。
- 2016:AlphaGo 战胜李世石,强化学习 + 深度网络出圈。
范式迁移的第二次转折:特征工程被表征学习取代。模型不再需要人告诉它”什么是边缘”,而是自己从数据中逐层抽象出层次化的表示。
但这一时期,序列建模(NLP、语音、时间序列)的主力架构仍是循环神经网络,它的结构性缺陷开始成为整个领域的天花板。
1.4 大模型时代(2017–至今):架构统一与规模定律
- 2017:Google 发表 Attention Is All You Need,提出 Transformer。
- 2018:BERT(Encoder-only,双向预训练)与 GPT(Decoder-only,自回归预训练),确立 “大规模预训练 + 下游微调” 范式。
- 2020:GPT-3(1750 亿参数)展示少样本学习能力;ViT 把 Transformer 引入视觉,CNN / RNN / Transformer 三足鼎立的局面开始向 Transformer 收敛。
- 2022–至今:ChatGPT 引爆生成式 AI;随之而来的是 Scaling Law、RLHF、指令微调、MoE 稀疏化、长上下文、多模态、推理模型(o1 / R1 系列)的密集迭代。
范式迁移的第三次转折:模型架构趋于统一与通用。同一个 Transformer 骨架可以处理文本、图像、音频、视频、代码、分子结构——这是 RNN 时代不可想象的。
一句话概括这段历史:符号主义解决了”如何表示知识”,统计学习解决了”如何从数据中学习”,深度学习解决了”如何自动学特征”,而 Transformer 解决的是”如何让学习过程规模化、并行化”。
二、序列建模的”循环”时代:RNN / LSTM / GRU
2.1 RNN:把”时间”引入神经网络
CNN 处理的是空间上的局部相关性(图像),而语言、语音、时序信号的核心特征是顺序依赖——当前时刻的理解依赖历史。RNN 的设计直觉极其朴素:
在网络中引入一个”记忆单元”,把上一时刻的隐状态传给下一时刻。
核心结构
按时间步展开后的 RNN:
graph LR
X1((x₁)) --> H1((h₁))
X2((x₂)) --> H2((h₂))
X3((x₃)) --> H3((h₃))
Xt((xₜ)) --> Ht((hₜ))
H1 -->|W_hh| H2 -->|W_hh| H3 -->|W_hh| Ht
H1 --> Y1((y₁))
H2 --> Y2((y₂))
H3 --> Y3((y₃))
Ht --> Yt((yₜ))
数学形式(Elman RNN):
h_t = tanh(W_xh · x_t + W_hh · h_{t-1} + b_h)
y_t = W_hy · h_t + b_y
其中 h_t ∈ ℝ^d 是隐状态(记忆),W_hh 是跨时间共享的状态转移矩阵。
架构特性
| 特性 | 说明 |
|---|---|
| 参数共享 | 所有时间步复用同一套 W_xh / W_hh / W_hy,参数量与序列长度无关 |
| 变长输入 | 天然支持任意长度序列 |
| 状态传递 | h_t 理论上可编码截至 t 的全部历史信息 |
| 训练算法 | BPTT(Backpropagation Through Time),按时间展开后反向传播 |
四种典型拓扑
| 结构 | 示意 | 典型任务 |
|---|---|---|
| N → N | 每步都输出 | 序列标注(词性标注、NER) |
| N → 1 | 只在末步输出 | 文本分类、情感分析 |
| 1 → N | 单输入展开成序列 | 图像描述生成 |
| N → M | Encoder-Decoder | 机器翻译、摘要、对话 |
其中 N→M 的 Seq2Seq 是当时最重要的架构:编码器把源序列压缩成一个定长向量 c,解码器从 c 出发生成目标序列。
2.2 痛点一:长程依赖与梯度消失 / 爆炸
这是 RNN 的致命伤,必须讲清楚数学根源。
梯度为什么消失
考虑损失 L_t 对 k 时刻隐状态 h_k 的梯度(k ≪ t),由链式法则:
∂L_t / ∂h_k = ( ∂L_t / ∂h_t ) · ∏_{j=k+1}^{t} ( ∂h_j / ∂h_{j-1} )
而
∂h_j / ∂h_{j-1} = diag( tanh'(z_j) ) · W_hh
于是梯度包含 (W_hh)^(t-k) 的连乘:
- 若
W_hh的谱半径 < 1(且 tanh 导数 ≤ 1,多数区域 < 1)→ 连乘结果指数级趋近 0 → 梯度消失,早期时刻的参数几乎学不到东西; - 若谱半径 > 1 → 指数级发散 → 梯度爆炸,参数更新震荡、NaN。
后果
- 模型只能记住最近几十个时间步的信息,无法建模跨句、跨段落的依赖;
- 典型表现:翻译长句时主语-谓语一致性、指代关系崩坏;语言模型”说完上句忘了下句”;
- 梯度裁剪(Gradient Clipping)能救爆炸,但救不了消失——它不改变连乘的衰减本质。
本质问题:信息在时间轴上的传递路径长度是 O(n),路径越长,信息损耗越严重。
2.3 LSTM:用”门控”造一条梯度高速公路
1997 年 Hochreiter & Schmidhuber 提出 LSTM(Long Short-Term Memory),核心思路是:
把”记忆”和”输出”解耦,并为记忆单元开辟一条梯度可以无损通过的线性通路。
结构:三门 + 细胞状态
graph LR
subgraph Cell["LSTM Cell @ time t"]
X((xₜ)) --> C1
Hp((hₜ₋₁)) --> C1
C1{{"拼接 [hₜ₋₁, xₜ]"}}
C1 --> F["fₜ 遗忘门 σ"]
C1 --> I["iₜ 输入门 σ"]
C1 --> O["oₜ 输出门 σ"]
C1 --> G["C̃ₜ 候选状态 tanh"]
F --> M1(("⊙"))
I --> M2(("⊙"))
G --> M2
M1 --> A(("⊕"))
M2 --> A
A --> Ct((Cₜ))
Ct --> T["tanh"]
O --> M3(("⊙"))
T --> M3
M3 --> Ht((hₜ))
end
数学形式:
f_t = σ(W_f · [h_{t-1}, x_t] + b_f) # 遗忘门:丢弃多少旧记忆
i_t = σ(W_i · [h_{t-1}, x_t] + b_i) # 输入门:写入多少新信息
õ_t = tanh(W_C · [h_{t-1}, x_t] + b_C) # 候选状态
C_t = f_t ⊙ C_{t-1} + i_t ⊙ õ_t # 细胞状态更新(线性!)
o_t = σ(W_o · [h_{t-1}, x_t] + b_o) # 输出门
h_t = o_t ⊙ tanh(C_t) # 隐状态
为什么能缓解梯度消失
对细胞状态求导(忽略其他路径,只看主通路):
∂C_t / ∂C_{t-1} = diag(f_t) + ... ≈ diag(f_t)
关键洞察:这是一条加性更新而非乘性变换。当遗忘门 f_t ≈ 1(模型学会”什么都不忘”)时,梯度可以几乎无损地从 t 时刻一路传回第 1 个时刻——这就是所谓的 Constant Error Carousel(CEC,常数误差流),相当于在时间轴上修了一条”梯度高速公路”。
代价
| 代价 | 说明 |
|---|---|
| 参数量 ×4 | 四组门控矩阵,参数量为普通 RNN 的 4 倍 |
| 计算更慢 | 每步要做 4 次矩阵乘 + 逐元素运算 |
| 显存更贵 | 需同时保存 C_t 与 h_t 两条状态轨迹 |
| 串行本质未变 | C_t 依赖 C_{t-1},依然无法并行 |
| 仍是有限记忆 | 细胞状态维度固定,超长序列依然会”挤爆” |
2.4 GRU:极简主义的重构
2014 年 Cho 等提出 GRU(Gated Recurrent Unit),是一次做减法的工程优化:
z_t = σ(W_z · [h_{t-1}, x_t]) # 更新门(融合 输入门+遗忘门)
r_t = σ(W_r · [h_{t-1}, x_t]) # 重置门
h̃_t = tanh(W · [r_t ⊙ h_{t-1}, x_t]) # 候选状态(受重置门控制)
h_t = (1 - z_t) ⊙ h_{t-1} + z_t ⊙ h̃_t # 线性插值更新
与 LSTM 的差异
| 维度 | LSTM | GRU |
|---|---|---|
| 门数量 | 3(遗忘 / 输入 / 输出) | 2(更新 / 重置) |
| 状态 | 双状态 C_t + h_t | 单状态 h_t |
| 参数量 | 4·(d²+d·d_in) | 3·(d²+d·d_in)(约 75%) |
| 输出门 | 有(独立控制读出) | 无(读出 = 状态本身) |
| 训练速度 | 慢 | 更快(约 20–30% 提升) |
| 效果 | 长序列、大数据上略优 | 中小规模数据上常相当甚至更优 |
工程选型经验:没有绝对优劣。数据量小 / 追求训练速度 / 算力受限选 GRU;序列极长 / 数据充足 / 需要精细记忆控制选 LSTM。
2.5 循环时代的五大架构瓶颈(关键转折)
即便有了 LSTM/GRU,RNN 家族仍有一组结构性、无法通过调参或堆算力解决的问题。这正是 Transformer 诞生的直接动因:
瓶颈 1:串行计算,无法并行 —— 算力的浪费
h_1 → h_2 → h_3 → ... → h_n
每个时间步的计算严格依赖上一步的输出。这意味着:
- 单条序列内部的时间维度完全无法并行,只能 batch 维度并行;
- 训练时间复杂度为 O(n) 串行步数,序列越长越慢;
- GPU 的 SIMD 并行能力被严重浪费——RNN 是典型的访存密集 + 小矩阵乘,MFU(模型算力利用率)极低。
这是最致命的工程问题:算力在指数增长,而 RNN 吃不下这些算力。
瓶颈 2:信息通路长度 O(n),长程依赖天然衰减
即使 LSTM 缓解了梯度消失,信息从位置 1 传到位置 n 仍需穿过 n 个模块,每经过一次非线性变换就有一次损耗。路径越长,保真度越低。
瓶颈 3:Encoder-Decoder 的”信息瓶颈”
Seq2Seq 把整句压缩成一个定长向量 c:
源句(可能 80 个词) → [固定维度向量 c] → 目标句
无论句子多长、信息多复杂,都必须塞进同一个向量。前言被后语覆盖、细节被主旨淹没是必然结果。
瓶颈 4:层次化特征难堆叠
深层 RNN(堆叠多层)训练极难稳定,通常堆到 2–4 层就收益递减;而视觉领域的 CNN 已经能堆到上百层(ResNet)。序列建模缺少”深度”这一维度。
瓶颈 5:可解释性差
隐状态是一个不可分解的稠密向量,很难回答”模型在生成这个词时,到底参考了输入的哪一部分”。
2.6 破局的火种:Attention(2014)
Bahdanau 等人在 Seq2Seq 上做了一个关键改动:不再把源句压成单一向量,而是保留编码器所有时刻的隐状态 {h_1, ..., h_n},让解码器在每一步自己决定该”看”哪些。
对齐分数:e_{t,i} = a(s_{t-1}, h_i)
注意力权重:α_{t,i} = softmax(e_{t,i})
上下文向量:c_t = Σ_i α_{t,i} · h_i
这一改动的效果是革命性的:
- 信息通路从 O(n) 缩短为 O(1)——解码器可以直接”跳”到任意编码器时刻;
- 注意力权重可视化后,甚至能自动对齐双语词序,可解释性大幅提升。
但它的载体仍然是 RNN:编码器必须串行跑完才能拿到所有 h_i,解码器也必须串行推进。循环结构依然是瓶颈,注意力只是挂在上面的一个补丁。
于是问题变得清晰了:
既然 Attention 已经能完成信息的聚合,那”循环”还有必要吗?
评论