GPT完全指南(一):发展历程与核心思想
从GPT-1到GPT-4,深入理解大语言模型的发展脉络、核心思想与技术演进
引言:为什么要学习GPT?
GPT(Generative Pre-trained Transformer)是当前AI领域最具影响力的技术之一。从2018年GPT-1问世,到2023年GPT-4引爆全球,这个系列模型不仅推动了NLP技术的革命性进步,更开创了人工智能的新纪元。
GPT的历史地位
| 里程碑 | 意义 |
|---|---|
| GPT-1 (2018) | 验证了预训练+微调范式的有效性 |
| GPT-2 (2019) | 展示了规模带来的涌现能力 |
| GPT-3 (2020) | 开创了In-Context Learning时代 |
| ChatGPT (2022) | 让AI对话进入大众视野 |
| GPT-4 (2023) | 多模态、更强推理能力 |
技术演进时间线
2017年之前:预GPT时代
Word2Vec (2013) → GloVe (2014) → ELMo (2018) → Transformer (2017)
核心问题:
- 词向量是静态的,无法处理一词多义
- RNN/LSTM训练慢,难以并行
- Seq2Seq模型需要大量标注数据
2017年:Transformer横空出世
Google发表”Attention Is All You Need”,提出纯注意力架构:
# Transformer核心公式
# Attention(Q, K, V) = softmax(QK^T / √d_k) V
def scaled_dot_product_attention(Q, K, V, mask=None):
d_k = Q.size(-1)
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
attention_weights = F.softmax(scores, dim=-1)
output = torch.matmul(attention_weights, V)
return output, attention_weights
Transformer的革命性:
- 完全并行化训练
- 长程依赖建模能力
- 统一的编码器-解码器架构
GPT-1:预训练范式的开端
核心论文
“Improving Language Understanding by Generative Pre-Training” (2018, OpenAI)
核心思想
GPT-1提出了两阶段学习范式:
Stage 1: 无监督预训练(大规模无标注文本)
↓
Stage 2: 有监督微调(特定任务)
架构特点
# GPT-1配置
class GPT1Config:
vocab_size = 40478 # BPE词表
n_positions = 512 # 最大序列长度
n_embd = 768 # 嵌入维度
n_layer = 12 # Transformer层数
n_head = 12 # 注意力头数
# 总参数量:约117M
关键创新:
- Decoder-only架构:只使用Transformer解码器
- 因果注意力掩码:只能看到之前的token
- BPE分词:解决OOV问题
预训练目标
# 语言建模目标:预测下一个token
# L1 = Σ log P(u_i | u_{i-k}, ..., u_{i-1}; θ)
def language_modeling_loss(logits, labels):
"""
logits: (batch_size, seq_len, vocab_size)
labels: (batch_size, seq_len)
"""
shift_logits = logits[:, :-1, :].contiguous()
shift_labels = labels[:, 1:].contiguous()
loss = F.cross_entropy(
shift_logits.view(-1, shift_logits.size(-1)),
shift_labels.view(-1)
)
return loss
微调方法
# 输入格式统一
# 文本分类: [Start] text [Extract] → label
# 文本蕴含: [Start] premise [Delim] hypothesis [Extract] → label
# 问答: [Start] context [Delim] question [Delim] answer [Extract]
class GPT1ForClassification(nn.Module):
def __init__(self, gpt_model, num_labels):
super().__init__()
self.gpt = gpt_model
self.classifier = nn.Linear(768, num_labels)
def forward(self, input_ids):
# 取最后一个token的hidden state
hidden_states = self.gpt(input_ids)
cls_hidden = hidden_states[:, -1, :] # [Extract] token
logits = self.classifier(cls_hidden)
return logits
GPT-1的局限
- 模型规模小,能力有限
- 仍需针对每个任务微调
- 上下文窗口仅512
GPT-2:规模的力量
核心论文
“Language Models are Unsupervised Multitask Learners” (2019, OpenAI)
核心思想
GPT-2最重要的发现:足够大的语言模型可以零样本完成多种任务
"All NLP tasks can be framed as question answering"
规模对比
| 模型 | 参数量 | 层数 | 维度 |
|---|---|---|---|
| GPT-2 Small | 124M | 12 | 768 |
| GPT-2 Medium | 355M | 24 | 1024 |
| GPT-2 Large | 774M | 36 | 1280 |
| GPT-2 XL | 1.5B | 48 | 1600 |
数据集:WebText
# WebText数据集
# - 来源:Reddit外链(karma > 3)
# - 规模:800万文档,40GB文本
# - 特点:高质量、多样性
# 数据清洗流程
def preprocess_webtext(document):
# 1. 去重
# 2. 语言过滤(只保留英文)
# 3. 去除样板文本
# 4. 质量过滤
return cleaned_document
Zero-Shot能力
# 零样本任务示例
# 翻译
prompt = "Translate English to French: cheese =>"
# 模型输出: "fromage"
# 摘要
prompt = """
Article: [长文本]
TL;DR:
"""
# 模型生成摘要
# 问答
prompt = """
Q: What is the capital of France?
A:"""
# 模型输出: "Paris"
架构改进
class GPT2Block(nn.Module):
def __init__(self, config):
super().__init__()
# Pre-LN: Layer Norm放在前面
self.ln_1 = nn.LayerNorm(config.n_embd)
self.attn = CausalSelfAttention(config)
self.ln_2 = nn.LayerNorm(config.n_embd)
self.mlp = MLP(config)
def forward(self, x):
# Pre-LN残差连接
x = x + self.attn(self.ln_1(x))
x = x + self.mlp(self.ln_2(x))
return x
关键改进:
- Pre-LayerNorm:训练更稳定
- 更大的上下文:1024 tokens
- 更好的初始化:残差层权重缩放
GPT-2的争议
OpenAI最初拒绝公开完整模型,引发关于AI安全的讨论:
- 担心被用于生成虚假信息
- 开创了”负责任发布”先例
- 最终在验证安全后逐步公开
GPT-3:涌现能力的巅峰
核心论文
“Language Models are Few-Shot Learners” (2020, OpenAI)
规模突破
# GPT-3配置
class GPT3Config:
# GPT-3 175B
n_params = 175_000_000_000 # 1750亿参数
n_layer = 96
n_head = 96
d_model = 12288
d_ff = 49152
vocab_size = 50257
n_positions = 2048
# 训练配置
batch_size = 3_200_000 # tokens per batch
training_tokens = 300_000_000_000 # 3000亿tokens
模型系列
| 模型名 | 参数量 | 训练token | 备注 |
|---|---|---|---|
| GPT-3 Small | 125M | 300B | 基线 |
| GPT-3 Medium | 350M | 300B | |
| GPT-3 Large | 760M | 300B | |
| GPT-3 XL | 1.3B | 300B | |
| GPT-3 2.7B | 2.7B | 300B | |
| GPT-3 6.7B | 6.7B | 300B | |
| GPT-3 13B | 13B | 300B | |
| GPT-3 175B | 175B | 300B | davinci |
In-Context Learning
GPT-3最重要的发现:模型可以通过上下文示例学习新任务
# Zero-shot: 无示例
prompt_zero = """
Translate English to French:
sea otter =>
"""
# One-shot: 1个示例
prompt_one = """
Translate English to French:
cheese => fromage
sea otter =>
"""
# Few-shot: 多个示例
prompt_few = """
Translate English to French:
cheese => fromage
cat => chat
dog => chien
sea otter =>
"""
涌现能力(Emergent Abilities)
随着模型规模增大,突然出现的新能力:
模型规模 → 涌现能力
< 1B 基础语言生成
1B - 10B 简单推理、翻译
10B - 100B 复杂推理、代码生成
> 100B 数学推理、思维链
典型涌现能力:
- 算术运算
- 思维链推理(Chain-of-Thought)
- 代码生成
- 多语言翻译
Scaling Laws
OpenAI发现的缩放定律:
# 损失与三个因素的幂律关系
# L(N) ∝ N^{-0.076} # 参数量
# L(D) ∝ D^{-0.095} # 数据量
# L(C) ∝ C^{-0.050} # 计算量
# 最优分配
# 给定计算预算C,最优参数量和数据量的比例约为:
# N_opt ∝ C^0.73
# D_opt ∝ C^0.27
def compute_optimal_allocation(compute_budget):
"""计算给定预算下的最优配置"""
n_params = compute_budget ** 0.73
n_data = compute_budget ** 0.27
return n_params, n_data
API发布
GPT-3通过API提供服务,开创商业化先河:
import openai
# 2020年的API调用方式
response = openai.Completion.create(
engine="davinci", # 最大模型
prompt="Translate English to French: Hello, how are you?",
max_tokens=60,
temperature=0.7
)
print(response.choices[0].text)
InstructGPT:对齐的开始
核心论文
“Training language models to follow instructions with human feedback” (2022, OpenAI)
为什么需要对齐?
GPT-3的问题:
- 可能生成有害内容
- 不遵循用户意图
- 输出格式不可控
- 容易”胡说八道”
RLHF训练流程
# 三阶段训练
# Stage 1: 监督微调 (SFT)
# 使用人类标注的高质量对话数据
def sft_training(model, demonstrations):
"""
demonstrations: [(prompt, ideal_response), ...]
"""
for prompt, response in demonstrations:
input_ids = tokenize(prompt + response)
loss = language_modeling_loss(model(input_ids))
loss.backward()
optimizer.step()
# Stage 2: 训练奖励模型 (RM)
class RewardModel(nn.Module):
def __init__(self, base_model):
super().__init__()
self.backbone = base_model
self.reward_head = nn.Linear(hidden_size, 1)
def forward(self, input_ids):
hidden = self.backbone(input_ids)
reward = self.reward_head(hidden[:, -1, :])
return reward
# 奖励模型训练:偏好对比
def rm_loss(reward_chosen, reward_rejected):
"""
chosen: 人类偏好的回复
rejected: 人类不偏好的回复
"""
return -torch.log(torch.sigmoid(reward_chosen - reward_rejected)).mean()
# Stage 3: PPO强化学习
def ppo_training(policy, reward_model, prompts):
for prompt in prompts:
# 生成回复
response = policy.generate(prompt)
# 计算奖励
reward = reward_model(prompt + response)
# 加入KL惩罚防止偏离太远
kl_penalty = kl_divergence(policy, reference_policy)
total_reward = reward - beta * kl_penalty
# PPO更新
ppo_update(policy, total_reward)
对齐税(Alignment Tax)
对齐后模型在某些任务上性能下降:
| 任务 | GPT-3 175B | InstructGPT 1.3B |
|---|---|---|
| 指令遵循 | 差 | 好 |
| 真实性 | 较差 | 较好 |
| 安全性 | 差 | 好 |
| 学术基准 | 高 | 略低 |
ChatGPT:现象级产品
2022年11月30日
ChatGPT发布,5天内用户破百万,两个月破亿。
与InstructGPT的区别
# ChatGPT = InstructGPT + 对话优化
# 训练数据差异
instructgpt_data = [
{"prompt": "Write a poem", "response": "..."}
]
chatgpt_data = [
{
"conversation": [
{"role": "user", "content": "Hi!"},
{"role": "assistant", "content": "Hello! How can I help?"},
{"role": "user", "content": "Write a poem"},
{"role": "assistant", "content": "..."}
]
}
]
对话格式
# ChatML格式
"""
<|im_start|>system
You are a helpful assistant.
<|im_end|>
<|im_start|>user
Hello!
<|im_end|>
<|im_start|>assistant
Hi! How can I help you today?
<|im_end|>
"""
# 现代API调用
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
]
)
GPT-4:多模态与更强推理
核心特性
- 多模态输入:支持图像理解
- 更长上下文:8K / 32K / 128K
- 更强推理:在多项基准上达到人类水平
性能对比
| 考试/基准 | GPT-3.5 | GPT-4 |
|---|---|---|
| 美国律师资格考试 | ~10% | ~90% |
| SAT数学 | 70% | 89% |
| GRE写作 | 54% | 80% |
| LeetCode | Easy级别 | Hard级别 |
多模态能力
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4-vision-preview",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg"
}
}
]
}
],
max_tokens=300
)
GPT-4的神秘面纱
OpenAI未公开GPT-4的详细信息:
- 参数量(传闻1.7万亿,MoE架构)
- 训练数据
- 具体架构改进
GPT技术演进总结
架构演进
Transformer Decoder
↓
Pre-LayerNorm(GPT-2)
↓
更大规模(GPT-3)
↓
RLHF对齐(InstructGPT)
↓
多模态(GPT-4)
关键技术
| 技术 | 首次出现 | 作用 |
|---|---|---|
| BPE分词 | GPT-1 | 处理开放词表 |
| Pre-LN | GPT-2 | 稳定训练 |
| Scaling Laws | GPT-3 | 指导模型扩展 |
| In-Context Learning | GPT-3 | 零样本/少样本学习 |
| RLHF | InstructGPT | 人类偏好对齐 |
| 多模态 | GPT-4 | 跨模态理解 |
参数量演进
GPT-1: 117M (2018)
GPT-2: 1.5B (2019) → 10x
GPT-3: 175B (2020) → 100x
GPT-4: ~1.7T? (2023) → 10x
开源替代品
主要开源模型
| 模型 | 参数量 | 开发者 | 特点 |
|---|---|---|---|
| LLaMA 2 | 7B-70B | Meta | 开源标杆 |
| Mistral | 7B | Mistral AI | 效率最高 |
| Qwen | 7B-72B | 阿里 | 中文友好 |
| DeepSeek | 7B-67B | DeepSeek | 代码能力强 |
| Yi | 6B-34B | 零一万物 | 长上下文 |
为什么要学开源模型?
- 可定制:可以针对特定任务微调
- 可控制:完全掌控模型行为
- 成本低:本地部署无API费用
- 隐私保护:数据不离开本地
小结
GPT发展的核心洞见
- 规模是关键:更大的模型有质的飞跃
- 数据质量重要:高质量数据胜过大规模数据
- 预训练范式有效:通用能力可迁移
- 对齐是必要的:让模型有用且安全
- 涌现能力存在:大模型产生新能力
下一篇预告
深入GPT的核心架构:Decoder-only Transformer的每个组件、位置编码、注意力机制的实现细节。
参考文献
- Radford, A. et al. “Improving Language Understanding by Generative Pre-Training” (2018)
- Radford, A. et al. “Language Models are Unsupervised Multitask Learners” (2019)
- Brown, T. et al. “Language Models are Few-Shot Learners” (2020)
- Ouyang, L. et al. “Training language models to follow instructions with human feedback” (2022)
- OpenAI. “GPT-4 Technical Report” (2023)