跳到主要内容

第9章:语言建模目标

训练一个语言模型,本质上是在解答一个问题:如何让机器学会语言的概率分布?

不同的问题视角,催生了不同的训练目标。本章从这两条路径出发——自回归语言模型与掩码语言模型——理解它们各自的设计哲学、优劣权衡,以及为什么今天的主流范式最终走向了 Decoder-only 架构。


9.1 自回归语言模型(CLM,Causal Language Modeling)

问题从哪里来?

最自然的语言建模问题是:给定前面所有的词,预测下一个词。这与人类说话的方式完全一致——你不需要知道未来就能说出当前这个词。

形式化地,给定一段文本序列 x1,x2,,xTx_1, x_2, \ldots, x_T,联合概率可以用链式法则拆解:

P(x1,x2,,xT)=t=1TP(xtx1,x2,,xt1)P(x_1, x_2, \ldots, x_T) = \prod_{t=1}^{T} P(x_t \mid x_1, x_2, \ldots, x_{t-1})

训练目标就是最大化这个联合对数概率:

LCLM=t=1TlogP(xtx1,,xt1)\mathcal{L}_{\text{CLM}} = -\sum_{t=1}^{T} \log P(x_t \mid x_1, \ldots, x_{t-1})

这就是因果语言模型(Causal Language Modeling,CLM),也称为自回归语言模型(Autoregressive LM)

Teacher Forcing:训练时的"作弊"

一个自然的疑问:训练时,模型怎么知道前面的 token 是什么?如果用模型自己预测的结果作为下一步的输入,错误会不断累积。

解决方案叫做 Teacher Forcing(教师强迫):训练时,永远用真实的历史 token作为上下文输入,而不是模型自己生成的结果。

输入序列:[BOS] "今天" "天气" "很"
目标输出: "天气" "很" "好"

每一步的输入都是真实文本,目标是预测下一个真实 token。这使得训练高效稳定,但也引入了一个问题:训练与推理时的分布差异(exposure bias)——推理时模型只能看到自己之前生成的内容,而不是真实文本。

:::info Teacher Forcing 的代价 训练时用真实 token 喂给模型,推理时用模型自己生成的 token。这种不一致可能导致模型在生成较长文本时"跑偏"。这也是为什么现代 LLM 还会用 RLHF 等方法进一步对齐——纠正这种偏差。 :::

为什么天然支持生成?

CLM 模型在推理时非常直观:给一个前缀,反复采样下一个 token,就能生成任意长度的文本。这种逐步生成的方式与训练目标完美对齐。

代表模型:GPT 系列(GPT-1、GPT-2、GPT-3、GPT-4)均采用此目标。


9.2 掩码语言模型(MLM,Masked Language Modeling)

为什么需要双向上下文?

自回归模型只能看到"左边"的上下文。但很多理解任务需要同时看两侧——比如:

"银行[MASK]了我的账户"

只看左边"银行",你可能填"开"、"注销"、"冻结"……但如果你同时能看到后面的"账户",答案就更清晰了。

这催生了另一种训练目标:掩码语言模型(Masked Language Modeling,MLM)

训练目标

BERT 的做法是:随机遮盖输入序列中约 15% 的 token,将其替换为特殊符号 [MASK],然后让模型预测被遮盖位置的原始 token:

LMLM=iMlogP(xix1,,xi1,[MASK],xi+1,,xT)\mathcal{L}_{\text{MLM}} = -\sum_{i \in \mathcal{M}} \log P(x_i \mid x_1, \ldots, x_{i-1}, [\text{MASK}], x_{i+1}, \ldots, x_T)

其中 M\mathcal{M} 是被遮盖的位置集合。注意:模型在预测 xix_i 时,可以同时利用左边和右边的所有 token——这就是双向编码(Bidirectional Encoding)

对比两种训练目标

维度自回归 CLM掩码语言模型 MLM
上下文方向单向(只看左)双向(左右都看)
训练信号每个 token 都贡献损失只有 15% 的 mask 位置贡献损失
适合任务生成(文本续写、对话)理解(分类、NER、问答抽取)
代表模型GPT 系列BERT、RoBERTa

MLM 的核心局限:训练推理不一致

MLM 有一个根本性的问题:训练时有 [MASK],推理时没有

  • 训练:输入带 [MASK] 的序列,预测被遮盖的 token。
  • 推理(如文本分类):输入完整文本,用 [CLS] token 的表示做分类。

这导致 BERT 无法直接用于文本生成。如果你想让 BERT 生成下一个词,它不知道该遮盖哪里,也不会逐步输出。

:::warning MLM 的训练-推理差距 即便是做填空(fill-in-the-blank),BERT 也需要你提前知道要填的位置,并手动插入 [MASK]。真实推理场景里,你往往不知道"哪里需要填空"——这根本上限制了 MLM 的应用范围。 :::


9.3 困惑度(Perplexity,PPL)

我们需要一把尺子

模型训练完了,如何评估它"学得好不好"?我们需要一个可以量化比较的指标。

困惑度(Perplexity,PPL) 是语言模型最经典的评估指标,它衡量的是:模型对一段文本有多"困惑"

直觉理解

想象你在做一道填空题,每填一个词都要从候选词表里选。如果你对语言非常熟悉,每步只需要在 2-3 个高概率候选词中选择——你很自信,困惑度低。如果你对语言一无所知,每步相当于从整个词表(可能几万个词)均匀随机选——你非常困惑,困惑度高。

PPL = k,意味着模型平均每步相当于从 k 个等概率选项中随机猜。

数学定义

对于一段 NN 个 token 的文本序列,困惑度定义为:

PPL=exp(1Ni=1NlogP(xix<i))\text{PPL} = \exp\left(-\frac{1}{N}\sum_{i=1}^{N} \log P(x_i \mid x_{<i})\right)

其中 x<i=x1,,xi1x_{<i} = x_1, \ldots, x_{i-1} 是当前 token 之前的所有历史。

展开来看,括号内是平均负对数概率(即交叉熵损失),PPL 就是它的指数。

PPL=exp(H)其中H=1Ni=1NlogP(xix<i)\text{PPL} = \exp(\mathcal{H}) \quad \text{其中} \quad \mathcal{H} = -\frac{1}{N}\sum_{i=1}^{N} \log P(x_i \mid x_{<i})

:::info 数值解读

  • PPL = 1:完美模型,每步都以概率 1 预测正确的 token(不可能)
  • PPL = 10:模型平均每步相当于从 10 个等可能选项里选
  • PPL = 100:相当于从 100 个等可能选项里随机猜
  • PPL = |V|(词表大小):完全随机模型,相当于均匀分布

早期 GPT-2 在 WikiText-103 上 PPL ≈ 18,GPT-3 降到约 10,现代大模型在某些领域可以降到个位数。 :::

一个具体例子

假设一段文本只有 3 个 token:"今天 天气 好",模型给出的概率如下:

位置tokenP(xix<i)P(x_i \mid x_{<i})logP\log P
1今天0.1-2.303
2天气0.5-0.693
30.4-0.916

平均负对数概率:H=2.303+0.693+0.91631.304\mathcal{H} = \frac{2.303 + 0.693 + 0.916}{3} \approx 1.304

困惑度:PPL=e1.3043.68\text{PPL} = e^{1.304} \approx 3.68

意味着模型平均每步相当于从约 3.68 个等概率选项里选——这是一个相当自信的模型。

PPL 的局限

:::warning PPL 低 ≠ 模型能力强 PPL 只衡量模型对特定测试集文本的预测能力,存在以下局限:

  1. 数据集依赖:在 WikiText 上 PPL 低,不代表在代码或数学推理上表现好
  2. 长尾现象:几个高频 token 的预测准确率拉低了整体 PPL,但实际困难 token 可能预测很差
  3. 无法衡量推理能力:一个模型可以对"1+1=2"给出高概率,但不代表它真正理解加法
  4. 领域外泛化:PPL 是在特定分布上测的,跨领域时失效

因此,实际评测 LLM 时,PPL 只是入门指标,更需要配合各种能力基准(MMLU、HumanEval、GSM8K 等)。 :::


9.4 为什么 Decoder-only 成为主流?

两条路的分岔

2018-2019 年,NLP 界曾经有两个并驾齐驱的范式:

  • BERT(Encoder-only):双向注意力,擅长理解任务,在 GLUE 等基准上碾压一切
  • GPT(Decoder-only):单向注意力,自回归生成,文本生成能力强

彼时,学界普遍认为:理解任务用 BERT,生成任务用 GPT,各有擅场。

然而,随着模型规模不断扩大,Decoder-only 架构逐渐成为大模型的绝对主流(GPT-3/4、LLaMA、Mistral、Claude、Gemini……)。为什么?

原因一:In-context Learning 只需要 Decoder-only

GPT-3 的一个震撼性发现是:只需在 prompt 里给几个例子(few-shot examples),模型就能在没有梯度更新的情况下完成新任务——这就是 In-context Learning(上下文学习)

示例 prompt:
英文:Hello → 中文:你好
英文:Thank you → 中文:谢谢
英文:Goodbye → 中文:[模型填写]

这种能力天然适合自回归模型:把示例和问题拼接成一段文本,模型续写即可。

BERT 无法做到这一点——它的输入输出格式不支持这种开放式续写。即便强行构造 [MASK],也只能处理单一填空,无法处理任意形式的"输出"。

原因二:Scaling Law 在 Decoder-only 上更显著

Kaplan 等人(2020)的 Scaling Law 研究发现:对于自回归语言模型,参数量、数据量、计算量与模型性能之间存在幂律关系——规模越大,性能越好,且这个规律非常稳定。

Encoder-only 架构的规模化路径相对有限——BERT 到 RoBERTa 到 DeBERTa,参数量增长有限,性能提升也在逐渐触及瓶颈。而 GPT-2(1.5B)→ GPT-3(175B)→ GPT-4(估计 ~1T+)的路径证明,Decoder-only 的 Scaling Law 具有更大的延展空间。

原因三:工程实现更简洁

Encoder-Decoder 架构(如 T5、BART)需要维护两套参数,推理时需要运行两个组件,内存开销更大,实现复杂度更高。

Decoder-only 架构的推理只需要一个核心优化:KV Cache(键值缓存)

自回归生成时:
- 第1步:计算 token_1 的 K, V,缓存
- 第2步:计算 token_2 的 K, V,缓存;注意力时复用 token_1 的 K, V
- 第N步:只需计算新 token 的 K, V,历史全部从缓存读取

每生成一个新 token,只需计算当前位置的 K、V 值,过去所有位置的 K、V 已缓存。这使得推理效率大幅提升,工程优化路径清晰。

原因四:统一的任务框架

Decoder-only 模型提供了一个统一的范式:所有任务都是文本续写

任务Prompt 构造模型行为
文本分类"这段话的情感是:"续写"正面"或"负面"
机器翻译"将以下英文翻译成中文:Hello"续写"你好"
代码生成"写一个排序函数:\n```python\n"续写代码
数学推理"计算 2+3=?"续写"5"

这种统一接口极大简化了多任务系统的构建,也是 ChatGPT 等产品能够通用化的底层原因。

:::tip 总结:为什么 Decoder-only 赢了? 不是因为 Decoder-only "更好",而是因为它在可扩展性、通用性、工程简洁性三个维度上综合领先,在大规模预训练时代形成了正反馈:更大的模型 → 更强的 In-context Learning → 更广泛的应用 → 更多算力投入 → 更大的模型。 :::


本章小结

维度CLM(自回归)MLM(掩码)
预测目标P(xtx<t)P(x_t \mid x_{<t})P(xi上下文)P(x_i \mid \text{上下文})
注意力方向单向(只看左侧)双向(左右都看)
训练信号密度每个 token 都学只有 15% mask 位置
生成能力天然支持不支持
理解能力需要 prompt 设计直接提取表示
代表模型GPT 系列BERT 系列
当前地位大模型主流特定下游任务

困惑度(PPL) 是衡量语言模型质量的基础指标:PPL 越低,模型对文本的预测越自信,但 PPL 低并不等价于模型在具体任务上的实际表现强。


理解了语言模型是"如何被训练的"之后,下一章我们将深入模型的内部结构——注意力机制(Attention):这个将输入序列中任意两个位置联系起来的核心组件,是 Transformer 架构的灵魂所在。