LLM大模型原理解析-Karpathy分享
先看全局:一条流水线,四个阶段
flowchart LR
A["① 预训练<br/>通读互联网"] --> B["② SFT-监督微调<br/>学会对话格式"]
B --> C["③ RLHF-强化学习<br/>对齐人类偏好"]
C --> D["④ 推理部署<br/>回答你的问题"]
A -.产物.-> A2["Base Model<br/>续写机器"]
B -.产物.-> B2["Instruct Model<br/>懂格式"]
C -.产物.-> C2["Assistant<br/>安全·有用·诚实"]
D -.产物.-> D2["如ChatGPT<br/>大模型产品"]
classDef stage fill:#e3f2fd,stroke:#1976d2,stroke-width:2px,color:#0d47a1
classDef product fill:#fff3e0,stroke:#f57c00,stroke-dasharray:4 3,color:#e65100
class A,B,C,D stage
class A2,B2,C2,D2 product
一、预训练:把整个互联网“打包”进神经网络
1. 数据的“精炼厂”:从脏网页到干净文本
flowchart TD
A["Common Crawl 网页<br/>数百 TB HTML"] --> B["① URL 过滤<br/>踢掉广告 / 恶意 / 色情站点"]
B --> C["② 文本提取<br/>剥离 HTML / CSS,只留正文"]
C --> D["③ 语言筛选<br/>保留目标语言高质量内容"]
D --> E["④ 去重<br/>删掉重复文章"]
E --> F["⑤ 脱敏 PII<br/>抹去身份证 / 电话 / 住址"]
F --> G["约 44 TB 干净文本<br/>≈ 15 万亿 Token"]
classDef raw fill:#ffebee,stroke:#c62828,color:#b71c1c
classDef clean fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20
class A raw
class G clean
💡 Token 是模型眼里的“文字最小单位”。
2. Tokenization:Token化 计算机如何“阅读”?
flowchart LR
S["原文<br/>unbelievable 人工智能"] --> C1["按字符切<br/>u n b e l i e v a b l e 人 工 智 能"]
S --> C2["按单词切<br/>unbelievable | 人工智能"]
S --> C3["按子词切(BPE)<br/>un | believ | able | 人工 | 智能"]
C1 --> R1["序列太长<br/>计算爆炸 ❌"]
C2 --> R2["词表爆炸<br/>新词变 UNK ❌"]
C3 --> R3["词表可控 ✅"]
classDef bad fill:#ffebee,stroke:#c62828,color:#b71c1c
classDef good fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20
class C1,C2 bad
class C3 good
class R1,R2 bad
class R3 good
- 词表(vocab):模型能认识的所有单元集合,训练前就要定好上限
- 单条文本切出来的单元数量:一句话被切成几块
词表大小有硬上限,装不下所有单词。凡是不在词表里的单词,只能变成 UNK(未知词),模型就看不懂了。
主流方案:BPE(Byte-Pair Encoding,字节对编码)
- 思路:从字符开始,反复合并最高频的相邻组合,直到词表达到目标大小。
- 好处:词表可控,任何新词、 生僻字都能拆成已知片段,永不出现未记录词。
3. 核心机制:“下一个词预测”
flowchart TD
A["原始文本<br/>unbelievable 人工智能"] --> B["BPE分词器"]
B --> C["Token序列<br/>un|believ|able|人工|智能"]
C --> D["查词表Vocab<br/>映射成ID:56,123,789,456,991"]
D --> E["Embedding矩阵<br/>形状:[V × d]<br/>V=词表总数<br/>d=隐藏层维度(向量长度)<br/>每行 = 1个token的向量<br/>例:d=4096 → 一行4096个浮点数"]
E --> F["Transformer层<br/>多头Attention + FFN<br/>全程向量维度保持d不变<br/>👉 绝大多数参数在这里!"]
F --> G["输出Embedding(常与输入共享权重)"]
G --> H["Softmax<br/>在全部V个token上算下一个Token概率"]
note1["Vocab词表:固定ID对照表,本身不是参数"]
note2["d(向量维度/hidden_size):每个token用多少个浮点数描述语义特征<br/>维度越大,语义表达能力越强,计算开销越大"]
note3["训练Token:训练数据总文本量(属于数据,不是模型参数)"]
note1 -.-> D
note2 -.-> E
note3 -.-> B
classDef vocab fill:#e1f5fe,stroke:#0277bd
classDef param fill:#f3e5f5,stroke:#7b1fa2
classDef data fill:#fff8e1,stroke:#f57f17
class B,C,D vocab
class E,F,G param
class note3 data
训练过程(循环图):
flowchart TD
A["① 随机截取 Token 窗口<br/>如 8000 个"] --> B["② 模型猜下一个 Token"]
B --> C["③ 对比正确答案<br/>计算 Loss"]
C --> D["④ 梯度下降<br/>微调数千亿个参数"]
D -->|重复直到 Loss 足够低| A
classDef loop fill:#e0f7fa,stroke:#00838f,color:#006064
class A,B,C,D loop
Loss 是研究员盯着的唯一指标:Loss 越低,模型对文本规律的预测越准。
4. ⚠️ 关键认知:基座模型还不是助手
flowchart LR
Q["你问:2+2 等于多少?"] --> M["Base Model<br/>互联网文本模拟器"]
M --> R["它回答:3+3 等于多少?<br/>(以为你在写数学练习题单)"]
classDef warn fill:#fff8e1,stroke:#f9a825,stroke-width:2px,color:#f57f17
class Q,R warn
class M warn
这就是为什么还需要后训练。
二、后训练:把“续写机器”驯化为“对话助手”
flowchart TD
A["原始互联网文本"] -->|预训练| B["Base Model<br/>只会自动续写"]
B -->|SFT 监督微调| C["Instruct Model<br/>懂对话格式"]
C -->|RLHF 偏好对齐| D["Assistant<br/>安全 · 有用 · 诚实"]
classDef model fill:#e3f2fd,stroke:#1976d2,color:#0d47a1
classDef final fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20
class A,B,C model
class D final
1. SFT(监督微调):教模型认识“对话格式”
- 做法:人类标注员写数万条高质量问答,格式固定为:
User: ... Assistant: ... - 效果:模型学会“看到 User 提问,就以 Assistant 身份有条理地回答”,而不是无休止乱续写。
💡 SFT 就像给一个博览群书但不懂社交的人,做了一套“对话礼仪培训”。
2. RLHF / 偏好优化:对齐人类价值观
flowchart TD
subgraph S1["第一步:训练裁判模型 Reward Model"]
H["人类给候选回答排序<br/>A - B - C"] --> RM["训练出能自动打分的裁判"]
end
subgraph S2["第二步:强化学习调教"]
G["模型生成回答"] --> J["裁判打分"]
J --> K["高分奖励 / 低分惩罚"]
K --> U["更新模型<br/>PPO / DPO"]
U -->|下一轮| G
end
S1 --> S2
classDef step1 fill:#e3f2fd,stroke:#1976d2,color:#0d47a1
classDef step2 fill:#fce4ec,stroke:#c2185b,color:#880e4f
class H,RM step1
class G,J,K,U step2
- PPO / DPO:两种常用强化学习算法,目标都是把模型输出“拉向”人类偏好的方向。
- 最终目标:Helpful(有用)、Honest(诚实)、Harmless(无害),业界简称 3H。
三、认知与安全:大模型的局限与未来
1. 快思考 vs 慢思考(System 1 vs System 2)
借自心理学家 Kahneman:系统 1 是直觉快反应,系统 2 是费力的逻辑推演。
flowchart LR
subgraph S1["系统 1 / 快思考 · 传统 LLM"]
A["你问"] --> A2["逐个 Token 脱口而出"] --> A3["复杂推理<br/>易一步错步步错"]
end
subgraph S2["系统 2 / 慢思考 · 推理模型"]
B["你问"] --> B2["后台显式思维链 CoT 推演"] --> B3["再给答案<br/>更多算力换准确率"]
end
classDef fast fill:#fff3e0,stroke:#f57c00,color:#e65100
classDef slow fill:#e8eaf6,stroke:#3949ab,color:#1a237e
class A,A2,A3 fast
class B,B2,B3 slow
2. 幻觉(Hallucination):是缺陷,也是特质
- 模型本质在做有损压缩 + 概率预测,没有真实记忆数据库,只有概率分布。
- 所以“幻觉”不是纯 Bug,而是它联想与创新能力的另一面。
- 需要绝对精准事实时 → 结合 RAG(检索增强生成) 或搜索引擎,让模型“先查资料再回答”。
如何理性看待 AI
- 别把它当有意识的实体——它是基于概率的模式推理引擎。
- 它的优势:知识渊博、模式识别强、跨领域联想快。
- 它的劣势:没有天然的逻辑自我校验机制,容易“一本正经地胡说八道”。
清晰给指令 · 提供充足上下文 · 关键事实保持人类审查
词表
| 简称 | 全称 |
|---|---|
| SFT | Supervised Fine-Tuning,监督微调 |
| RLHF | Reinforcement Learning from Human Feedback,基于人类反馈的强化学习 |
| Base Model | 基座模型 |
| Instruct Model | 指令模型 |
| Token | 词元(文本最小处理单元) |
| BPE | Byte-Pair Encoding,字节对编码 |
| Loss | 损失 |
| PPO | Proximal Policy Optimization,近端策略优化 |
| DPO | Direct Preference Optimization,直接偏好优化 |
| 3H | Helpful、Honest、Harmless,有用、诚实、无害 |
| CoT | Chain of Thought,思维链 |
| RAG | Retrieval-Augmented Generation,检索增强生成 |
资料来源
- youtube:Andrej Karpathy 的分享视频:Deep Dive into LLMs like ChatGPT (B站也有)
- notebook llm: google的notebook 加工。再添加一些mermaid图解。