Transformer 的诞生
2017 年,Google 发表了划时代论文《Attention Is All You Need》,提出了 Transformer 架构。它彻底改变了 NLP 领域,成为现代大语言模型的基石。
核心思想:自注意力机制
传统 RNN 的问题
RNN 处理序列:
h1 = f(x1, h0)
h2 = f(x2, h1)
h3 = f(x3, h2)
...
hn = f(xn, hn-1)
问题:
1. 顺序计算,无法并行
2. 长距离依赖难以捕捉
3. 梯度消失/爆炸
自注意力机制
自注意力计算:
Q = X * Wq (查询矩阵)
K = X * Wk (键矩阵)
V = X * Wv (值矩阵)
Attention(Q, K, V) = softmax(Q * K^T / √dk) * V
示例:
输入: "我 爱 中国"
Q: [0.2, 0.8, 0.1] ← 每个词对其他词的"关注度"
K: [0.3, 0.6, 0.4]
V: [0.1, 0.4, 0.2]
结果: 每个词都融合了整个序列的信息
多头注意力
多头注意力:
Head 1: Attention(Q*W1, K*W1, V*W1) ← 关注语法
Head 2: Attention(Q*W2, K*W2, V*W2) ← 关注语义
Head 3: Attention(Q*W3, K*W3, V*W3) ← 关注上下文
...
Head h: Attention(Q*Wh, K*Wh, V*Wh)
输出: Concat(Head1, Head2, ..., Headh) * Wo
Transformer 架构
编码器-解码器结构
Transformer:
┌─────────────────────────────────────┐
│ 解码器 (Decoder) │
│ ┌─────────────────────────────┐ │
│ │ 掩码多头注意力 │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ 交叉注意力 │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ 前馈网络 │ │
│ └─────────────────────────────┘ │
├─────────────────────────────────────┤
│ 编码器 (Encoder) │
│ ┌─────────────────────────────┐ │
│ │ 多头注意力 │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ 前馈网络 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
位置编码
正弦位置编码:
PE(pos, 2i) = sin(pos / 10000^(2i/d))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d))
示例 (d=4):
位置 0: [0, 1, 0, 1]
位置 1: [0.84, 0.54, 0.84, 0.54]
位置 2: [0.91, 0.41, 0.91, 0.41]
作用: 让模型知道每个词的位置
GPT 系列演进
GPT-1 (2018)
架构:
- 12 层 Transformer 解码器
- 117M 参数
- 预训练 + 微调范式
训练:
1. 预训练: 在大规模语料上预测下一个词
2. 微调: 在特定任务上训练
局限:
- 参数量小
- 通用能力有限
GPT-2 (2019)
架构:
- 48 层 Transformer 解码器
- 1.5B 参数
- 零样本学习
创新:
1. 更大的模型容量
2. 证明了规模的重要性
3. 引发了 AI 安全讨论
GPT-3 (2020)
架构:
- 96 层 Transformer 解码器
- 175B 参数
- 少样本学习 (In-Context Learning)
能力涌现:
1. 少样本学习: 只给几个示例就能完成任务
2. 零样本泛化: 不需要训练就能处理新任务
3. 涌现能力: 规模带来的质变
GPT-4 (2023)
特点:
- 多模态: 支持图像和文本输入
- 更长上下文: 8K/32K/128K tokens
- 更强推理: 改进的逻辑推理能力
- 更安全: 更好的对齐和安全控制
训练技术
预训练目标
因果语言建模 (Causal LM):
输入: "我 爱 中"
目标: "爱 中 国"
训练目标: P(爱|我) * P(中|我,爱) * P(国|我,爱,中)
损失函数: -log P(下一个词 | 上下文)
对齐技术
RLHF (人类反馈强化学习):
1. 监督微调 (SFT): 用人工标注数据训练
2. 奖励模型 (RM): 学习人类偏好
3. PPO 优化: 使用强化学习优化策略
示例:
人类标注: 回答A > 回答B
奖励模型: 学习这个偏好
PPO: 调整模型参数,生成更符合偏好的回答
推理优化
KV Cache
问题:
每个 token 都需要重新计算所有层的 K 和 V
计算复杂度: O(n²)
解决:
缓存已计算的 K 和 V
新 token 只需要计算自己的 Q
计算复杂度: O(n)
内存占用:
每层: 2 * seq_len * hidden_dim * precision
总内存: n_layers * 2 * seq_len * hidden_dim * precision
量化
FP32 → FP16:
内存减半,精度损失小
FP32 → INT8:
内存减 4 倍,需要校准
FP32 → INT4:
内存减 8 倍,精度损失较大
GPTQ/AWQ:
训练时量化,保持精度
面试常见问题
Transformer 为什么比 RNN 好?
- 并行计算: 所有位置同时计算
- 长距离依赖: 自注意力直接连接任意位置
- 梯度稳定: 不存在梯度消失问题
自注意力的复杂度?
- 时间复杂度: O(n² * d)
- 空间复杂度: O(n²)
- n 是序列长度,d 是隐藏维度
为什么 GPT 用解码器而不用编码器?
- 解码器支持自回归生成
- 编码器用于理解,解码器用于生成
- GPT 的目标是生成文本
涌现能力是什么?
- 模型规模达到一定程度后突然出现的能力
- 小模型没有,大模型有
- 例: 少样本学习、复杂推理
实战: 使用 Transformers
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载模型
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 生成文本
input_text = "The future of AI is"
inputs = tokenizer(input_text, return_tensors="pt")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0]))