GPT技术简单讲解
GPT 技术演进与原理
本文基于项目中手动实现的 Transformer,从结构层面出发,系统梳理 GPT 系列(GPT-1 → GPT-2 → GPT-3 → InstructGPT → GPT-4)的技术演进脉络。
前置:从 Transformer 说起
原始论文 Attention Is All You Need 中的 Encoder-Decoder 完整结构,用于序列到序列任务(如机器翻译):
源序列 ──→ Encoder (N层) ──→ enc_output
↓ (Cross-Attention)
目标序列 ──→ Decoder (N层) ──→ 输出词分布
GPT 的出发点是一个关键的架构裁剪决定:只保留 Decoder,丢弃 Encoder 和 Cross-Attention。
这一决定并非简化,而是不同任务假设下的主动选择:
| 架构 | 代表模型 | 任务范式 |
|---|---|---|
| Encoder-only | BERT | 理解任务(分类、问答、NER) |
| Encoder-Decoder | 原始 Transformer、T5 | 序列到序列(翻译、摘要) |
| Decoder-only | GPT 系列 | 语言生成、自回归预测 |
一、GPT-1(2018):用无监督预训练重新定义 NLP
论文:Improving Language Understanding by Generative Pre-Training(Radford et al., OpenAI 2018)
1.1 核心架构:Decoder-Only Transformer
GPT-1 使用 12 层 Decoder,但做了一处关键修改:移除 Cross-Attention 子层。
回顾本项目的 DecoderLayer:
def forward(self, x, enc_output, src_mask, tgt_mask):
# ① Masked Self-Attention
attn_output = self.self_attn(x, x, x, tgt_mask)
x = self.norm1(x + self.dropout(attn_output))
# ② Cross-Attention ← GPT 完全删除这一层
attn_output = self.cross_attn(x, enc_output, enc_output, src_mask)
x = self.norm2(x + self.dropout(attn_output))
# ③ FFN
ff_output = self.feed_forward(x)
x = self.norm3(x + self.dropout(ff_output))
GPT 的 Decoder Block 只保留 ① 和 ③:
输入 token 序列
→ Masked Self-Attention(因果掩码)
→ 残差 + LayerNorm
→ FFN
→ 残差 + LayerNorm
→ 输出
没有 Cross-Attention 意味着没有独立的"编码器上下文"——模型的所有知识都必须压缩进自身的权重参数中,通过对大规模文本的预训练来实现。
GPT-1 规模:
| 超参数 | 值 |
|---|---|
层数 num_layers |
12 |
模型维度 d_model |
768 |
注意力头数 num_heads |
12(每头 64 维) |
FFN 内层 d_ff |
3072(4× d_model) |
| 参数量 | ~1.17 亿 |
对比本项目:d_model=256, num_heads=8, num_layers=3,GPT-1 已经是其约 100 倍参数量。
1.2 因果语言模型(CLM)目标
GPT 的预训练任务是自回归语言建模:给定前 k 个 token,预测第 k+1 个。
L=−∑ilogP(ui∣ui−k,…,ui−1;Θ) \mathcal{L} = -\sum_{i} \log P(u_i \mid u_{i-k}, \ldots, u_{i-1}; \Theta) L=−i∑logP(ui∣ui−k,…,ui−1;Θ)
这与本项目的训练逻辑完全一致:
# train.py
output = transformer(src, tgt[:, :-1]) # 输入:去掉最后一个 token
loss = criterion(output, tgt[:, 1:]) # 标签:去掉第一个 token(即预测下一个词)
训练时,因果掩码(nopeak_mask)保证位置 i 只能看到 0~i 的历史:
# Transformer.py - generate_mask
nopeak_mask = (1 - torch.triu(torch.ones(1, seq_length, seq_length), diagonal=1)).bool()
这个掩码在 GPT 中是永久性的结构约束,而非推理时才加上的——GPT 的本质就是一个因果语言模型。
1.3 两阶段训练范式
GPT-1 提出了影响深远的预训练 + 微调范式:
阶段一:无监督预训练
在大规模无标注文本(BookCorpus,约 8 亿词)上用语言模型目标训练,学习通用语言表示。
阶段二:有监督微调(SFT)
在具体下游任务的标注数据上继续训练,仅需少量样本:
分类任务:[START] 文本 [EXTRACT] → Linear → 类别概率
蕴含任务:[START] 前提 [DELIM] 假设 [EXTRACT] → Linear → 标签
微调时在预训练目标上加一个辅助 LM loss,防止遗忘:
Ltotal=Ltask+λ⋅LLM \mathcal{L}_{\text{total}} = \mathcal{L}_{\text{task}} + \lambda \cdot \mathcal{L}_{\text{LM}} Ltotal=Ltask+λ⋅LLM
GPT-1 在 12 个 NLP 任务中的 9 个超越了当时的 SOTA,验证了"大规模预训练 + 轻量微调"路线的有效性。
二、GPT-2(2019):规模即能力,零样本学习
论文:Language Models are Unsupervised Multitask Learners(Radford et al., OpenAI 2019)
2.1 规模爆炸
GPT-2 将参数量推到了 15 亿,是 GPT-1 的 10 倍以上:
| 版本 | 层数 | d_model | num_heads | 参数量 |
|---|---|---|---|---|
| GPT-2 Small | 12 | 768 | 12 | 1.17 亿 |
| GPT-2 Medium | 24 | 1024 | 16 | 3.45 亿 |
| GPT-2 Large | 36 | 1280 | 20 | 7.74 亿 |
| GPT-2 XL | 48 | 1600 | 25 | 15.42 亿 |
训练数据从 8 亿词扩展到 WebText(从 Reddit 高质量链接爬取,约 40 GB)。
2.2 架构改进:Pre-Norm
GPT-1 沿用原始 Transformer 的 Post-Norm(子层后归一化):
# 本项目的 Post-Norm(同 GPT-1)
x = self.norm1(x + self.dropout(attn_output))
GPT-2 改为 Pre-Norm(子层前归一化):
# GPT-2 的 Pre-Norm
attn_output = self.attention(self.norm1(x), ...)
x = x + self.dropout(attn_output)
ff_output = self.feed_forward(self.norm2(x))
x = x + self.dropout(ff_output)
以及在最后一层 Decoder 后额外加一个 LayerNorm。
为什么 Pre-Norm 更稳定?
Post-Norm 中,残差连接的信号在经过 LayerNorm 后可能被压缩,导致深层网络梯度传播困难。Pre-Norm 先归一化再做子层计算,残差路径上的梯度可以直接反传,训练更稳定,允许堆叠更多层。
2.3 零样本(Zero-Shot)泛化
GPT-2 最重要的发现是:足够大的语言模型,无需任何微调,仅通过提示词(prompt)就能完成多种任务。
其理论依据在于,所有 NLP 任务本质上都可以用语言描述:
翻译: "将英文翻译为法文:cheese => fromage;cat =>"
摘要: "文章:...(长文本)...;TL;DR:"
问答: "问题:巴黎是哪个国家的首都?答案:"
语言模型被重新定义为:
P(output∣input)≈P(output∣task description,input) P(\text{output} \mid \text{input}) \approx P(\text{output} \mid \text{task description}, \text{input}) P(output∣input)≈P(output∣task description,input)
这意味着:只要预训练数据足够丰富多样,模型在学习预测下一个 token 的过程中,隐式地学会了执行各种任务的能力。这是后来 In-Context Learning 的思想萌芽。
GPT-2 的 WebText 数据规模仍不够大,零样本效果并不稳定,但方向已经确立。
三、GPT-3(2020):涌现能力与上下文学习
论文:Language Models are Few-Shot Learners(Brown et al., OpenAI 2020)
3.1 参数量的质变:1750 亿
| 超参数 | GPT-3 |
|---|---|
| 层数 | 96 |
| d_model | 12288 |
| 注意力头数 | 96(每头 128 维) |
| d_ff | 49152(4× d_model) |
| 参数量 | 1750 亿 |
| 训练数据 | ~570 GB(Common Crawl + WebText2 + Books + Wikipedia) |
3.2 稀疏注意力(Sparse Attention)
GPT-3 引入了交替使用的注意力模式,解决长序列下 O(L²) 注意力的计算瓶颈:
- 局部密集注意力层:每个 token 关注相邻的固定窗口(如前 128 个 token)
- 全局步进注意力层:每个 token 关注固定步长间隔的 token(如每隔 128 个采样一个)
两种模式交替堆叠,兼顾局部精细信息和全局长程依赖,计算复杂度降至 O(L√L)。
回顾本项目的 scaled_dot_product_attention,它是标准的全注意力:
attn_scores = torch.matmul(Q, K.transpose(-1, -2)) / math.sqrt(self.d_k)
# 形状:(B, num_heads, L, L) ← L² 的注意力矩阵
当 L 从 50(本项目)增长到 GPT-3 的 2048,再到后来模型的 128K+,L² 的内存/计算开销成为核心瓶颈,稀疏注意力、线性注意力、Flash Attention 等技术相继出现。
3.3 上下文学习(In-Context Learning,ICL)
GPT-3 最具颠覆性的发现:在推理时,通过在 prompt 中提供少量示例(few-shot),模型无需更新任何参数就能学会新任务。
示例(few-shot prompt):
英文:sea otter 法文:loutre de mer
英文:peppermint 法文:menthe poivrée
英文:cheese 法文:
模型会续写出正确答案 fromage,但权重没有发生任何更新。
三种学习模式对比:
| 模式 | 示例数 | 参数更新 |
|---|---|---|
| Zero-Shot | 0 | 否 |
| One-Shot | 1 | 否 |
| Few-Shot | 多个 | 否 |
| Fine-Tuning | 大量 | 是 |
ICL 的工作机制至今仍是研究热点。主流假设是:Transformer 的前向传播在 activation 空间中实现了某种隐式的梯度下降——即模型的注意力机制在推理时对 few-shot 示例进行了"即时拟合"。
3.4 涌现能力(Emergent Abilities)
随着规模增大,某些能力突然从不具备跳跃到具备,而非平滑增长:
- 算术运算(3 位数加减法):在约 130 亿参数时突然出现
- 多步推理:在千亿规模时突然出现
- 代码生成能力
- 语言理解的多语言迁移
这种涌现现象颠覆了"性能随规模平滑提升"的直觉,也催生了后续的**Scaling Laws(缩放定律)**研究。
Chinchilla Scaling Law(DeepMind, 2022)发现:最优训练应满足:
训练 token 数≈20×参数量 \text{训练 token 数} \approx 20 \times \text{参数量} 训练 token 数≈20×参数量
即 GPT-3 的 1750 亿参数模型,理想训练 token 数约为 3.5 万亿——这一发现直接影响了后续模型的数据/算力分配策略。
四、InstructGPT / GPT-3.5(2022):对齐与 RLHF
论文:Training language models to follow instructions with human feedback(Ouyang et al., OpenAI 2022)
4.1 原始 GPT-3 的对齐问题
尽管 GPT-3 能力强大,但它本质上只是一个"文本续写机器",存在明显缺陷:
- 不遵循指令:提问"写一首诗",它可能续写"……另一个要求是……"
- 有害内容:会生成歧视性、误导性文本
- 虚构事实(幻觉):自信地生成错误信息
根本原因:预训练目标(预测下一个 token)与用户期望(有帮助、无害、诚实)存在偏差——即对齐问题(Alignment Problem)。
4.2 RLHF 三阶段流程
InstructGPT 引入基于人类反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF):
阶段一:监督微调(SFT)
收集人工编写的理想回答数据(约 13K 条),对 GPT-3 做有监督微调,得到一个初步"听话"的模型 πSFT\pi^{\text{SFT}}πSFT。
阶段二:训练奖励模型(Reward Model,RM)
对同一个 prompt,用 πSFT\pi^{\text{SFT}}πSFT 生成多个不同答案,人工标注答案的优劣排序:
prompt: "如何学好编程?"
答案 A > 答案 C > 答案 B ← 人工排序
用这些排序数据训练一个奖励模型,使其能对任意(prompt, response)对打分:
LRM=−E(x,yw,yl)∼D[logσ(rθ(x,yw)−rθ(x,yl))] \mathcal{L}_{\text{RM}} = -\mathbb{E}_{(x, y_w, y_l) \sim D}\left[\log \sigma\left(r_\theta(x, y_w) - r_\theta(x, y_l)\right)\right] LRM=−E(x,yw,yl)∼D[logσ(rθ(x,yw)−rθ(x,yl))]
其中 ywy_wyw 是更好的答案,yly_lyl 是更差的答案,rθr_\thetarθ 是奖励分数。
阶段三:PPO 强化学习
以奖励模型为环境信号,用 PPO(Proximal Policy Optimization)算法优化语言模型策略 πϕ\pi_\phiπϕ:
最大化:Ex∼D,y∼πϕ[rθ(x,y)]−β⋅DKL[πϕ(y∣x)∥πSFT(y∣x)] \text{最大化:} \mathbb{E}_{x \sim D, y \sim \pi_\phi}\left[r_\theta(x, y)\right] - \beta \cdot D_{\text{KL}}\left[\pi_\phi(y|x) \| \pi^{\text{SFT}}(y|x)\right] 最大化:Ex∼D,y∼πϕ[rθ(x,y)]−β⋅DKL[πϕ(y∣x)∥πSFT(y∣x)]
- rθ(x,y)r_\theta(x, y)rθ(x,y):奖励模型的打分(越高越好)
- DKLD_{\text{KL}}DKL:KL 散度惩罚项,防止模型偏离 SFT 初始化太远(避免"奖励欺骗"——模型学会讨好奖励模型而非真正提升质量)
RLHF 的作用:
| 维度 | GPT-3 | InstructGPT |
|---|---|---|
| 遵循指令 | 差 | 好 |
| 有害内容 | 频繁 | 大幅减少 |
| 诚实性 | 差(常编造) | 有改善 |
| 人类偏好 | 基准 | 1.3B 版本即超越 175B GPT-3 |
关键发现:仅 13 亿参数的 InstructGPT 在人类偏好评测中胜过 175 亿参数的 GPT-3——对齐的价值甚至超过了规模的价值。
4.3 ChatGPT 的技术基础
ChatGPT(2022 年 11 月发布)本质上是在 GPT-3.5(即代码能力增强版的 InstructGPT)基础上,针对对话场景进一步 RLHF 训练的产物:
- 多轮对话的上下文拼接(将对话历史作为 prompt 输入)
- 对拒绝有害请求做专门的偏好标注
- 系统提示词(System Prompt)机制的引入
五、GPT-4(2023):多模态与能力边界
技术报告:GPT-4 Technical Report(OpenAI 2023)
OpenAI 对 GPT-4 的架构细节几乎未公开,但从公开信息和推断中可以梳理出关键技术方向。
5.1 多模态输入
GPT-4 是第一个原生支持图像+文本混合输入的 GPT 版本(Vision 能力)。
实现原理:将图像通过视觉编码器(类似 ViT,将图像切分为 patch,每个 patch 线性映射为 token 向量)转化为与文本 token 同维度的向量序列,拼接后统一输入 Transformer。
这实际上让 GPT-4 从"纯 Decoder"重新回到了"有编码器"的形式——只是编码器是视觉编码器,而非文本编码器。
图像 → Vision Encoder(ViT)→ 图像 token 序列
文本 → Text Embedding → 文本 token 序列
↓ 拼接
统一的 Transformer Decoder
5.2 Mixture of Experts(MoE)
业界普遍认为 GPT-4 采用了专家混合架构(MoE),总参数约 1.8 万亿,但每次推理只激活约 2200 亿参数。
MoE 的核心思想是将 FFN 层替换为多个并行的"专家网络",加上一个"路由器"(Router):
输入 x
→ Router:softmax(W_r · x) → 选择 top-k 个专家
→ 被选中的 Expert_i(x)
→ 加权求和输出
以本项目的 PositionWiseFeedForward 为基础类比:
# 原始 FFN(本项目)
def forward(self, x):
return self.fc2(self.relu(self.fc1(x)))
# MoE FFN(概念示意)
def forward(self, x):
scores = self.router(x) # (B, L, num_experts)
top_k_indices = scores.topk(k=2, dim=-1).indices # 每个 token 选 2 个专家
output = sum(scores[i] * self.experts[i](x) for i in top_k_indices)
return output
MoE 的优势:参数量大但计算量可控——1.8 万亿参数提供了巨大的知识存储容量,但每次前向传播只激活约 1/8 的参数,计算代价接近 2000 亿参数的密集模型。
5.3 能力跃升
GPT-4 相对 GPT-3.5 的提升体现在:
- 推理能力:在司法考试(Bar Exam)中达到前 10% 水平,GPT-3.5 仅约 10% 分位
- 长上下文:支持 8K/32K token 上下文窗口,后扩展到 128K(GPT-4 Turbo)
- 鲁棒性:对模糊、歧义性问题的处理能力大幅提升
- 遵循复杂指令:能准确执行多步骤、带约束的复杂任务
5.4 可预测的缩放
GPT-4 技术报告披露了一个关键方法:用小模型预测大模型的性能。
在训练完成之前,通过在不同规模的检查点上观察 loss 曲线,利用幂律外推(power-law extrapolation)预测全尺寸模型的最终性能。这意味着 OpenAI 在投入大量算力之前,就能对结果有较高置信度的预测。
六、技术演进全景图
Transformer (2017)
Encoder-Decoder,seq2seq,机器翻译
↓
[去掉 Encoder 和 Cross-Attention,只保留 Decoder]
↓
GPT-1 (2018)
12层,117M,预训练+微调,BookCorpus
→ 首次证明大规模预训练对 NLP 任务的通用价值
↓
[10x 规模,Pre-Norm,WebText 数据]
↓
GPT-2 (2019)
48层,1.5B,零样本学习
→ 首次展示不微调也能做任务,语言模型即多任务学习器
↓
[100x 规模,稀疏注意力,更大数据集]
↓
GPT-3 (2020)
96层,175B,少样本上下文学习
→ 涌现能力,ICL 范式,重新定义 AI 能力边界
↓
[RLHF 对齐,人类偏好优化]
↓
InstructGPT / ChatGPT (2022)
SFT + RM + PPO,指令遵循
→ 对齐的价值,1.3B 胜 175B,AI 助手时代开始
↓
[多模态,MoE,长上下文,可预测缩放]
↓
GPT-4 (2023)
~1.8T(MoE,激活~220B),图像+文本输入
→ 专业级推理能力,接近人类专家水平
七、核心技术主题横向对比
7.1 位置编码的演进
| 版本 | 位置编码方式 |
|---|---|
| 原始 Transformer / GPT-1 | 固定正余弦编码(本项目实现) |
| GPT-2 / GPT-3 | 可学习的绝对位置编码(Learned PE) |
| GPT-4 / LLaMA 2 | RoPE(旋转位置编码)或 ALiBi |
RoPE(Rotary Position Embedding)将位置信息编码进 Q/K 的旋转变换中,使得注意力分数天然携带相对位置信息,且对超出训练长度的序列有更好的外推性。
回顾本项目的固定正余弦编码:
# PositionalEncoding.py
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
return x + self.pe[:, :x.size(1)] # 加法注入
RoPE 则是把位置信息通过旋转矩阵乘入 Q/K 向量,而非加到输入 embedding 上,在内积计算时自然呈现相对位置关系。
7.2 Attention 的计算效率演进
| 技术 | 核心思想 | 复杂度 |
|---|---|---|
| 标准注意力(本项目) | 全 Q/K 矩阵乘法 | O(L²) 时间与空间 |
| 稀疏注意力(GPT-3) | 局部窗口 + 步进全局 | O(L√L) |
| Flash Attention(2022) | IO-aware 分块计算,避免显存瓶颈 | O(L²) 时间,O(L) 显存 |
| Multi-Query / GQA(2023) | 多个 Q 头共享 K/V | 减少 K/V 缓存,加速推理 |
Flash Attention 不改变数学结果,而是重新安排计算顺序(分块 softmax),将 L² 大小的注意力矩阵完全留在 SRAM 中而不写回 HBM,在硬件层面大幅减少内存带宽瓶颈。
7.3 归一化位置的演进
Post-Norm(本项目 / GPT-1):x = LayerNorm(x + SubLayer(x))
Pre-Norm(GPT-2+): x = x + SubLayer(LayerNorm(x))
RMS Norm(LLaMA): 用 RMSNorm 替代 LayerNorm,去掉均值归一化,计算更快
7.4 激活函数的演进
# 本项目 PositionWiseFeedForward.py
self.relu = nn.ReLU()
return self.fc2(self.relu(self.fc1(x)))
| 版本 | 激活函数 | 特点 |
|---|---|---|
| 原始 Transformer / GPT-1/2/3 | ReLU | 简单,但存在"死亡神经元"问题 |
| GPT-3.5+ / PaLM | GeLU | 平滑,梯度更稳定 |
| LLaMA 2 / Mistral | SwiGLU | 门控机制,实践效果最优 |
GeLU(Gaussian Error Linear Unit):x⋅Φ(x)x \cdot \Phi(x)x⋅Φ(x),其中 Φ\PhiΦ 是标准正态分布 CDF,近似为平滑版 ReLU。
SwiGLU:引入门控机制,FFN 扩展为三个矩阵:
# SwiGLU 结构
def forward(self, x):
return self.fc2(F.silu(self.fc1(x)) * self.fc3(x))
SwiGLU(x)=Swish(W1x)⊗(W3x)\text{SwiGLU}(x) = \text{Swish}(W_1 x) \otimes (W_3 x)SwiGLU(x)=Swish(W1x)⊗(W3x),逐元素乘法形成门控,实践中比 GeLU 更优。
八、为什么 Decoder-Only 架构获胜?
这是个值得深思的问题。BERT(Encoder-Only)在理解任务上曾全面领先,为何最终 GPT 路线主导了大语言模型?
1. 统一性
Decoder-Only 的语言建模目标极其简单——预测下一个 token,这一目标可以无缝应用于所有文本,无需设计特殊的 Masked LM 或 NSP 目标。
2. 生成能力原生
因果语言模型天然支持生成,而 BERT 类模型生成文本需要额外设计(如 BERT 做 MLM,不能直接生成连贯文本)。
3. 上下文学习(ICL)
ICL 天然契合自回归模式——把示例和问题都放进一段文本,让模型续写答案。
4. 规模的一致性
扩展 Decoder-Only 模型只需增加层数、增大维度,架构极简,工程上更易于规模化。
从本项目的代码视角看:Decoder-Only 模型就是把 Transformer.forward 中的 Encoder 去掉,只保留 decoder_layers 的堆叠,且每个 DecoderLayer 只有 Self-Attention 和 FFN(本项目的 ①③)。
九、知识密度总结
预训练数据规模(词/token)
GPT-1: ~8 亿(BookCorpus)
GPT-2: ~40 亿(WebText)
GPT-3: ~3000 亿(混合语料)
GPT-4: >10 万亿(估计)
参数量
GPT-1: 117M
GPT-2: 1.5B (13× GPT-1)
GPT-3: 175B (117× GPT-2)
GPT-4: ~1.8T (估计,MoE)
关键技术跃升
GPT-1: 预训练+微调范式
GPT-2: 零样本学习,Pre-Norm
GPT-3: In-Context Learning,涌现能力,稀疏注意力
InstructGPT: RLHF,人类对齐
GPT-4: 多模态,MoE,可预测缩放
从本项目的 3 层、256 维、1.17 亿参数不到的小型 Transformer,到 GPT-4 的 96 层、12288 维、1.8 万亿参数——架构的核心单元(Multi-Head Attention + FFN + 残差 + LayerNorm)从未改变,变化的是规模、对齐方式与工程实现。这正是 Transformer 架构最深刻的特质:极简的核心结构,极强的可扩展性。
更多推荐



所有评论(0)