说明:文中关键数字均核对原始论文(arXiv 编号见文末参考文献),以【论文口径】标注;估算值标【估算】并给出推导过程;2026 年模型谱系来自公开检索,标【2026 检索口径】。公式使用
$...$/$$...$$LaTeX 分隔符,带 MathJax 的预览器(GitHub / VS Code / Typora)可正常渲染。配套 HTML 版含 4 个可交互演示(BPE 合并 / 注意力缩放与因果掩码 / KV cache 与解码成本 / 采样策略),本文中的"交互 L1–L4"与之对应。
0 · 导读
LLM(Large Language Model,大语言模型)一句话概括:用 next-token prediction(预测下一个词元)在万亿级 token 上自监督预训练的 decoder-only Transformer,再经指令微调与人类偏好对齐,收束成一个通用文本助手。它的技术史可以压缩成五步:2017 年 Transformer 抛弃循环结构;2018–2019 年 GPT(decoder)与 BERT(encoder)分道扬镳;2020 年 GPT-3 证明规模本身就能换来少样本能力;2022 年 InstructGPT/ChatGPT 用 RLHF 把"基座"变成"助手";2023 年起开源生态(LLaMA 系)+ 长上下文 + MoE + 推理模型(长思维链)把 LLM 推成通用人工智能的默认底座。
本文在"科普骨架"之上做五件扩充:
- 每一层都推到数学:BPE 的合并算法与词表账;注意力的 1/dk1/\sqrt{d_k}1/dk 为什么必须存在(方差推导);Bradley-Terry 奖励模型与 DPO 的闭式解推导。
- token 经济学:一个汉字/英文单词到底值几个 token,词表大小如何同时决定序列长度、显存与解码 FLOPs。
- 工程账:KV cache 显存核算(7B 模型 0.5 MB/token 的来历)、训练 6ND6ND6ND FLOPs 核算、Chinchilla 最优数据量。
- 对齐链路:SFT 的三个局限 → RLHF 三步 → DPO 如何把 RL 问题改写成二分类,GRPO 又改了什么。
- 谱系与选型:GPT / LLaMA / Qwen / DeepSeek / GLM 的路线对比与工程选型建议。
建议阅读顺序:Q1 定位;Q2–Q4 三大组件(数学最密集);Q5 预训练;Q6 后训练;Q7 推理工程;Q8–Q9 能力与选型。
Q1 · LLM 是什么:定义、划界与核心恒等式
定义四要素
一个东西要配叫"LLM",四个条件缺一不可:
| 要素 | 内容 | 不满足时的退化形态 |
|---|---|---|
| 自回归 LM | 建模 P(xt+1∣x≤t)P(x_{t+1}\mid x_{\le t})P(xt+1∣x≤t),逐个 token 生成 | BERT 式双向编码器(只做理解) |
| Transformer | 纯注意力堆叠,无循环、可并行 | RNN/LSTM(长程依赖崩坏) |
| 大规模预训练 | 万亿 token 级语料,通用下一词元目标 | 小语料训出来的是领域模型 |
| 指令对齐 | SFT + 偏好优化,能按指令行事 | 原始基座(base model)只会续写 |
与相邻概念划清界限
| 概念 | 代表 | 训练目标 | 输出 | 一句话区别 |
|---|---|---|---|---|
| 神经语言模型(n-gram/RNN) | KenLM、LSTM-LM | 下一词元 | 续写文本 | 有 LM 之实,无规模与通用性 |
| 预训练语言模型(PLM) | BERT、RoBERTa | 掩码重建 / 句对判别 | 表征,需接任务头 | 双向理解强,不会生成 |
| LLM(基座) | GPT-3、LLaMA base | 下一词元 | 续写文本 | 通用底座,不懂"听话" |
| LLM(助手) | ChatGPT、Qwen chat | 下一词元 + 对齐 | 按指令回答 | 多出来的是对齐,不是知识 |
| 推理模型 | o1、DeepSeek-R1 | + 答案正确性 RL | 长思维链后给答案 | 把"算得久"换成"答得对" |
核心恒等式:训练即压缩
语言模型损失就是交叉熵:
L=−1T∑t=1TlogPθ (xt+1∣x1,…,xt)\mathcal{L} = -\frac{1}{T}\sum_{t=1}^{T}\log P_\theta\!\left(x_{t+1}\mid x_1,\dots,x_t\right)L=−T1t=1∑TlogPθ(xt+1∣x1,…,xt)
由 Shannon 信源编码定理,最优码长等于信源熵——把下一个 token 预测得准,等价于把语料压得小。 perplexity(困惑度)就是 uncompressed size 的度量:PPL=eL\mathrm{PPL} = e^{\mathcal{L}}PPL=eL。所以"LLM 变强"有一个可量化的信息论解读:每 token 少用的比特数,就是模型从数据里榨出来的结构。这也是为什么 loss 曲线至今仍是预训练最可靠的进度条——它不是KPI,是压缩率。
decoder-only 为什么赢
三种架构的现实结局:
- encoder-only(BERT):双向注意力做理解很强,但双向可见 = 无法逐 token 生成,天然不适合自回归;
- encoder-decoder(T5):生成可行,但编码器-解码器两套参数、训练目标分裂,规模化后收益被 decoder-only 追平;
- decoder-only(GPT):一套参数、一个目标(下一词元)、训练即推理同构,还能把"指令、回答、代码、多模态"全部塞进同一序列格式。当规模成为主变量,架构简单性就是最大的 scalability。
Q2 · Tokenization:BPE 严格推导
为什么不能按字、也不能按词
- 按字:词表小(中文 ~2 万常用字),但序列长、语义单元被切碎("巴黎"变两个单元,模型要自己学组合);
- 按词:序列短、语义完整,但词表爆炸(英语 50 万+ 词形),未登录词(OOV)无法处理,新词一出现就瞎;
- subword(子词)是折中:高频模式整体成词,低频模式拆成可复用碎片——词表大小、序列长度、OOV 率三角由词表大小一个旋钮控制。
BPE 算法:严格表述
BPE(Byte-Pair Encoding,Sennrich et al., 2016)初始化一个字节级词表,然后迭代合并:
- 把语料切成"预分词后的词"序列,每个词表示为字符(或字节)序列;
- 统计所有相邻 token 对 (a,b)(a,b)(a,b) 的出现频次;
- 合并全局最高频的一对,新 token ababab 加入词表,语料中该对全部替换;
- 重复 MMM 次,得到大小 V=∣base∣+1+MV = |\text{base}| + 1 + MV=∣base∣+1+M 的词表。
GPT-2 用字节级 BPE:base = 256 个字节 + 1 个 <|endoftext|>,做 50,000 次合并 → 词表 50,257【论文口径】。字节级 base 的关键好处:任何文本可无损编码,永无 OOV——中文、emoji、乱码、代码,全部落在 256 个字节内,无非是合并次数多少。
一个最小例子(GPT-2 风格):对词 “lower” 及其邻词频次做合并,假设最高频对是 e+r,则 “lower” → “low” + “er”;若后续 lo+w、er 与其他对继续合并,最终可能整体成一个 token。合并顺序完全由数据决定:GPT-2 词表里 " the"(带前导空格)是单 token,而 "the" 不在句首反而是两个——这是 BPE 最反直觉也最重要的性质:token 边界依赖上下文(预分词规则)。
复杂度与压缩率
- 朴素 BPE 每轮全语料重统计:O(M⋅∣corpus∣)O(M \cdot |\text{corpus}|)O(M⋅∣corpus∣);工程实现(sentencepiece、tiktoken)用增量数据结构压到近线性。
- 压缩效果量级:英文自然文本约 0.75 词/token ≈ 4 字符/token(OpenAI 经验口径);中文在 GPT-2 词表下常需 1–3 token/字,LLaMA-3(128K 词表)之后显著改善,常见字接近 1 token/字【估算】。
词表大小:一个被低估的三元权衡
词表 VVV 同时决定三件事,方向互相拉扯:
| VVV 的影响 | 方向 | 量级(d=4096d=4096d=4096 口径) |
|---|---|---|
| 序列长度 | VVV 大 → 序列短 → 训练/推理都快 | 128K vs 32K 词表,同等文本约短 20–30%【估算】 |
| Embedding 参数 | VVV 大 → V×dV\times dV×d 参数变多 | 32K:131M;128K:524M(8B 模型的 6%) |
| 解码 LM head | VVV 大 → 每 token 多 2Vd2Vd2Vd FLOPs | 128K 词表单 token 多 0.8 GFLOPs |
| 多语言/代码覆盖 | VVV 大 → 碎片少,中文代码友好 | LLaMA-3 扩到 128,256 的主因 |
主流词表实测:GPT-2 50,257;tiktoken cl100k_base 100,277(含特殊 token);LLaMA-1 32,000(SentencePiece BPE);LLaMA-3 128,256;Qwen ≈ 152K;DeepSeek-V3 129,280【论文口径】。
特技与坑
- 数字被切碎:BPE 按频次合并,“123456789” 这类长数字在 GPT-2 词表里会被切成多个 2–3 位片段 → 算术题天然吃亏,这是"LLM 算错数"的Tokenizer 级解释之一;
- 中文无空格:预分词规则必须显式处理 CJK(按字或按类切),否则空格粘连规则会把整句粘成一个 token;
- 特殊 token 与 chat template:
<|endoftext|>、`` 等既是分隔符也是"角色边界",多轮对话的正确性一半靠模板——模板错位(如漏掉系统消息闭合)是线上事故高发区; - BPE vs Unigram:SentencePiece 的 Unigram LM(Kudo & Richardson, 2018)按似然删 token,理论上更优且支持子词正则化,LLaMA-1/2 用它;字节级 BPE 则赢在无损与工程简洁,GPT-2 之后的开源模型多数回归 BPE。
Q3 · Transformer 解码器:架构细节逐项解剖
单层解剖(现代 LLM 口径)
x ──► RMSNorm ──► GQA 注意力(RoPE + 因果掩码)──► + 残差
│
x ──► RMSNorm ──► SwiGLU FFN ──────────────────────► + 残差
与原版 Transformer(Vaswani et al., 2017)的逐项差异,以及每一项的动机:
| 组件 | 原版 | 现代 LLM | 为什么改 |
|---|---|---|---|
| 归一化 | Post-LN + LayerNorm | Pre-LN + RMSNorm | Post-LN 深层训练不稳;RMSNorm 去掉均值中心化,省一次归约且更稳(arXiv:1910.07467) |
| 位置编码 | 正弦绝对位置 | RoPE 旋转位置 | 相对位置 + 长度外推友好(arXiv:2104.09864) |
| 注意力 | MHA | GQA | KV cache 除以头组数(arXiv:2305.13245) |
| FFN | ReLU,2 矩阵 | SwiGLU,3 矩阵 | 门控非线性显著提质(arXiv:2002.05202),参数量靠缩 dffd_{ff}dff 找回 |
| 偏置/正则 | 有 bias + dropout | 全去掉 | 大规模下 bias 无增益,dropout 在预训练中弊大于利 |
| 归一化位置 | — | 每子层前 + final norm | Pre-LN 标配 |
参数核算:LLaMA-7B 为什么是 6.7B
按 d=4096d=4096d=4096、dff=11008d_{ff}=11008dff=11008、L=32L=32L=32、词表 32,000【论文口径】逐项算:
- Embedding:32000×4096=131.1M32000 \times 4096 = 131.1\text{M}32000×4096=131.1M
- 每层注意力(Q/K/V/O 四矩阵,无 bias):4×40962=67.1M4 \times 4096^2 = 67.1\text{M}4×40962=67.1M
- 每层 SwiGLU FFN(gate/up/down 三矩阵):3×4096×11008=135.3M3 \times 4096 \times 11008 = 135.3\text{M}3×4096×11008=135.3M
- 每层合计 ≈202.4M\approx 202.4\text{M}≈202.4M,×32\times 32×32 层 =6.48B= 6.48\text{B}=6.48B
- 加 embedding、final norm、输出头(与 embedding 权重共享则不加):

本文系统剖析大语言模型(LLM)完整技术链路,涵盖子词分词(BPE)的数学推导与词表权衡、decoder-only Transformer架构细节与参数/FLOPs核算、缩放点积注意力的方差归一化原理、KV cache显存账与FlashAttention优化、next-token预训练目标与Chinchilla Scaling Law、SFT局限性及RLHF/DPO/GRPO对齐方法演进、推理采样策略与memory-bound瓶颈分析,以及能力来源、幻觉成因与评测实践。所有关键结论均基于原始论文验证。
319

被折叠的 条评论
为什么被折叠?



