01 LLM 理论基础
学习理念:从 GPT-1 到 ChatGPT 的演进路线上,每个模型的关键创新是什么?Transformer 内部每个组件(位置编码、注意力、FFN、归一化)的演进路线。不用记所有细节,重点是建立"什么技术解决了什么问题"的认知框架。
海外对标:OpenAI GPT 系列、Google Transformer、Meta LLaMA(SwiGLU/RMSNorm)、DeepSeek(MoE)
本节 AI 替代率:~85% | 人工干预率:~15%
| 角色 | 能力范围 |
|---|---|
| 🤖 AI 擅长 | 解释 GPT 各代差异、Transformer 组件原理、技术对比 |
| 👤 人类需理解 | "为什么"——RoPE 为什么优于绝对编码?GQA 为什么在效率和质量间取得平衡? |
📌 来源说明:本节内容提取自原始笔记第1-2章(GPT演进 + Transformer架构演进),按模块重组,省略过渡性文字。
📖 阅读优先级
| 等级 | 章节 | 说明 |
|---|---|---|
| 🟡 理解即可 | 一、GPT 演进 | 了解三段范式即可 |
| 🟡 理解即可 | 三、位置编码 | 知道 RoPE 优于绝对编码即可 |
| 🔴 必须深入 | 四、注意力 + KV Cache | Agent 开发核心——决定上下文长度和显存 |
| 🟢 直接跳过 | 五、FFN + 七、归一化 | 模型架构师才需要 |
| 🟢 直接跳过 | 六、MoE | 训练框架工程师才需要 |
一、GPT 系列演进

1.1 GPT-1(2018)
| 维度 | 内容 |
|---|---|
| 架构 | Transformer Decoder-only(首次验证单向语言模型) |
| 关键创新 | 预训练 + 微调范式:先在大规模无标注语料上预训练,再在小规模标注数据上微调 |
| 位置编码 | 可学习位置嵌入(Learned Positional Embedding)——模型自己学 |
| 参数 | 1.17亿 |
| 数据 | BooksCorpus(约 8 亿词) |
| 意义 | 验证了 Decoder-only + 预训练范式的有效性 |

1.2 GPT-2(2019)
| 维度 | 内容 |
|---|---|
| 架构 | 延续 Decoder-only |
| 关键创新 | 零样本(Zero-shot)泛化——无需微调,仅凭 prompt 即可完成任务 |
| 结构变化 | Pre-LayerNorm(从 PostNorm 改成 PreNorm,解决深层梯度不稳定) |
| 参数 | 15.42亿(≈GPT-1 的 10 倍) |
| 数据 | WebText(40GB,800 万网页) |
| 意义 | 首次发现规模效应(Scaling Effect):参数越大性能越好 |
1.3 GPT-3(2020)
| 维度 | 内容 |
|---|---|
| 架构 | Decoder-only,交替使用稠密 + 局部带状稀疏注意力 |
| 关键创新 | 上下文学习(In-Context Learning)——通过输入中的示例即可学习,无需梯度更新 |
| 参数 | 1750亿(GPT-2 的 100 倍) |
| 数据 | 570GB,约 3000 亿 token |
| 意义 | 规模扩展证明"大力出奇迹" |

1.4 InstructGPT(2022)
| 维度 | 内容 |
|---|---|
| 架构 | 与 GPT-3 相同 |
| 关键创新 | 三阶段训练范式——解决了 GPT-3 生成结果"不听话"的问题 |
| 三阶段 | SFT(监督微调,人工标注指令-回答对)→ RM(训练奖励模型,人工排序)→ RLHF(PPO 强化学习优化) |
| 意义 | 从"预测下一个词"升级为"理解和执行人类指令"——对齐(Alignment) |

1.5 ChatGPT(2022)
| 维度 | 内容 |
|---|---|
| 架构 | 与 InstructGPT 同技术路线 |
| 关键创新 | 对话格式数据——多轮对话训练,强调上下文保持 |
| 能力 | 连贯对话、错误修正、逻辑判断、安全防护 |
| 意义 | LLM 从研究走向全民应用 |

1.6 三阶段训练范式(行业标准)
预训练(Pre-training) → 监督微调(SFT) → 对齐(Alignment)
│ │ │
├ 海量无标注语料 ├ 人工指令-回答 ├ RLHF / DPO / ORPO
├ 自回归语言建模 ├ 指令理解能力 ├ 人类偏好对齐
└ 通用语言能力 └ 任务执行能力 └ 安全 & 有用性二、LLM 整体架构

输入层 Transformer Block × N 输出层
┌──────────┐ ┌──────────────────────────────────────┐ ┌──────────┐
│ Token │ │ ┌──────────┐ ┌──────────┐ │ │ Linear │
│ Embedding│ → │ │ Attention│ →│ FFN │ ... → │ → │ Project │
│ + │ │ │(MHA/GQA) │ │(SwiGLU) │ │ │ + Softmax│
│ Position │ │ └──────────┘ └──────────┘ │ └──────────┘
└──────────┘ └──────────────────────────────────────┘
三、位置编码演进
3.1 正余弦位置编码(Sinusoidal)
- 公式:固定函数生成,
PE(pos, 2i) = sin(pos/10000^(2i/d)),PE(pos, 2i+1) = cos(...) - 特点:无需训练、可外推(推理时可处理更长序列)、隐含相对位置信息
- 缺陷:实际注意力计算中,可学习参数矩阵
W会破坏正余弦的结构优势
3.2 可学习位置编码(Learned)
- 特点:为每个位置分配一个独立可训练向量,由数据驱动学习
- 优点:灵活性高,训练简单
- 缺陷:无法外推(超出最大序列长度的位置无嵌入)、参数量线性增长
3.3 旋转位置编码(RoPE)🔥 当前主流
由国内研究者苏剑林提出,直接作用于 q 和 k 向量:
核心思想:将 q/k 按维度两两分组,每组视为一个二维向量,施加与位置相关的旋转。
数学原理(简化版):
位置 m 的 q 向量的第 j 对二维子向量 → 旋转 m × θ_j 度
位置 n 的 k 向量的第 j 对二维子向量 → 旋转 n × θ_j 度
注意力得分中的第 j 对子向量贡献:
<q_m^(j), k_n^(j)> → 旋转后仅依赖 (m - n),即相对位置差三大优势:
- ✅ 显式编码相对位置——注意力得分天然依赖
m - n - ✅ 零参数且训练稳定——固定旋转矩阵,不随训练破坏几何性质
- ✅ 更容易外推——数学结构不依赖训练长度

四、注意力机制演进
4.1 MHA(Multi-Head Attention)——原始方案

每个注意力头独立维护自己的 Q、K、V:
self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias) # 每个头一套
self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias)
self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias)问题:推理时 KV Cache 中每个头都缓存独立的 K/V,缓存量 = n_layers × n_heads × seq_len × head_dim。模型越大,缓存越大。
4.2 KV Cache —— 推理加速关键
🔥 P0 必须理解:自回归生成时,如果不缓存,每生成一个 token 都要重新计算所有历史 token 的 K/V。KV Cache 把历史 K/V 存下来,只算当前 token。

# Prefill 阶段:计算 prompt 所有 token 的 K/V 并缓存
logits = model(prompt, use_cache=True) # cache_k, cache_v 被填充
# Decode 阶段:每次只输入新的 token,拼接缓存
for _ in range(max_new_tokens):
logits = model(next_token, use_cache=True) # 自动追加到 cache4.3 MQA(Multi-Query Attention)—— 共享 K/V
核心:所有注意力头共享同一套 K 和 V,只有 Q 独立。

MHA: Head 0: Q₀ K₀ V₀ | Head 1: Q₁ K₁ V₁ | ... | Head n: Qₙ Kₙ Vₙ
MQA: Head 0: Q₀ K V | Head 1: Q₁ K V | ... | Head n: Qₙ K V
(K/V 共享,缓存量降到 1/n)- ✅ KV Cache 降至 MHA 的 1/n
- ⚠️ 精度略有损失(共享 K/V 限制了头的表达能力)

4.4 GQA(Group-Query Attention)🔥 当前主流
核心:在 MHA 和 MQA 之间折中——将 Query 头分组,每组内共享 K/V:

GQA (n_kv_groups=2, n_heads=8):
Group 0: Head 0-3: Q₀₋₃ K₀ V₀ | Group 1: Head 4-7: Q₄₋₇ K₁ V₁
# Query:每个头独立(全量)
self.W_query = nn.Linear(d_in, num_heads * head_dim)
# Key/Value:每组共享(缩至 num_kv_groups * head_dim)
self.W_key = nn.Linear(d_in, num_kv_groups * head_dim)
self.W_value = nn.Linear(d_in, num_kv_groups * head_dim)
# 前向时,将 K/V repeat 到每组内的所有头
keys = keys.repeat_interleave(self.group_size, dim=1) # 复制到各组
现已被 LLaMA、Qwen、DeepSeek 等主流模型采用。
五、FFN 与激活函数演进
ReLU ─→ GELU ─→ SiLU/Swish ─→ GLU → SwiGLU(当前标准)
│ │ │ │
硬截断 平滑 sigmoid加权 门控双分支
死神经元 稳定梯度 与GELU相近 SiLU门控= SwiGLU


SwiGLU(当前主流)

class FeedForward(nn.Module):
def __init__(self, cfg):
self.fc1 = nn.Linear(cfg["emb_dim"], cfg["hidden_dim"])
self.fc2 = nn.Linear(cfg["emb_dim"], cfg["hidden_dim"]) # 门控分支
self.fc3 = nn.Linear(cfg["hidden_dim"], cfg["emb_dim"])
def forward(self, x):
return self.fc3(nn.functional.silu(self.fc1(x)) * self.fc2(x))
# └── 主分支 ──┘ └── 门控 ──┘结构:主分支 × 门控分支(GELU/SiLU 作为门控函数)
六、MoE(混合专家模型)
核心思想:多个并行的 FFN 专家 + 路由器(Router),每次只激活 Top-k 个专家。

Router
┌─────────────┼─────────────┐
↓ ↓ ↓
Expert 1 Expert 2 Expert 3 (非激活)
↓ ↓
└─────────────┘
加权求和 → 输出
三大优势:
- 高容量低计算——总参数量大,但每次只算 k/n 的专家
- 专家分工——不同 token 路由到不同专家,自动形成功能分化
- 天然可扩展——专家可分布到不同设备上并行
七、归一化与残差连接

RMSNorm(当前主流)
去掉 LayerNorm 的均值标准化,只基于均方根缩放:
class RMSNorm(nn.Module):
def forward(self, x):
variance = x.pow(2).mean(dim=-1, keepdim=True)
return x * torch.rsqrt(variance + self.eps) * self.scale归一化放置位置演进
Post Norm(原始Transformer):残差后归一化——破坏恒等梯度路径 ❌
Pre Norm(当前标准): 残差前归一化——保留恒等梯度路径 ✅
八、技术栈健康度
| 技术 | 健康度 | 说明 |
|---|---|---|
| Transformer | 🔥 巅峰 | LLM 基础架构事实标准 |
| RoPE | 🔥 巅峰 | 位置编码标准方案 |
| GQA | 🔥 巅峰 | 注意力效率方案标准 |
| SwiGLU | 🔥 巅峰 | FFN 激活函数标准 |
| RMSNorm + PreNorm | 🔥 巅峰 | 归一化标准方案 |
| MoE | 🔥 巅峰 | 高效扩展方案(DeepSeek/Mixtral) |
| MHA | 🟢 稳定 | 小模型可用,大模型已被 GQA 替代 |
| ReLU | 💀 淘汰 | 大模型中已不用 |
九、本阶段文件索引
| 优先级 | 文件 | 路径 |
|---|---|---|
| 🔥 P0 | 00_gpt2_model_structure.py | 3.代码/fine_tune_proj/00_gpt2_model_structure.py |
| 🔥 P0 | 01_qwen3_model_structure.py | 3.代码/fine_tune_proj/01_qwen3_model_structure.py |