GPT (Generative Pre-trained Transformer)
GPT 是 OpenAI 提出的基于 Transformer Decoder 的自回归语言模型系列。从 2018 年的 GPT-1 到后来的 GPT-4,这一系列模型深刻改变了自然语言处理乃至整个人工智能领域的研究范式。本笔记将系统梳理 GPT 的架构设计、数学原理、系列演进以及对 AI 发展的深远影响。
背景与动机
从特征工程到预训练:为什么 NLP 需要预训练?
在深度学习时代之前,NLP 严重依赖人工设计的特征(如 TF-IDF、n-gram、词性标注等)。这些特征工程不仅费时费力,而且难以捕捉语言的深层语义结构。
NLP 领域的表示学习经历了以下演进:
| 阶段 | 方法 | 局限性 |
|---|---|---|
| 离散表示 | One-Hot, Bag-of-Words | 无法表达语义相似性,维度灾难 |
| 静态词向量 | Word2Vec, GloVe | 一词一向量,无法处理多义词 |
| 上下文相关表示 | ELMo (双向 LSTM) | 特征提取式,浅层双向,基于 RNN 无法并行 |
| 预训练+微调 | GPT-1, BERT | 深层 Transformer,端到端微调,性能大幅提升 |
核心问题在于:标注数据稀缺而昂贵,而无标注文本几乎无限。如何利用海量无标注文本学习通用的语言表示,然后迁移到下游任务?这就是预训练的动机。
GPT-1 的核心思想:无监督预训练 + 有监督微调
GPT-1(2018)提出了一个简洁而有效的两阶段范式:
-
阶段一:无监督预训练(Unsupervised Pre-training) - 在大规模无标注语料上,训练一个语言模型 - 目标:给定前面的词,预测下一个词 - 通过这个简单的任务,模型学会了语法、语义、世界知识
-
阶段二:有监督微调(Supervised Fine-tuning) - 在特定下游任务(分类、问答、推理等)的标注数据上微调 - 保留预训练学到的参数,只需少量标注数据即可达到优秀性能
关键洞察
GPT-1 的论文标题是 "Improving Language Understanding by Generative Pre-Training"。核心洞察是:生成式预训练可以提升语言理解能力。虽然预训练目标是生成(预测下一个词),但学到的表示对理解任务(分类、推理等)同样有效。
Decoder-only 的选择:为什么选择自回归而不是双向?
在 GPT-1 的时代,研究者面临一个关键选择:
- 双向模型(如后来的 BERT):每个词可以看到完整的上下文(前后都看),适合理解任务
- 自回归模型(如 GPT):每个词只能看到之前的词,天然适合生成任务
GPT 选择自回归(Decoder-only)有以下理由:
- 自然的生成能力:自回归模型可以直接逐词生成文本,无需额外的解码机制
- 训练目标统一:语言建模(预测下一个词)是一个无监督任务,不需要设计复杂的预训练目标
- Scaling 友好:后来的实践证明,Decoder-only 架构在模型规模扩大时表现出更好的 scaling 行为
历史视角
2018 年时,GPT-1 和 ELMo 几乎同时提出预训练范式。随后 BERT 用双向 Encoder 在理解任务上大幅超越 GPT-1,一度让人认为双向模型才是正道。然而 GPT-2 和 GPT-3 的出现证明:只要模型够大、数据够多,自回归模型在理解和生成上都能达到惊人的效果。
GPT 架构详解
整体架构
GPT 使用 Transformer 的 Decoder 部分,但做了一个关键修改:去掉了 Cross-Attention 层。因为 GPT 没有 Encoder,所以不需要 Cross-Attention 来关注 Encoder 的输出。每一层只保留 Masked Self-Attention 和 Feed-Forward Network。
输入序列: "我 喜欢 深度 学习"
|
v
+---------------------------+
| Token Embedding | 将每个 token 映射为向量
| + Position Embedding | 加入位置信息
+---------------------------+
|
v
+---------------------------+
| Masked Self-Attention | 每个位置只能看到自己和之前的 token
| + Add & LayerNorm | 残差连接 + 层归一化
|---------------------------|
| Feed-Forward Network | 位置独立的两层全连接
| + Add & LayerNorm | 残差连接 + 层归一化
+---------------------------+
| x L 层 (GPT-1: L=12)
v
+---------------------------+
| Linear + Softmax | 映射到词表大小,预测下一个 token
+---------------------------+
|
v
输出: 下一个 token 的概率分布
与标准 Transformer Decoder 的区别
标准 Transformer(Vaswani et al., 2017)的 Decoder 每层有三个子层:
| 子层 | 标准 Transformer Decoder | GPT (Decoder-only) |
|---|---|---|
| Masked Self-Attention | 有 | 有 |
| Cross-Attention | 有(关注 Encoder 输出) | 无(没有 Encoder) |
| Feed-Forward Network | 有 | 有 |
GPT 本质上是一个"去掉了 Cross-Attention 的 Transformer Decoder"。更准确地说,GPT 的每层结构为:
简化写法(Pre-Norm 形式,GPT-2 及之后采用):
Norm 位置的变化
GPT-1 使用 Post-Norm(先做注意力/FFN,再做 LayerNorm),与原始 Transformer 一致。GPT-2 改为 Pre-Norm(先做 LayerNorm,再做注意力/FFN),这使得训练更稳定,尤其是在深层网络中。
Masked Self-Attention (Causal Attention)
Masked Self-Attention 是 GPT 的核心机制。其关键在于:通过因果掩码(causal mask)确保每个位置只能关注自己和之前的位置,不能"偷看"未来的 token。
对于长度为 \(n\) 的序列,因果掩码矩阵 \(M\) 是一个下三角矩阵:
Masked Self-Attention 的计算:
将 \(-\infty\) 加到未来位置的注意力分数上,经过 softmax 后这些位置的权重变为 0,从而实现"只看过去"的效果。
因果掩码可视化 (4 个 token):
token1 token2 token3 token4
token1 [ 1 0 0 0 ] token1 只能看自己
token2 [ 1 1 0 0 ] token2 能看 token1 和自己
token3 [ 1 1 1 0 ] token3 能看 token1~3
token4 [ 1 1 1 1 ] token4 能看所有 token
(1 = 可见, 0 = 被遮挡)
Token Embedding 与 Position Embedding
GPT 的输入处理与标准 Transformer 类似,但有一个区别:GPT 使用可学习的位置嵌入(Learned Positional Embedding),而不是正弦余弦位置编码。
其中:
- \(W_e \in \mathbb{R}^{V \times d}\) 是 token 嵌入矩阵,\(V\) 是词表大小,\(d\) 是模型维度
- \(W_p \in \mathbb{R}^{T \times d}\) 是位置嵌入矩阵,\(T\) 是最大序列长度
- \(x\) 是输入 token 序列的 one-hot 表示
可学习位置嵌入 vs 正弦余弦位置编码
原始 Transformer 使用固定的正弦余弦位置编码,具有可外推到更长序列的理论优势。GPT 选择可学习的位置嵌入,实验表明两者在性能上差异不大,但可学习嵌入在实现上更简单。缺点是序列长度被训练时的最大长度所限制。
Feed-Forward Network
每一层的 FFN 与标准 Transformer 相同,是一个位置独立的两层全连接网络:
注意 GPT 使用 GELU 激活函数而非 ReLU。GELU(Gaussian Error Linear Unit)的定义为:
GELU 相比 ReLU 更平滑,在零点附近有非零梯度,实践中训练更稳定。
自回归生成的数学原理
链式法则分解
GPT 的核心思想是将联合概率分解为条件概率的乘积(概率的链式法则):
每一步预测下一个 token 的条件概率分布:
其中 \(h_L^{(i)}\) 是第 \(i\) 个位置在最后一层的隐藏状态,\(W_e\) 是 token 嵌入矩阵(权重共享)。
训练目标:最大化似然
给定语料库 \(\mathcal{U} = \{u_1, u_2, \ldots, u_n\}\),训练目标是最大化对数似然:
等价地,最小化交叉熵损失:
困惑度 (Perplexity)
语言模型的评估指标通常使用困惑度(Perplexity, PPL),它是交叉熵的指数形式:
PPL 可以直观理解为:模型在每一步平均要在多少个等概率的候选词中做选择。PPL 越低,模型越好。
微调阶段的训练目标 (GPT-1)
GPT-1 在微调阶段将语言模型损失作为辅助目标,与任务特定损失联合优化:
其中 \(\lambda\) 是权重超参数。这个辅助损失有助于:
- 提高微调的泛化能力
- 加速收敛
- 防止预训练学到的知识在微调时被遗忘
解码策略
训练完成后,生成文本时需要从概率分布中选择 token。常见的解码策略包括:
1. Greedy Decoding(贪心解码)
每步选择概率最大的 token:
优点:简单快速。缺点:容易陷入重复,且无法回溯。
2. Beam Search(束搜索)
维护 \(k\) 个(beam width)最优的候选序列,每步扩展所有候选,保留总概率最高的 \(k\) 个:
通常使用长度归一化来避免偏向短序列。
3. Top-k Sampling
从概率最高的 \(k\) 个 token 中按概率采样:
4. Top-p (Nucleus) Sampling
选择累积概率超过阈值 \(p\) 的最小 token 集合 \(V_p\),然后从中按概率采样:
Top-p 的优点是自适应调整候选集大小:当分布集中时选择少量 token,当分布平坦时选择更多 token。
5. Temperature Scaling
通过温度参数 \(\tau\) 调节概率分布的"锐度":
- \(\tau < 1\):分布更尖锐,趋向 greedy(更确定性)
- \(\tau = 1\):原始分布
- \(\tau > 1\):分布更平坦,增加随机性(更多样化)
- \(\tau \to 0\):等价于 greedy decoding
- \(\tau \to \infty\):等价于均匀分布
前向传播数值示例
为了具象理解 GPT 的计算过程,我们用一个极简的例子来手动计算。
设置
- 序列长度 \(n = 4\),token 序列为 \([t_1, t_2, t_3, t_4]\)
- 模型维度 \(d_{\text{model}} = 4\)
- 单头注意力(\(h = 1\)),\(d_k = 4\)
假设经过 Token Embedding + Position Embedding 后,输入矩阵 \(H_0\) 为:
每一行是一个 token 的 4 维表示。
步骤 1:计算 Q, K, V
为简化,假设 \(W_Q = W_K = W_V = I\)(单位矩阵),则 \(Q = K = V = H_0\)。
步骤 2:计算注意力分数
先算 \(H_0 H_0^T\):
除以 \(\sqrt{4} = 2\):
步骤 3:应用因果掩码
将上三角部分设为 \(-\infty\)(实际计算中用一个很大的负数):
步骤 4:Softmax(逐行)
- 第 1 行:\(\text{softmax}([0.675]) = [1.0, 0, 0, 0]\) -- \(t_1\) 只能关注自己
- 第 2 行:\(\text{softmax}([0.475, 0.845]) \approx [0.41, 0.59, 0, 0]\) -- \(t_2\) 更关注自己
- 第 3 行:\(\text{softmax}([0.535, 0.670, 1.045]) \approx [0.26, 0.30, 0.44, 0]\) -- \(t_3\) 最关注自己
- 第 4 行:\(\text{softmax}([0.520, 0.715, 0.835, 0.950]) \approx [0.19, 0.23, 0.26, 0.29]\) -- \(t_4\) 关注较均匀但略偏自己(最近的 token)
步骤 5:加权求和
- 第 1 行(\(t_1\) 的输出):\(= 1.0 \times [1.0, 0.5, 0.3, 0.1] = [1.0, 0.5, 0.3, 0.1]\)
- 第 2 行(\(t_2\) 的输出):\(= 0.41 \times [1.0, 0.5, 0.3, 0.1] + 0.59 \times [0.2, 1.0, 0.7, 0.4] \approx [0.53, 0.80, 0.54, 0.28]\)
- 以此类推...
观察
从注意力矩阵 \(A\) 可以清楚看到因果掩码的效果:矩阵是下三角的。\(t_1\) 的输出完全由自身决定,\(t_2\) 融合了 \(t_1\) 和自身的信息,以此类推。每个位置的输出只包含"过去"和"当前"的信息,绝不会泄露"未来"的信息。这正是自回归生成的基础。
GPT 系列演进
参数量对比
| 版本 | 年份 | 层数 \(L\) | 隐藏维度 \(d\) | 注意力头数 \(h\) | 参数量 | 上下文长度 | 训练数据 |
|---|---|---|---|---|---|---|---|
| GPT-1 | 2018 | 12 | 768 | 12 | 117M | 512 | BookCorpus (~5GB) |
| GPT-2 | 2019 | 48 | 1600 | 25 | 1.5B | 1024 | WebText (~40GB) |
| GPT-3 | 2020 | 96 | 12288 | 96 | 175B | 2048 | 混合数据集 (~570GB) |
| GPT-4 | 2023 | 未公开 | 未公开 | 未公开 | 未公开 (传闻 ~1.8T) | 8K/32K/128K | 未公开 |
GPT-1 (2018): 预训练+微调范式的开创者
论文: "Improving Language Understanding by Generative Pre-Training"
GPT-1 的核心贡献是提出并验证了 "无监督预训练 + 有监督微调" 的范式:
- 预训练:在 BookCorpus(约 7000 本书)上做语言建模
- 微调:通过对输入格式的简单变换,适配不同类型的下游任务
GPT-1 在不同类型任务上的输入格式变换:
文本分类: [BOS] 文本内容 [EOS] --> 分类头
文本蕴含: [BOS] 前提 [SEP] 假设 [EOS] --> 分类头
相似度: [BOS] 句子A [SEP] 句子B [EOS] --> 分类头
+ [BOS] 句子B [SEP] 句子A [EOS] (对称处理)
多选题: 对每个选项分别: [BOS] 上下文 [SEP] 选项_k [EOS] --> 分类头
GPT-1 在 12 个任务中的 9 个上达到了当时的最优结果(state-of-the-art),证明了预训练范式的有效性。
GPT-2 (2019): Zero-shot 与规模的力量
论文: "Language Models are Unsupervised Multitask Learners"
GPT-2 的核心洞察是:足够大的语言模型可以在不做任何微调的情况下完成下游任务(zero-shot)。
关键改进:
- 更大的模型:从 117M 扩大到 1.5B 参数
- 更大更好的数据:WebText(从 Reddit 高赞链接爬取的网页文本,经过质量过滤)
- 不再需要微调:通过自然语言描述任务来引导模型(prompt 的雏形)
- 架构微调: - 将 LayerNorm 移到子层输入前(Pre-Norm) - 在最后一层 Self-Attention 后增加一个额外的 LayerNorm - 残差层初始化权重缩放 \(1/\sqrt{N}\)(\(N\) 为层数)
任务的统一视角
GPT-2 提出了一个重要观点:所有 NLP 任务都可以看作条件文本生成。例如翻译可以表述为 "translate English to French: [英文文本] = [法文文本]"。这个思想后来在 GPT-3 和 T5 中被进一步发展。
GPT-3 (2020): In-Context Learning 的崛起
论文: "Language Models are Few-Shot Learners"
GPT-3 是一个划时代的模型,参数量达到 175B,展现出了惊人的 In-Context Learning 能力:
- Zero-shot:仅给任务描述,不给示例
- One-shot:给一个示例
- Few-shot:给几个示例(通常 10-100 个)
Few-shot 示例 (情感分析):
"Review: This movie was fantastic! Sentiment: Positive
Review: Terrible acting and boring plot. Sentiment: Negative
Review: A masterpiece of modern cinema. Sentiment:"
模型生成: " Positive"
GPT-3 的关键发现:
- 规模带来质变:模型越大,in-context learning 能力越强(涌现能力)
- 无需梯度更新:few-shot 不需要微调,模型参数完全不变,只通过 prompt 中的示例来"学习"
- 任务泛化:可以处理训练时从未明确见过的任务
GPT-3 的训练数据是多种来源的混合:
| 数据集 | 数量 (tokens) | 训练中的权重 |
|---|---|---|
| Common Crawl (过滤后) | 410B | 60% |
| WebText2 | 19B | 22% |
| Books1 | 12B | 8% |
| Books2 | 55B | 8% |
| Wikipedia | 3B | 3% |
GPT-4 (2023): 多模态与进一步扩展
GPT-4 的技术细节 OpenAI 未公开(Technical Report 几乎没有架构信息)。已知的信息包括:
- 多模态:可以同时处理文本和图像输入
- 更长的上下文:支持 8K、32K 乃至 128K 的上下文窗口
- 更强的推理能力:在多个专业考试中达到人类水平
- 传闻架构:据报道采用了 Mixture of Experts (MoE) 架构,总参数量约 1.8T,但每次前向传播只激活一部分专家
关于 GPT-4 的信息
由于 OpenAI 未公开 GPT-4 的架构细节,上述"传闻"信息来自非官方渠道,不保证准确。OpenAI 的 Technical Report 中提到他们出于竞争和安全考虑选择不公开这些信息。
In-Context Learning 与 Prompt Engineering
In-Context Learning 的定义
In-Context Learning (ICL) 是 GPT-3 展现出的一种能力:模型可以通过在 prompt 中提供任务描述和少量示例来完成新任务,无需更新任何模型参数。
三种模式:
Zero-shot:
"将以下句子翻译成英文:今天天气真好。"
One-shot:
"将以下句子翻译成英文。
例子:我喜欢猫。 -> I like cats.
今天天气真好。 ->"
Few-shot:
"将以下句子翻译成英文。
例子1:我喜欢猫。 -> I like cats.
例子2:他在读书。 -> He is reading.
例子3:她很开心。 -> She is very happy.
今天天气真好。 ->"
为什么 GPT-3 能做 In-Context Learning?
这是一个仍在研究中的问题,目前有几种理论:
1. 隐式贝叶斯推断
模型在预训练时学到了文本中任务的分布。给定 few-shot 示例后,模型在隐式地做贝叶斯推断——根据示例推断出当前任务是什么,然后执行该任务。
2. 隐式梯度下降
有研究表明(Akyurek et al., 2022; von Oswald et al., 2023),Transformer 的前向传播过程可以模拟梯度下降。Few-shot 示例相当于提供了"训练数据",模型在前向传播中隐式地对这些数据做了一步(或几步)梯度下降。
3. 与 Meta-Learning 的联系
In-Context Learning 可以看作一种 meta-learning:预训练阶段是 meta-training(学习"如何学习"),推理时的 few-shot 是 meta-test(应用学到的"学习能力"来快速适应新任务)。
Chain-of-Thought (CoT) Prompting
Chain-of-Thought(Wei et al., 2022)是一种重要的 prompting 技术,通过在示例中展示推理过程,引导模型进行逐步推理:
标准 Prompting:
Q: Roger有5个网球。他又买了2罐网球,每罐3个。他现在有多少网球?
A: 11
CoT Prompting:
Q: Roger有5个网球。他又买了2罐网球,每罐3个。他现在有多少网球?
A: Roger一开始有5个网球。他买了2罐,每罐3个,所以他买了2x3=6个。
5+6=11。答案是11。
CoT 的有效性在大模型(通常 >100B 参数)上尤为显著,被认为是一种利用模型自身计算能力进行"慢思考"的方式。
GPT vs BERT 对比
GPT 和 BERT 是预训练语言模型的两大范式,代表了截然不同的设计哲学。
| 维度 | GPT (Decoder-only) | BERT (Encoder-only) |
|---|---|---|
| 架构 | Transformer Decoder (Masked Self-Attention) | Transformer Encoder (Bidirectional Self-Attention) |
| 注意力方向 | 单向(只看左侧上文) | 双向(看完整上下文) |
| 预训练目标 | 自回归语言建模(预测下一个词) | 掩码语言建模 MLM + 下一句预测 NSP |
| 适合任务 | 生成任务(文本生成、对话、翻译) | 理解任务(分类、NER、问答抽取) |
| 使用方式 | GPT-1: 微调;GPT-2/3: Prompting / In-Context Learning | 微调(加任务特定头) |
| scaling 趋势 | 持续受益于规模扩大 | 规模扩大后收益递减(相对) |
GPT (自回归, 单向): BERT (掩码语言模型, 双向):
[我] --> [喜欢] --> [猫] [我] <-> [MASK] <-> [猫]
| | | | | |
v v v v v v
P(喜欢) P(猫) P(EOS) P([MASK]=喜欢)
(可以同时看到"我"和"猫")
交叉引用
关于 BERT 的详细架构分析和预训练策略,请参见 Transformer 系列的 BERT 相关笔记。关于两者背后的预训练范式(自回归 vs 自编码),可参考 Foundation Models 部分的预训练笔记。
为什么 Decoder-only 最终胜出?
尽管 BERT 在 2018-2020 年间主导了 NLP 排行榜,后来 Decoder-only 架构(GPT 系列)逐渐成为大模型的主流选择。原因包括:
- 统一的生成范式:所有任务都可以转化为文本生成,无需为每个任务设计特定的头部结构
- Zero/Few-shot 能力:不需要微调即可完成新任务,大幅降低应用门槛
- Scaling 行为更好:实验表明 Decoder-only 在参数量增加时性能提升更平滑、更持续
- 训练效率:自回归目标每个 token 都参与损失计算,而 MLM 只对被 mask 的 token 计算损失(通常 15%)
- 涌现能力:In-context learning、chain-of-thought 等能力主要在大规模自回归模型上涌现
Scaling Law 与 GPT 的启示
GPT 系列的演进深刻揭示了 Scaling Law 在语言模型中的作用。
Kaplan Scaling Law
OpenAI 的研究(Kaplan et al., 2020)发现语言模型的性能(交叉熵损失)与三个因素呈幂律关系:
其中 \(N\) 为参数量,\(D\) 为数据量,\(C\) 为计算量。
关键发现:
- 模型性能随规模增大呈平滑且可预测的幂律提升
- 在固定计算预算下,增大模型比增加数据更高效(后被 Chinchilla 修正)
- 架构细节(层数 vs 宽度的比例、注意力头数等)对性能的影响相对较小
从 GPT 系列看 Scaling 的效果
参数量 (对数尺度):
GPT-1 GPT-2 GPT-3 GPT-4
117M 1.5B 175B ~1.8T (传闻)
| | | |
+----13x-----+----117x-----+-----~10x---------+
| | | |
微调 Zero-shot In-Context 多模态
12个任务 初步涌现 Learning 强推理
SOTA 能力 Chain-of-Thought 专家考试水平
每一次规模的跃升都带来了质的变化,而不仅仅是量的提升。这正是 Scaling Law 最令人振奋之处。
思考与讨论
GPT 对 AI 发展的影响
- 范式转移:从"为每个任务训练专用模型"到"用一个通用模型解决所有任务",GPT 引领了 foundation model 范式
- Scaling 至上:GPT 系列的成功强化了"更大就是更好"的信念,推动了算力军备竞赛
- Prompt Engineering 的兴起:模型能力的释放不再依赖微调,而是取决于如何设计 prompt
- AI 安全与对齐:GPT 系列的强大能力也带来了安全问题(虚假信息、偏见、误用等),推动了 alignment 研究(RLHF 等)
开放问题
- 为什么 Transformer 的 scaling 行为如此平滑? 这一现象的理论解释仍然不完整
- In-Context Learning 的本质是什么? 是真正的"学习"还是模式匹配?
- 数据的天花板:当高质量文本数据接近耗尽时,scaling 还能继续吗?合成数据是出路吗?
- 效率问题:自回归生成本质上是串行的,每次只生成一个 token。有没有更高效的生成范式?
- 涌现能力的可预测性:能否提前预测模型在什么规模下会涌现某种能力?
总结
GPT 系列从 2018 年的 117M 参数模型发展到如今的超大规模多模态模型,不仅在技术上推动了自然语言处理的边界,更从根本上改变了我们对 AI 系统的认知。"预训练大模型 + 提示/对齐" 的范式已经成为当前 AI 研究的核心路径。理解 GPT 的架构设计、训练方法和 scaling 行为,是理解现代 AI 发展的关键基础。