GPT 与生成式预训练

把上一章的解码器单独拎出来,它本身就是一个语言模型——而且任意一段文本都能直接拿来训练它。

知识课 · 约 35 分钟 · 更新于 2026-08-14

回到另一条路线:只取解码器

在「交叉注意力与解码器」里,你见过的解码器层有 两种 注意力:

  • 掩码(因果)自注意力 :只看自己已经生成的词(左边的词);
  • 交叉注意力 :去看编码器输出的那段原文。

现在我们把解码器单独拎出来用,身边 没有编码器 了——交叉注意力也就失去了「要看的原文」,直接去掉。剩下的就是「 纯掩码自注意力 + 前馈网络 + 残差与归一化 」层层堆叠,这就是 GPT 的骨架,称为 decoder-only (只有解码器)架构。

它本身就是一个语言模型

这个 decoder-only 模型在做一件极朴素的事—— 预测下一个词(next token prediction) : 给定前面若干个 token,预测下一个最可能的 token;把预测出的词接到序列末尾,再预测下一个,如此往复, 自回归 地生成整段文本。

这正是你在「训练与推理通路」里见过的、解码器推理时所做的事,区别只有一点:现在它 不再依赖任何原文 ,纯粹根据自己已经写出的内容往下接。能根据前文预测下文的模型,就是一个 语言模型 。

核心转变:任意一段文本都能拿来训练它

训练那个翻译用的 encoder–decoder,需要成对的「源句 — 目标句」,这种配对数据稀缺又昂贵。而「预测下一个词」这个目标有一个惊人的性质:

拿任意一段文本,逐个位置看它怎么给自己造出标签:

于是整个互联网的文本——网页、书籍、代码、对话——都成了现成的训练语料。这种「在海量无标注文本上以预测下一个词为目标做预训练」的方式,叫 生成式预训练(generative pre-training) ,也就是 GPT 名字里的 G 和 P。

它和「BERT 与预训练范式」里讲的 自监督 是同一个思想——标签藏在数据自身里——只是把「完形填空(看双向猜中间)」换成了「预测下一个词(看左侧猜右边)」。

为什么训练能如此高效

逐词生成看着是个「一个接一个」的串行过程,但 训练 时并不需要真的一步步来。靠的是你在「掩码注意力」里学过的 因果掩码 :

一段长度为 的文本,只需 一次前向 ,就能同时得到所有 个位置各自的「下一个词」预测——因为因果掩码保证了第 个位置只能看到前 个词,不会偷看未来。对每个位置的预测分别求交叉熵再求和,就是这一段的训练损失。

这与「训练与推理通路」里讲的「训练时并行、teacher forcing」完全是一回事,差别仅在于:这里的输入与标签来自 同一段文本的错位 ,而不是两句不同的话。

上下文窗口:模型一次能看多长

模型一次能处理的最大 token 数,称为 上下文窗口(context window / context length) 。它受位置编码的设计和显存的限制——常见的从一两千到八千 token 不等,现代模型则大得多。

「大」从何而来

解码器路线真正的潜力在于 堆规模 ——更多的层、更大的维度、更多的数据。随着规模增大,模型会逐渐表现出小模型不具备的能力,例如:

  • 只看几个示例,就能上手一个全新任务(少样本学习,无需再训练,只把示例写进输入);
  • 表现出初步的多步推理。

这正是「 大 语言模型」之「大」的由来。具体怎么把它训得更稳、跑得更快、扩得更大,是后面几门课要拆解的;这里先记住一个方向:规模本身会带来质变。

动手:用「错一位」造出训练数据

把一段文本编码成 ID 序列,用错位的方式造出输入 x 和标签 y ,确认监督信号确实来自文本本身:

为求简单,这几个动手演示按字符切分,一个汉字算一个 token;真实的 GPT 用的是你在「BPE 子词分词」里学过的 BPE / BBPE 子词分词,一个 token 未必正好对应一个字,但错位造标签的原理一致。

动手:训练一个迷你 GPT

以你在「Transformer 实战」里搭过的解码器为底座,去掉交叉注意力,只留「掩码自注意力 + 前馈 + Add & Norm」,堆几层,就是一个小规模 decoder-only 模型:

训练就是熟悉的五步法,损失对所有位置的「下一个词」预测求交叉熵:

在一小段语料(比如一首诗的字符序列)上训练它预测下一个字符,再给一个开头让它 自回归续写 ——每步取一个词接到末尾、再喂回去:

训练前它只会吐乱码,训练后会逐渐写出像模像样的句子。

总取「最可能」,为什么文字会发僵

刚才续写时,我们每一步都 取概率最大的词 (贪心)。可这样生成的文本往往呆板、爱重复,甚至原地打转。

换个具体例子。模型读到「我想喝一杯」、轮到预测下一个词时,它对词表里每个词都给出一份概率。下图列出概率最高的几个候选,最右一根「其余词」是词表里剩下上千个词的概率之和:

横轴为候选词,纵轴为模型分配给它的概率。贪心解码只取最高的那一根(高亮的「咖啡」,约 28%),其余候选连同尾部上千个词一并舍弃——一整个分布里,只有这一个顶点进入了生成结果。悬停可读出每个词的概率。

怎么从分布里挑词,是一门讲究,留给「采样与解码策略」。