CNN → RNN → Transformer 演进与注意力机制详解
CNN → RNN → Transformer 演进路线与注意力机制详解
从卷积神经网络到循环网络再到 Transformer,深入解析神经网络三代架构的设计哲学、核心缺陷与突破,以及注意力机制的数学本质。面向 Java 工程师的深度技术解析。
写在前面
"Transformer 为什么比 RNN 强?" 这个问题字节、阿里、腾讯的 AI 岗位面试几乎必问。但能真正讲清楚的候选人不到 10%——大多数人只会说"因为有注意力机制",却解释不清楚注意力机制解决了什么问题、Q/K/V 的含义是什么、BERT 和 GPT 架构差异在哪里。
本文沿着历史演进脉络,逐层剖析每代架构的设计初衷、核心局限和解决方案,最终彻底拆解注意力机制的数学细节。
第一代:CNN(卷积神经网络)
CNN 的核心设计思想
CNN(Convolutional Neural Network)的核心思想来自一个观察:图像的局部特征(边缘、纹理、形状)在空间上具有平移不变性。
一只猫的耳朵,不管出现在图像左上角还是右下角,它的特征(两个尖角、轮廓曲线)都是相同的。卷积核(filter)正是利用这一性质:用同一个参数矩阵在整张图像上滑动,提取局部特征,同时共享参数。
CNN 的完整层次结构
卷积操作的数学本质
单个卷积操作:对输入特征图 用卷积核 (大小 )滑动计算:
三个核心特性:
| 特性 | 说明 | 好处 |
|---|---|---|
| 局部连接 | 每个神经元只连接输入的局部区域 | 参数量远少于全连接 |
| 权重共享 | 同一卷积核在整张图上共享参数 | 平移不变性,防止过拟合 |
| 分层特征 | 浅层学边缘/纹理,深层学语义 | 可解释的特征层次 |
池化层的作用
池化(Pooling)在 CNN 中有三个作用:
- 降维:减少后续层的计算量
- 平移不变性增强:轻微位移不改变池化输出
- 感受野扩大:每次池化后,后续层的每个神经元能"看到"原图更大的区域
最大池化 vs 平均池化:
- MaxPool:保留局部最强激活,对特征检测任务更优
- AvgPool:保留整体均值,GlobalAvgPool 常用于分类头替代全连接层
CNN 为什么不适合处理序列数据
CNN 的两大局限:
局限一:固定感受野。卷积核大小固定(通常 3×3 或 5×5),一次只能看局部。文本中"虽然…但是…"这样的长距离依赖,需要堆叠很多层才能建立联系,信息传递路径 O(序列长度/卷积步幅),长文本效果差。
局限二:无时序概念。图像的像素没有"顺序"的概念(空间位置可以互换理解),但文本是严格有序的——"我打你"和"你打我"语义完全不同。CNN 无法自然地处理这种有序关系。
第二代:RNN(循环神经网络)
RNN 的设计动机
RNN(Recurrent Neural Network)专门为序列数据设计:用隐藏状态(Hidden State)保存历史信息,像人的短期记忆一样。
RNN 的数学公式
每个时间步:
- 接收当前输入 和上一步隐藏状态
- 通过权重矩阵 、 线性组合后用 tanh 激活
- 输出当前隐藏状态 和预测
关键特点:所有时间步共享同一套权重 ,这使得 RNN 理论上可以处理任意长度序列。
梯度消失:RNN 的致命缺陷
RNN 训练使用 BPTT(Backpropagation Through Time,时序反向传播)。反向传播时,梯度需要跨越 T 个时间步:
其中每步的梯度因子:
由于 (最大值在 0 附近为 1,远离 0 时趋近于 0),且权重矩阵的谱范数通常小于 1,T 步的连乘结果:
当 时,随着序列长度 T 增加,梯度以指数速度消失,导致:
- 模型完全无法学习长距离依赖
- 翻译任务中,长句前面的主语信息到达句尾时已经"遗忘"
LSTM:用"门"解决梯度消失
LSTM(Long Short-Term Memory)引入三个门控机制和细胞状态(Cell State),彻底重设了信息流通路径:
LSTM 的关键创新是细胞状态(Cell State)提供了一条从 到 的"高速公路",梯度可以直接通过 流动(加法操作的梯度恒为 1),大幅缓解梯度消失。
GRU:LSTM 的简化版
GRU(Gated Recurrent Unit)将 LSTM 的三个门简化为两个门,性能接近但参数更少:
| 特性 | LSTM | GRU |
|---|---|---|
| 门控数量 | 3(遗忘、输入、输出) | 2(更新、重置) |
| 参数量 | 较多 | 较少(约 LSTM 的 75%) |
| 训练速度 | 较慢 | 较快 |
| 长序列性能 | 略优 | 相近 |
| 适用场景 | 复杂序列建模 | 资源受限/快速实验 |
LSTM/GRU 仍然存在的问题
即使有了 LSTM,序列模型仍有两个根本性瓶颈:
瓶颈一:顺序依赖,无法并行。每个时间步 的计算必须等待 步完成(依赖 ),序列长度 T 的计算是串行的,无法利用 GPU 的大规模并行计算能力。
瓶颈二:信息瓶颈。无论序列多长,所有信息都被压缩进固定维度的 (通常 256-1024 维),信息损失不可避免。Seq2Seq 翻译任务中,这个 向量被戏称为"上帝向量"——被要求编码整个源语句的语义,但维度太小装不下。
注意力机制:解决 RNN 信息瓶颈
Attention 的直觉
2014 年,Bahdanau 等人提出注意力机制,最初用于解决 Seq2Seq 翻译的信息瓶颈问题:
翻译每个目标词时,不是强制解码器只用最后的隐藏状态 ,而是让解码器"回头看"所有编码器的隐藏状态,动态决定每个词翻译时应该关注源句的哪些位置。
这个直觉非常自然:翻译"我爱你" → "I love you"时:
- 生成 "I" 时,应该重点关注源句中的"我"
- 生成 "love" 时,应该重点关注源句中的"爱"
- 生成 "you" 时,应该重点关注源句中的"你"
Q/K/V 注意力机制详解
现代 Transformer 使用的 Scaled Dot-Product Attention 将注意力机制形式化为 Query/Key/Value 三元组:
注意力机制的完整数学推导
Step 1:线性投影生成 Q、K、V
其中 是输入序列的嵌入矩阵, 是序列长度。
Step 2:计算注意力分数
的第 行第 列表示第 个位置的 Query 与第 个位置的 Key 的点积,反映 对 的"关注程度"。
为什么除以 ?
点积的方差与 成正比(假设 Q、K 各分量方差为 1,则 的方差为 )。不缩放时,高维度下点积绝对值过大,落在 softmax 的饱和区,梯度几乎为零,训练极其困难。除以 将方差归一化为 1,保持 softmax 处于敏感区域。
Step 3:Softmax 归一化
Softmax 沿行方向(对每个 Query 归一化),得到每个位置对所有位置的注意力权重,权重和为 1,可解释为"关注概率分布"。
Step 4:加权聚合
将注意力权重矩阵与 矩阵相乘,得到每个位置的输出向量——相当于按照注意力分布对所有位置的 Value 向量做加权平均。
直观理解 Q/K/V 的类比
用"图书馆检索"类比:
- Query(Q):你的检索需求("我想找关于深度学习的书")
- Key(K):书的索引标签("深度学习入门"、"机器学习实战"等)
- Value(V):书的实际内容
Query 与每个 Key 比较相似度,相似度高的书(对应 Value)在结果中权重高。最终输出是所有书按相似度加权的"混合知识"。
Multi-Head Attention:并行的多个视角
为什么需要多头
单个注意力头只能学习一种类型的依赖关系。自然语言中同时存在多种关系:
- 句法依存:"主语-谓语" 关系
- 语义相关:代词与其指代对象的关系
- 语篇逻辑:"因果"、"转折" 等语篇关系
Multi-Head Attention 用 个独立的注意力头,每个头用不同的 投影到不同的子空间,并行学习不同类型的依赖:
其中每个头的维度 ,拼接后通过投影矩阵 映射回 维,计算量与单头基本相同。
Self-Attention vs Cross-Attention
| 类型 | Q 来源 | K/V 来源 | 作用 |
|---|---|---|---|
| Self-Attention | 序列本身 | 序列本身 | 序列内部各位置相互关注,建立上下文理解 |
| Cross-Attention | 目标序列(解码器) | 源序列(编码器) | 解码时关注编码器的源信息,用于翻译/摘要等 |
Self-Attention 例子:BERT 中,理解"苹果公司发布了新手机",Self-Attention 让"苹果"这个 token 能强烈关注"公司"和"手机",从而理解这里的苹果是科技公司而非水果。
Cross-Attention 例子:机器翻译中,生成英文单词 "apple" 时,Cross-Attention 让解码器的 Query 去关注编码器中"苹果"对应的 Key/Value,获取源语言语义。
完整 Transformer 架构
Encoder-Decoder 全貌
原始 Transformer("Attention Is All You Need",2017)用于翻译任务,由编码器和解码器各 6 层构成:
位置编码(Positional Encoding)
Transformer 的 Self-Attention 是"无序的"——将所有词的位置打乱,注意力计算结果不变(只是矩阵行列顺序变了)。位置编码将位置信息注入嵌入:
使用正弦/余弦的原因:
- 每个位置的编码唯一
- 相对位置关系可以通过线性变换表示(sin(a+b) 可由 sin(a) 和 cos(a) 线性表示)
- 可以外推到训练时未见过的更长序列
BERT vs GPT:两种截然不同的训练范式
架构差异
核心差异对比
| 维度 | BERT | GPT |
|---|---|---|
| 架构 | Encoder-Only | Decoder-Only |
| 注意力方向 | 双向(每词看全部上下文) | 单向(每词只看左侧上下文) |
| 预训练任务 | MLM(掩码语言模型)+ NSP | CLM(因果语言建模,预测下一词) |
| 核心能力 | 理解(文本表示) | 生成(自回归文本生成) |
| 典型应用 | 分类、NER、语义相似度、问答 | 对话、文本生成、代码生成 |
| 代表模型 | BERT、RoBERTa、ALBERT、DeBERTa | GPT-2/3/4、Claude、LLaMA、Qwen |
BERT 的预训练任务
MLM(Masked Language Model,掩码语言模型):
随机遮盖输入中 15% 的 token:
- 80% 替换为
[MASK]:"我爱你"→"我 [MASK] 你" - 10% 替换为随机词:
"我爱你"→"我 鸟 你" - 10% 保持不变(防止模型只在
[MASK]处学习)
模型需要预测被遮盖的原始 token。由于需要理解左右上下文才能还原被掩盖词,BERT 被迫学习双向上下文理解能力。
NSP(Next Sentence Prediction):
给两个句子,预测 B 是否是 A 的下一句。(后续研究表明 NSP 用处不大,RoBERTa 移除了 NSP)
GPT 的自回归预训练
GPT 用因果语言建模(CLM)训练:给定前面的词,预测下一个词。
因果掩码(Causal Mask)确保位置 只能关注位置 的 token——这不仅是训练规则,也是推理时自回归生成的自然保证:生成第 个词时,未来的词还不存在。
为什么现代 LLM 全是 Decoder-Only
BERT 的 Encoder-Only 不适合文本生成(生成需要从左到右逐词产生)。Encoder-Decoder(T5、BART)虽然支持生成,但参数利用率不高。
Decoder-Only 统治的原因:
- 预训练效率高:CLM 任务让每个 token 都产生训练信号(BERT 只有 15% 的 mask 位置产生信号)
- 生成能力天然:自回归结构天然支持文本生成,无需额外解码器
- 规模扩展性:实验表明 Decoder-Only 在大规模参数下 scaling 曲线更优
- Few-shot 涌现:超过某一规模后,Decoder-Only 模型涌现出强大的 In-Context Learning 能力
架构演进总结:三代架构的关键问题与解法
三代架构核心指标对比
| 指标 | CNN | RNN/LSTM | Transformer |
|---|---|---|---|
| 长距离依赖 | O(序列长度) 层数 | O(序列长度) 时间步 | O(1) 直接关注 |
| 并行能力 | 高(空间并行) | 低(时序串行) | 高(序列并行) |
| 参数效率 | 高(权重共享) | 中 | 中(注意力参数多) |
| 显存需求 | 低 | 低 | 高(O(N²) 注意力矩阵) |
| 适用数据 | 图像、音频频谱 | 短/中等序列 | 任意序列,尤其长序列 |
| 扩展性 | 中 | 低 | 极强(Scaling Law) |
Transformer 的注意力复杂度问题
标准 Self-Attention 的计算和空间复杂度均为 ,其中 是序列长度:
- 计算 需要 次向量内积
- 注意力矩阵大小为
对于长文本(如 128K token),注意力矩阵有 个元素,显存需求爆炸。
主要优化方案:
| 方案 | 原理 | 代表工作 |
|---|---|---|
| Sparse Attention | 只计算局部或稀疏的注意力 | Longformer、BigBird |
| Linear Attention | 用核函数近似 Softmax,降为 O(N) | Performer、FNet |
| Flash Attention | IO 感知的精确注意力实现,减少 HBM 访问 | FlashAttention-2/3 |
| Sliding Window | 每个 token 只关注固定窗口内的上下文 | Mistral、Gemma |
| KV Cache | 推理时缓存历史 K/V,避免重复计算 | 所有生产 LLM |
高频面试题
Q: Self-Attention 为什么能解决 RNN 的长距离依赖问题?
RNN 中,位置 和位置 之间的信息需要经过 个时间步传递,路径长度为 ,随着距离增加梯度消失越严重。Self-Attention 中,任意两个位置都可以直接计算相互的注意力权重,信息传递路径长度为 ,完全不受距离影响。本质上,Transformer 把序列处理从"沿时间轴逐步传递"变成了"所有位置同时相互通信"。
Q: BERT 和 GPT 的根本区别是什么?什么时候用哪个?
根本区别在于注意力方向:BERT 是双向的(每个词能看到左右全部上下文),GPT 是单向的(每个词只能看左侧上下文,因果掩码)。选择原则:需要理解文本语义(分类、NER、语义搜索、问答)→ 选 BERT 系;需要生成文本(对话、代码生成、摘要、翻译)→ 选 GPT 系。现代 LLM 应用几乎全是 GPT 系(Decoder-Only),因为生成能力更通用,且 CLM 预训练信号密度更高。
Q: 注意力机制为什么要用 Q/K/V 三个矩阵,而不是直接用输入相互计算?
直接用输入计算相似度(如 )有两个问题:第一,Q 和 K 来自同一矩阵时,强迫模型用同一表示既作为"查询者"又作为"被查询者",表达能力受限;第二,V 直接是输入 X 时,注意力权重直接决定输出,没有对"携带信息"进行二次变换的空间。Q/K/V 分离用三个独立的投影矩阵将"关注什么"、"如何被关注"、"携带什么信息"解耦,大幅提升表达能力,让每个头能专注于不同的语言关系。
Q: LayerNorm 和 BatchNorm 的区别?Transformer 为什么用 LayerNorm?
BatchNorm 在 batch 维度归一化(对同一特征维度,跨样本计算均值/方差),需要足够大的 batch size 才稳定,且对变长序列不友好(不同序列长度的 padding 会引入噪声)。LayerNorm 在特征维度归一化(对同一样本,跨特征维度计算均值/方差),与 batch size 无关,对变长序列天然友好。Transformer 处理的文本序列长度各异、batch 通常不大,且 NLP 任务中特征维度的归一化比跨样本归一化更有意义,因此选 LayerNorm。
Q: 为什么 Transformer 需要位置编码?
Self-Attention 计算注意力分数只依赖 Q 和 K 的相似度,本质是集合操作(Set Operation)——将输入当作一个无序的集合,对每个元素独立计算与其他元素的注意力。打乱输入序列的顺序,Self-Attention 的计算结果也只是相应地打乱行列顺序,完全无法区分"我爱你"和"你爱我"。位置编码将绝对或相对位置信息加入词嵌入,使模型能够感知词序,这是 Transformer 捕捉语序语义的唯一来源。
Q: Gradient Checkpoint 是什么?为什么大模型训练需要它?
标准反向传播需要缓存前向传播中所有层的激活值,用于计算梯度,显存需求 。Gradient Checkpoint(梯度检查点)只保存少量关键中间状态,反向传播需要时重新计算被丢弃的激活值(以时间换空间)。大模型(如 LLaMA-70B 有 80 层)加上长序列(128K token),全量保存激活值需要数百 GB,远超 GPU 显存。Gradient Checkpoint 通常能将显存降低 3-5 倍,代价是增加约 30% 的计算时间,是大模型训练的标配优化。
Q: Flash Attention 的原理是什么?为什么能加速?
标准注意力计算需要将 的注意力矩阵写入 GPU 高带宽显存(HBM),再读回来做加权求和,HBM 的 IO 带宽成为瓶颈(不是计算本身)。Flash Attention 通过分块计算(Tiling),将 Q、K、V 分成小块放入 SRAM(GPU 片上快速缓存),在 SRAM 内完成局部注意力计算后只写一次 HBM,大幅减少 HBM 读写次数。数学结果与标准注意力完全等价(精确,非近似),但速度提升 2-4 倍,显存占用从 降至 。
推荐阅读
核心论文
- Attention Is All You Need — 原始 Transformer 论文,Vaswani et al. 2017
- BERT: Pre-training of Deep Bidirectional Transformers — BERT 原论文,Devlin et al. 2018
- GPT-3: Language Models are Few-Shot Learners — GPT-3 原论文,Brown et al. 2020
- Flash Attention — IO 感知的高效精确注意力实现
知识星球深度内容
完整大厂面经(含详细答案、最新更新)、AI 项目源码、1v1 简历修改,扫码加入「AI 工程师加速社区」知识星球获取 👉 立即加入
