语言建模目标
CLM loss 的完整数学推导、shift-by-one 机制与 perplexity 解读
核心要点:
- CLM loss = $-\frac{1}{N} \sum \log P(x_t \mid x_{<t})$,简单到一行
- Shift-by-one: input 错位 1 位作 target,每序列贡献 $s$ 个训练对
- PyTorch
F.cross_entropy内部用 log-sum-exp trick 数值稳定- Perplexity = $\exp(\mathcal{L})$, GPT-3 PTB PPL 20.5 / Chinchilla 70B WikiText 7.16
- Label smoothing Vaswani 2017 用,现代 decoder-only 全不用
- Temperature:训练固定 $T=1$,仅推理 sampling 用;知识蒸馏例外
名词定义
本篇共享名词在 6.1 总览 已定义 (Cross-entropy loss / Perplexity / Shift-by-one / Teacher forcing)。本篇新引入:
| 名词 | 定义 |
|---|---|
| Log-sum-exp trick | 数值稳定计算 $\log \sum_k e^{x_k}$ 的方法:先减最大值 $\bar{o} = \max_k x_k$ 让所有指数 $\leq 0$,消除 overflow |
| Label smoothing | Szegedy 2016 提出,把 one-hot target 软化为 $0.9 + 0.1/V$,训练 PPL 上升但翻译 BLEU 改善 |
| Temperature | Logits 除以 $T$ 后做 softmax,控制分布锐度;训练时 $T=1$,推理 sampling 时调 (08 章) |
| Reduction | PyTorch loss 的聚合方式:默认 'mean' 对所有 token 取均值,'sum' 求和,'none' 不聚合 |
@tbl-lm-glossary 本篇新引入名词
CLM 的完整数学公式
核心问题:GPT 训练目标"next-token prediction"具体写成什么公式?怎么从一个序列算出一个 loss 数字?
给定一个序列 $x_1, x_2, \ldots, x_N$, CLM 的 loss 是每个位置 next-token 负对数似然的平均:
$$\begin{equation} \mathcal{L} = -\frac{1}{N} \sum_{t=1}^{N} \log P(x_t \mid x_1, x_2, \ldots, x_{t-1}) \label{eq:lm-clm-loss} \end{equation}$$- $P(x_t \mid x_{<t})$ 是模型给"位置 $t$ 是 token $x_t$"的预测概率,由 LM head + softmax 得到
- 用自然对数 ($\log = \ln$),单位是 nats
- 默认 reduction = mean (PyTorch
F.cross_entropy默认),也可以 sum
这就是 LLM 训练的全部目标——简单到不可思议。模型只需让"每个位置正确的 next token"概率尽可能大,海量文本上优化这一个目标就涌现出语言能力 (见 02-大模型是什么)。
Shift-by-one:一个序列产生 N 个训练对
核心问题:训练数据是连续的 token 序列,怎么变成"输入-标签"对?为什么"shift-by-one" 能让一个长度 $s$ 的序列贡献 $s$ 个训练对?
Input 取序列前 $s$ 个 token, target 取后 $s$ 个 token (错位 1 位),配合 causal mask 让每个位置独立预测 next token——一个长度 $s$ 的序列就有 $s$ 个训练对。
nanoGPT 的实现
Karpathy nanoGPT train.py 的 get_batch() 函数[1]:
def get_batch(split):
data = train_data if split == 'train' else val_data
ix = torch.randint(len(data) - block_size, (batch_size,))
x = torch.stack([data[i:i+block_size] for i in ix]) # input
y = torch.stack([data[i+1:i+1+block_size] for i in ix]) # target (错位 1)
return x, y
x[b, :]=data[i:i+s],长度 $s$ tokeny[b, :]=data[i+1:i+1+s],长度 $s$,比x滞后 1 位- 训练时
y[b, t]是x[b, t]的 next token
Loss 计算:一次性算所有位置
logits = model(x) # [B, T, V]
loss = F.cross_entropy(
logits.view(-1, V), # 展平 [B*T, V]
y.view(-1), # 展平 [B*T]
ignore_index=-1 # 可忽略某些位置
)
所有 $B \times T$ 个位置同时算 loss,取均值。配合 04-因果掩码 让位置间不互相影响,这是 LLM 训练并行的根基。
Shift-by-one 的信号密度
一个长 $s$ 的序列贡献 $s$ 个训练样本 (每个位置一个),信号密度 100%。对比 BERT MLM 仅 15% 位置参与 loss, CLM 的信号密度优势是 GPT 系训练效率高于 BERT 的根本原因之一 (见 04-04 因果掩码)。
Cross-entropy 的数值实现
核心问题:$\log \sum e^{x_k}$ 在 $x_k$ 很大时会 overflow ($e^{1000}$ 无穷大),很小时会 underflow ($e^{-1000}$ 为 0)。PyTorch 怎么避免这两个问题?
Log-sum-exp trick:减去最大值让指数项都 $\leq 0$,消除 overflow。
完整公式
CLM loss 在单个位置展开:
$$\begin{equation} \mathcal{L}_i = -\log \frac{e^{x_{y_i}}}{\sum_k e^{x_k}} = -x_{y_i} + \log \sum_k e^{x_k} \label{eq:lm-loss-expand} \end{equation}$$其中 $x \in \mathbb{R}^V$ 是 logits, $y_i$ 是正确 token id。
直接算 $\log \sum_k e^{x_k}$ 数值不稳:大 logits 让 $e^{x_k}$ 爆炸。
Log-sum-exp trick
设 $\bar{o} = \max_k x_k$,则:
$$\begin{equation} \log \sum_k e^{x_k} = \bar{o} + \log \sum_k e^{x_k - \bar{o}} \label{eq:lm-logsumexp} \end{equation}$$所有指数项 $x_k - \bar{o} \leq 0$, $e^{x_k - \bar{o}} \in (0, 1]$,不会 overflow。最大的那一项 $= 1$,其他 $< 1$,求和后取 log 数值稳定。
PyTorch F.cross_entropy 内部
# 数学等价 (PyTorch 内部自动应用 log-sum-exp)
loss = -log_softmax(logits)[range(N), y].mean()
log_softmax内部用 log-sum-exp 实现 $\log P(x_k) = x_k - \log \sum_j e^{x_j}$nll_loss(log_softmax(x), y)等价于F.cross_entropy(x, y)
用户不需要手动处理数值稳定,PyTorch / TensorFlow / JAX 内部都做了。直接调 F.cross_entropy 即可。
Perplexity:模型在每个位置面临几选一?
核心问题:训练时 loss 数字 (如 3.2) 不直观,评估时常用 perplexity 替代。Perplexity 是什么?业界常见数字是多少?
Perplexity = $\exp(\mathcal{L})$,直觉是"模型在每个位置平均面临 PPL 选一的不确定"——PPL 越小模型越确定。
数学定义
$$\begin{equation} \mathrm{PPL} = \exp(\mathcal{L}) = \exp\left(-\frac{1}{N} \sum_{t=1}^{N} \log P(x_t \mid x_{<t})\right) \label{eq:lm-ppl} \end{equation}$$直觉:
- 完美预测:$P(x_t \mid x_{<t}) = 1 \to \log P = 0 \to \mathcal{L} = 0 \to \mathrm{PPL} = 1$ (模型确定下一个 token)
- 随机猜:$P(x_t) = 1/V \to \mathcal{L} = \log V \to \mathrm{PPL} = V$ (词表大小,完全均匀)
- 一般 LLM:PPL 在 $1$ 到 $V$ 之间,越小越好
业界 perplexity 数字
| 模型 | 数据集 | PPL |
|---|---|---|
| GPT-3 175B | Penn Treebank (zero-shot) | 20.50 (前 SOTA 35.8, -15) |
| Chinchilla 70B | WikiText-103 | 7.16 |
| Gopher 280B | WikiText-103 | 7.75 (Chinchilla 用 4× 少参数仍更好) |
| Llama 2 7B (q8_0 base) | WikiText-2 | ~5.8 |
@tbl-lm-ppl 业界 perplexity 数字 (越小越好)
Chinchilla 7.16 vs Gopher 7.75: Chinchilla 70B 在 WikiText-103 上击败 Gopher 280B (4× 参数),是 Chinchilla 论文证明"Kaplan 错了,大模型应该多训"的核心实证之一 (详见 04-scaling-laws)。
Perplexity 的局限
PPL 是 base model 评估的标准,但对下游能力相关性弱:
- 同一 PPL 的模型在 MMLU / HumanEval / GSM8K 上能力可能差很多
- PPL 7.16 不告诉你模型能不能写代码或解数学题
- 现代 LLM 评估更看重 benchmark suite, PPL 仅作 base model 训练监控
Label smoothing 和 temperature 在 CLM 里的角色
核心问题:翻译模型 (Vaswani 2017) 用 label smoothing 和 temperature, GPT 系预训练用不用?
Label smoothing 在现代 LLM 预训练全不用;Temperature 训练固定 $T=1$,仅推理 sampling 用——只有少数蒸馏场景训练时用 $T > 1$。
Label smoothing: Vaswani 用,Llama 不用
Szegedy 2016[2] 提出 label smoothing:
$$\begin{equation} q'(k) = (1 - \varepsilon) q(k) + \varepsilon / K \label{eq:lm-smooth} \end{equation}$$- $q$ 是原始 one-hot target
- $\varepsilon = 0.1$ 典型
- 平滑后正确 token 概率 $0.9 + 0.1/V$,其他 token $0.1/V$
Vaswani 2017 在 Transformer 翻译训练用 $\varepsilon = 0.1$,原文明确指出:训练 perplexity 上升 (因为目标分布更软),但 BLEU 改善——这是"测试集指标"与"训练 loss"的有趣 trade-off。
现代 decoder-only CLM 预训练全不用 label smoothing:
- Llama 1 / 2 / 3:不用
- Chinchilla:不用
- Gopher:不用
原因推测:大规模语言建模本身已有强正则化,label smoothing 反而损失精度;而翻译这种"目标分布相对集中"的任务上 smoothing 才有收益。
Temperature:训练固定 $T=1$
CLM 训练目标是最大化 $\log P(x_t \mid x_{<t})$,这等价于 softmax 温度 $T = 1$:
$$\begin{equation} P(x_k) = \frac{e^{x_k / T}}{\sum_j e^{x_j / T}}, \quad T = 1 \label{eq:lm-temp} \end{equation}$$- $T < 1$:分布更锐,模型"更自信"
- $T > 1$:分布更平,模型"更不确定"
- 训练时引入 $T \neq 1$ 等价于改变 loss landscape,大多数模型不做
推理时 sampling 才用 temperature 控制生成多样性 (详见 08-推理/04-采样与解码)。
知识蒸馏的例外
Hinton 2015 知识蒸馏[3]: 训练时教师模型用 $T > 1$ (典型 $T = 5$) 生成 soft target,学生模型用相同 $T$ 学习。
- 高 $T$ 让教师概率更分散,学生学到"非正确答案的相对可能性"信息 (dark knowledge)
- 学生学完后推理时降回 $T = 1$
这是训练时引入 $T \neq 1$ 的少见例外。LLM 蒸馏 (如 DistilBERT / Llama-Guard) 沿用此思路,但本章不展开 (归 07-微调与对齐)。
Weight tying 与 LM head:训练阶段视角
核心问题:LM head 把 hidden state 投到词表大小,它是怎么算的?与 token embedding 共享权重 (weight tying) 在训练里如何体现?
LM head 是一个 $W_U \in \mathbb{R}^{h \times V}$ 矩阵,GPT 系与 token embedding $W_E$ 转置共享;Llama 系不共享 (详见 03-token-embedding)。
LM head 公式
$$\begin{equation} \mathrm{logits}_t = \mathbf{h}_t W_U, \quad P_t = \mathrm{softmax}(\mathrm{logits}_t) \label{eq:lm-head} \end{equation}$$- $\mathbf{h}_t \in \mathbb{R}^h$ 是位置 $t$ 最后一层 hidden state (经过 final LayerNorm)
- $W_U \in \mathbb{R}^{h \times V}$: LM head 投影矩阵 (在 Llama 中独立,在 GPT-2/3 中是 $W_E^\top$)
Weight tying 的训练影响
GPT-2 / GPT-3 weight tying 让 $W_E$ 同时承担两个角色:
- 输入端:token id → embedding (查表 = one-hot × $W_E$)
- 输出端:hidden state → logits (内积 $W_E^\top$)
这让 $W_E$ 训练时的梯度来自两条路径——input embedding 路径和 output projection 路径——研究发现 output 端梯度占 70%,共享矩阵被"output 化" (详见 03-token-embedding)。
Llama 系不 tie, $W_U$ 独立:多 $V \cdot h$ 参数 (Llama 3 8B 多 525M),但 $W_E$ 和 $W_U$ 各自最优。
Takeaway
| 知识点 | 核心结论 |
|---|---|
| CLM loss 公式 | $\mathcal{L} = -\frac{1}{N} \sum \log P(x_t \mid x_{<t})$ |
| Shift-by-one | input/target 错位 1 位,一序列 $s$ 训练对,信号密度 100% |
F.cross_entropy | 内部 nll_loss(log_softmax(...)) + log-sum-exp trick |
| Log-sum-exp trick | 减最大值让指数项 $\leq 0$,消除 overflow |
| Perplexity 定义 | $\mathrm{PPL} = \exp(\mathcal{L})$, "几选一的不确定度" |
| PPL 直觉 | 完美预测 1,随机猜 $V$, LLM 在中间 |
| 业界数字 | GPT-3 PTB 20.5 / Chinchilla 70B WikiText 7.16 / Gopher 280B 7.75 |
| Chinchilla 实证 | 70B 1.4T tokens 击败 Gopher 280B (4× 参数),证明 Kaplan 错 |
| Label smoothing | Vaswani $\varepsilon = 0.1$ 用;Llama / Chinchilla 全不用 |
| Temperature | 训练 $T = 1$,推理 sampling 用;知识蒸馏是少见例外 |
| LM head | $W_U \in \mathbb{R}^{h \times V}$, GPT-2/3 与 $W_E$ tied, Llama untied |
开放问题
- 为什么现代 LLM 不用 label smoothing:Vaswani 时代有效,大模型时代被抛弃,但缺乏严格对比研究
- PPL 与下游能力的低相关性如何修复:PPL 低不代表 MMLU 高,是否有更好的"训练监控指标"仍开放
- 训练时引入 temperature 是否值得:知识蒸馏外少有人测,但 $T < 1$ 在某些 reasoning 训练 (o1 / R1) 可能有用,待研究
- Soft target / RL-based loss 是否会替代纯 CLM:o1 / R1 系用 CoT + RL 训练,是否 CLM 终会被替代仍开放
延伸阅读
- 上一篇:总览 → 6.1 总览
- 下一步:训练循环与数据 → 6.3 训练循环与数据
- Scaling laws (实证 PPL 与 N/D 关系) → 6.4 Scaling Laws
- 因果掩码让训练并行 (信号密度根源) → 04-注意力机制/04-因果掩码
- LM head + weight tying 细节 → 03-文本如何变成数字/03-token-embedding
- 采样与 temperature (推理时) → 08-推理/04-采样与解码
参考资料
- Karpathy. nanoGPT train.py. https://github.com/karpathy/nanoGPT/blob/master/train.py
- Szegedy et al. Rethinking the Inception Architecture for Computer Vision (label smoothing). CVPR 2016. https://arxiv.org/abs/1512.00567
- Hinton, Vinyals, Dean. Distilling the Knowledge in a Neural Network. 2015. https://arxiv.org/abs/1503.02531