大语言模型(LLM)原理深扒:从 BPE 到 RLHF 的完整链路

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

说明:文中关键数字均核对原始论文(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=1Tlog⁡Pθ ⁣(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=−T1​t=1∑T​logPθ​(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)初始化一个字节级词表,然后迭代合并:

  1. 把语料切成"预分词后的词"序列,每个词表示为字符(或字节)序列;
  2. 统计所有相邻 token 对 (a,b)(a,b)(a,b) 的出现频次;
  3. 合并全局最高频的一对,新 token ababab 加入词表,语料中该对全部替换;
  4. 重复 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 权重共享则不加):

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reset2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值