想象一个叫小蒙的学徒,被师父用黑布蒙上双眼,每天面对一本从未读过的书。师父任意翻开一页,用一根书签挡住后面的文字,只让小蒙看已经写出的部分,猜紧挨着的下一个字是什么。猜完立刻揭晓答案——猜对了记一分,猜错了也继续往前走,然后猜再下一个字。日复一日,小蒙猜了亿万次,“语感”像肌肉记忆一样长了出来:看到“春眠不觉”,他会脱口而出“晓”;看到“从此过上”,他自然接上“幸福的生活”。这种「只看前文、猜后文、揭晓、再往前走」的循环,就是 GPT 自回归预训练的本质。本文把这个循环层层拆开——预测目标、架构简化、单向掩码、逐字生成、训练流程和规模扩展——带你彻底看懂 GPT 为什么能成为今天最主流的生成式预训练范式。

岗位关联

理解自回归预训练,是理解 GPT 系列模型「为什么能生成」的钥匙。无论你是做算法、工程还是产品,掌握这套从训练到生成的思维模型,才能在面对大模型时知其然,更知其所以然。

目录
  1. 可视化演示
  2. 自回归机制:逐字续写的因果链
  3. 预训练目标:蒙眼猜字的海量小测
  4. 架构简化:撤掉抄写台的写作间
  5. 因果掩码:不能偷看后文的书签
  6. 生成范式:出师后的自由创作
  7. 预训练流程:从书库到脑回路的训练车间
  8. 扩展能力:从学徒到全能文豪
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示GPT三大核心机制:Next Token逐词生成、因果掩码隔离未来信息、GPT与BERT预训练范式对比,三模式交互演示。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Next Token Prediction 模型逐个预测下一个Token,自左向右生成 当前Token高亮闪烁,已生成Token固定 自回归生成范式

自回归机制:逐字续写的因果链

在小蒙的猜字训练里,有一条不可违背的铁律:决定下一个字时,只能依据已经写出的字。 他不能问师父“后面是什么”,也不能偷偷翻页。这条铁律听上去简单,却把“写作”这个看似高深的行为,变成了一个可以一步步执行的机械过程——先看已写的前文,猜下一个字;揭晓后,把新字并入前文,继续猜再下一个。日复一日,小蒙就在这条铁律的牵引下,把整本书从头猜到尾。

这条铁律在数学上有一个响亮的名字:自回归(Autoregressive)。它把一段文字出现的概率,拆解成“每个字在给定前文的条件下出现的概率”之积。GPT 做的正是这件事:把语料里的每一句话都拆成一连串“给定前文、预测下一个 token”的练习题,然后让模型在亿万道练习题里磨炼。

在 GPT 的世界里,“字”不一定是汉字或英文单词,而是 token——一种把文本切分成小块的基本单位,可能是一个词、一个字,甚至一个子词。模型预测的粒度是 token,而不是整句话。

这种“每一步只依赖过去、不依赖未来”的链式分解,正是自回归的精髓。小蒙猜得越多,“只看前文”的本能就越强,整本书在他眼里不再是一个不可分割的整体,而是一串环环相扣的接龙。

P(x1,x2,…,xT)=∏t=1TP(xt∣x1,x2,…,xt−1)\displaystyle P(x_1, x_2, \ldots, x_T) = \prod_{t=1}^{T} P(x_t \mid x_1, x_2, \ldots, x_{t-1})
这个公式说明:一段话的总概率,等于从第一个字开始、逐字“在给定前文下猜中”的概率连乘起来。
  1. 联合概率左边表示整句话 \(x_1\) 到 \(x_T\) 同时出现的概率
    P(x1,x2,…,xT)\displaystyle P(x_1, x_2, \ldots, x_T)
  2. 连乘符号右边的 \(\prod\) 表示把每一步的“猜中概率”全部乘起来
    ∏t=1T\displaystyle \prod_{t=1}^{T}
  3. 条件概率每一项都表示“已知前 \(t-1\) 个 token,猜第 \(t\) 个 token 的概率”
    P(xt∣x1,x2,…,xt−1)\displaystyle P(x_t \mid x_1, x_2, \ldots, x_{t-1})

预训练目标:蒙眼猜字的海量小测

小蒙的训练没有教材,只有一本又一本没有答案的书。师父的流程永远是:翻开书,挡住后文,让他猜下一个字,然后“铛”一声揭晓答案,继续往前。猜对,皆大欢喜;猜错,小蒙要在心里记下这个教训——“原来这里不该接那个词”。这种从亿万次试错里积攒语感的过程,就是 预训练(Pre-training)。

GPT 的预训练目标有一个精确的名字:下一词预测(Next Token Prediction)。模型读入一段前文,输出一个概率分布,表示“下一个 token 可能是谁”,然后与真实的 token 对比。差距越大,模型在训练中受到的“惩罚”越重;差距越小,说明模型越接近一个语感大师。

这个“惩罚”在数学上叫 负对数似然(Negative Log-Likelihood, NLL)。它的核心思想是:如果模型给真实下一个 token 的概率是 0.9,损失就很小;如果只给了 0.1,损失就很大。把所有位置的平均损失压到最低,模型的预测能力就越来越强。

为什么 GPT 用“预测下一个词”而不用“预测被挖空的任意词”?因为生成这件事本身就是“从左到右、逐个产出”。训练时猜下一个词,生成时也在猜下一个词——目标一致,训练和 inference 之间没有任何“翻译”成本。小蒙集训时的猜字练习,恰好就是出师后每日工作的翻版。

L(θ)=−1T∑t=1Tlog⁡Pθ(xt∣x<t)\displaystyle \mathcal{L}(\theta) = -\frac{1}{T} \sum_{t=1}^{T} \log P_{\theta}(x_t \mid x_{<t})
这就是 GPT 的“每日小测评分表”:每个位置的猜字越准,总分越好看。整个预训练就是把这个分数不断刷新的过程。
  1. 损失函数\(\mathcal{L}(\theta)\) 表示模型在参数 \(\theta\) 下的平均得分(越小越好)
    L(θ)\displaystyle \mathcal{L}(\theta)
  2. 平均符号\(-\frac{1}{T}\sum_{t=1}^{T}\) 表示对整句 T 个位置求平均,再取负号让“越准越小”
    −1T∑t=1T\displaystyle -\frac{1}{T} \sum_{t=1}^{T}
  3. 对数概率\(\log P_{\theta}(x_t \mid x_{<t})\) 是模型给“真实下一个 token”打分的对数;真实 token 概率越接近 1,这个值越接近 0
    log⁡Pθ(xt∣x<t)\displaystyle \log P_{\theta}(x_t \mid x_{<t})

架构简化:撤掉抄写台的写作间

在早期 Transformer 里,有一类模型是“翻译员”结构:一个编码器(Encoder)负责把整句话“读”成一张全景图,另一个解码器(Decoder)再根据这张图逐词抄写出来。对小蒙来说,这相当于师父给他配了两张桌子:一张放“全文地图”,一张放“写作草稿”。但 GPT 的师父做了一个大胆的决定:撤掉地图桌,只留写作桌。

这个决定就是 移除编码器、仅保留解码器(Decoder-only)。直觉上,写书的人根本不需要一张“未来的地图”——他下一笔的依据永远是已经落笔的内容。编码器擅长理解整句,但生成任务只需要“基于前文预测下文本”,保留编码器反而让训练目标绕了一个大弯。GPT 把 Transformer 的解码器层一堆到底:每一层都包含自注意力、前馈网络和残差连接,层层堆叠,如同一摞整齐的写作参考卡。

技术上说,每一层把上一层的隐藏状态 \(\mathbf{h}^{(l-1)}\) 加工成更抽象的表达 \(\mathbf{h}^{(l)}\)。多头注意力负责从“已写内容”中挑选相关信息,前馈网络负责把信息揉成“下一词的倾向”,残差连接则保证信息在深层网络中不丢失。

这个“只留草稿本”的架构,是 GPT 系列最具辨识度的设计。翻译员手里的全景图虽然信息丰富,但生成时必须小心地把每个词“对齐”到图上;而小蒙只需要盯住自己写过的字,全神贯注地猜下一个。简化不是偷懒,而是让模型把全部能力都聚焦到“延续前文”这一件事上。

h(l)=FFN(MHA(h(l−1)))+h(l−1)\displaystyle \mathbf{h}^{(l)} = \text{FFN}\left(\text{MHA}\left(\mathbf{h}^{(l-1)}\right)\right) + \mathbf{h}^{(l-1)}
这一层的输出 = 用注意力与前馈网络加工后的新表达 + 原来的旧表达。残差连接让深层网络像“搭积木”一样稳定地越叠越高。
  1. 隐藏状态\(\mathbf{h}^{(l)}\) 是第 \(l\) 层输出的向量序列,代表“模型当前对前文的理解”
    h(l)\displaystyle \mathbf{h}^{(l)}
  2. 多头注意力\(\text{MHA}\left(\mathbf{h}^{(l-1)}\right)\) 负责在已写 token 之间互相打分、抽取关联
    MHA(h(l−1))\displaystyle \text{MHA}\left(\mathbf{h}^{(l-1)}\right)
  3. 前馈网络\(\text{FFN}(\cdot)\) 对每个位置独立做非线性变换,把注意力结果转化为“下一词倾向”
    FFN(⋅)\displaystyle \text{FFN}(\cdot)
  4. 残差相加最后的 \(+\) \(\mathbf{h}^{(l-1)}\) 是把原始输入原样加回来,保证深层信息不衰减
    +h(l−1)\displaystyle + \mathbf{h}^{(l-1)}

因果掩码:不能偷看后文的书签

小蒙的师父有一件法宝——一根“禁忌书签”。每当他翻开书,书签总是精准地挡在当前位置之后,把所有未来的文字遮得严严实实。小蒙不是没动过歪心思:要是能瞥见后面的字,猜起来岂不是百发百中?但师父绝不允许。这根书签在 GPT 里也有一个对应的机制:因果掩码(Causal Mask)。

在 GPT 的自注意力计算中,每个 token 都要对序列中其他 token 做“关联打分”。如果不加限制,模型的注意力分数会同时看到左侧和右侧的 token,未来的信息就“泄露”到了当前。因果掩码的做法非常直接:在注意力分数矩阵上,把“右上角”(代表当前位置看未来位置)的部分全部设为一个极大的负数,让它们在 softmax 归一化后变成零——未来 token 对当前 token 的注意力权重被彻底清零。

形式化地,注意力输出是 softmax 处理过的加权和,其中掩码矩阵 \(\mathbf{M}\) 像一个铁面无私的守门员:允许看到自己和过去(\(i \ge j\)),禁止看到未来(\(i < j\))。

因果掩码让 GPT 在训练时就养成了“只看左边”的习惯。当小蒙练习猜字时,书签死死压住未来;到他真正生成时,他天然就不会去“等”后面的字——因为他的注意力结构里,未来从来就不在场。

Attention(Q,K,V)=softmax(QK⊤dk+M)V\displaystyle \text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\frac{\mathbf{Q}\mathbf{K}^{\top}}{\sqrt{d_k}} + \mathbf{M}\right) \mathbf{V}
Mij={0i≥j−∞i<j\displaystyle \mathbf{M}_{ij} = \begin{cases} 0 & i \ge j \\ -\infty & i < j \end{cases}
第一个公式是带掩码的注意力计算;第二个公式定义了掩码矩阵:对角线及左下角放行,右上角一票否决。
  1. 查询与键\(\mathbf{Q}\)(查询)和 \(\mathbf{K}\)(键)用于让每个 token 对其他 token 打分,点积越大表示越相关
    QK⊤\displaystyle \mathbf{Q}\mathbf{K}^{\top}
  2. 缩放因子除以 \(\sqrt{d_k}\),防止点积数值过大把 softmax 推向极端
    1dk\displaystyle \frac{1}{\sqrt{d_k}}
  3. 掩码注入把掩码矩阵 \(\mathbf{M}\) 直接加到分数矩阵上,未来位置被塞入 \(-\infty\)
    +M\displaystyle + \mathbf{M}
  4. 条件取值当 \(i \ge j\) 时值为 0,保留注意力;当 \(i < j\) 时值为 \(-\infty\),softmax 后权重归 0
    {0i≥j−∞i<j\displaystyle \begin{cases} 0 & i \ge j \\ -\infty & i < j \end{cases}

生成范式:出师后的自由创作

十年功成,小蒙出师了。师父交给他一根空白的卷轴,说:“从今天起,你自己写。”小蒙深吸一口气,在纸上写下第一个字,然后——就像训练时那样——看着已写出的前文,心里默默给所有可能的下一字打分,从中挑一个写下,如此反复,直到整篇文字完成。写作,竟然就是猜字的自然延续。

GPT 的生成过程也完全一样:它把已生成的 token 序列作为输入,通过自回归解码(Autoregressive Decoding)逐步产出下一个 token。每一轮,模型输出一个 logits 向量,即每个候选 token 的原始得分;得分经过 softmax 变成概率分布;然后从这个分布中采样(Sample)出一个 token,拼接到输入末尾,进入下一轮。

为了让生成不那么“机械”,模型引入了一个旋钮:温度(Temperature, \(\tau\))。温度越低,概率分布越尖锐,模型总挑最高分的词,输出保守稳定;温度越高,分布越平坦,低分的长尾词也有机会被选中,输出更随机、更有创造力。这就像小蒙写字时的两种状态:小心翼翼地誊抄,或者天马行空地发挥。

你可能会发现一个有趣的闭环:训练时模型在做“给定前文,预测下一个 token”,生成时模型仍在做“给定前文,预测下一个 token”。唯一的区别是,训练时下一个 token 来自真实语料,而生成时来自模型自己的采样。小蒙出师后写的每一个字,用的都是集训时练就的那块肌肉——这也是“预训练目标天然对齐生成任务”的最直观体现。

xt+1∼softmax(logitstτ)\displaystyle x_{t+1} \sim \text{softmax}\left(\frac{\text{logits}_t}{\tau}\right)
下一 token 从“对数得分除以温度再做 softmax”的概率分布中采样。\(\tau\) 小则稳,\(\tau\) 大则野。
  1. 采样符号\(x_{t+1} \sim\) 表示“下一个 token 按后面的概率分布随机抽取”
    xt+1∼\displaystyle x_{t+1} \sim
  2. 原始得分\(\text{logits}_t\) 是模型在位置 \(t\) 给每个候选 token 打的原始分
    logitst\displaystyle \text{logits}_t
  3. 温度缩放除以 \(\tau\) 调整分布陡峭程度——\(\tau \to 0\) 时趋向“只选最大”,\(\tau \to \infty\) 时趋向“均匀随机”
    logitstτ\displaystyle \frac{\text{logits}_t}{\tau}
  4. 概率归一softmax 把缩放后的得分变为总和为 1 的概率分布,再从中采样
    softmax(⋅)\displaystyle \text{softmax}(\cdot)

预训练流程:从书库到脑回路的训练车间

小蒙的“语感”不是凭空来的。在师父的书坊深处,有一间昼夜不熄的“训练车间”:成箱的书籍被运进来,切成一页页、一行行、一个个字;学徒们排着队,每个人手里拿着同一本“错题本”。这套流水线,对应的正是 GPT 预训练的完整流程。

第一步是数据准备:把海量互联网文本收集、清洗、切分成 token 序列,并按固定窗口长度截成训练样本。第二步是批次训练:把一批样本同时喂进模型,计算每个位置的预测损失。第三步是梯度更新:根据损失函数对模型参数的导数,沿“让损失变小”的方向调整参数——这就是梯度下降(Gradient Descent)。第四步是迭代收敛:一批又一批地重复以上步骤,直到损失稳定不再下降,模型获得稳定的“语感”。

形式化地,每一步更新都遵循同一个公式:把当前参数减去“学习率 × 梯度”。学习率 \(\eta\) 像是学徒迈步的幅度——迈大了容易错过最佳点,迈小了进步太慢。

这套流水线运转在 GPU 集群上,参数动辄数十亿上百亿,语料动辄数万亿 token。小蒙的“错题本”在真实世界里就是不断更新的模型权重——每一次猜错留下的教训,都被压缩成一连串浮点数,沉淀在数十亿个参数里。等到训练收敛,车间熄灯,一个“语感大师”就此诞生。

θ←θ−η∇θL(θ)\displaystyle \theta \leftarrow \theta - \eta \nabla_{\theta} \mathcal{L}(\theta)
新参数 = 旧参数 - 学习率 × 损失对参数的梯度。这就是预训练车间里最核心的“纠错动作”。
  1. 参数更新\(\theta \leftarrow \theta\) 表示把右边的计算结果赋回给模型参数
    θ←θ\displaystyle \theta \leftarrow \theta
  2. 学习率\(\eta\) 是步长超参数,控制每次“纠错”的幅度
    η\displaystyle \eta
  3. 梯度向量\(\nabla_{\theta} \mathcal{L}(\theta)\) 表示损失函数在参数空间的坡度方向,沿反方向走就能降低损失
    ∇θL(θ)\displaystyle \nabla_{\theta} \mathcal{L}(\theta)

扩展能力:从学徒到全能文豪

小蒙成名之后,来找他写东西的人络绎不绝。有人给他看了几句童话开头,他就能接续一整个故事;有人给他几段公文范例,他就能写得像模像样。他不再是那个只会照着书猜字的学徒,而成了一个“给个例子,就能照葫芦画瓢”的全能文豪。这种能力在 GPT 身上,叫做 上下文学习(In-Context Learning),也是规模扩大后浮现出的惊人特性。

为什么小蒙能做到?关键在于“规模法则”:模型的参数量 \(N\) 越大、训练数据越多,它对语言分布的拟合就越精细。研究者发现,模型损失和参数量之间存在一个幂律关系——参数翻倍,损失虽然不会归零,但会沿着一条平滑的曲线稳定下降。这就是著名的 缩放定律(Scaling Law)。

规模带来的不只是“更会猜字”,更是推理、翻译、写代码、对话等通用能力的涌现。但这些能力的源头,依然是那个朴素的循环:看完已写的前文,猜下一个 token,再把猜出的结果接回去。小蒙从学徒到文豪的蜕变告诉我们——当“猜字”练到极致,广泛而通用的生成能力便会自然浮现,这就是 GPT 作为生成式预训练范式最迷人的地方。

L(N)≈L∞+ANα\displaystyle L(N) \approx L_{\infty} + \frac{A}{N^{\alpha}}
模型参数量 \(N\) 越大,损失 \(L(N)\) 越低,但存在一个不可逾越的下限 \(L_{\infty}\)——语料本身的“意外性”决定了没有模型能完美预测所有文本。
  1. 损失与参数\(L(N)\) 表示参数量为 \(N\) 时的平均损失
    L(N)\displaystyle L(N)
  2. 不可约损失\(L_{\infty}\) 是模型规模无限大时也降不下去的极限损失,代表数据本身的信息熵
    L∞\displaystyle L_{\infty}
  3. 幂律项\(\frac{A}{N^{\alpha}}\) 中 \(A\) 是常数,\(\alpha\) 是缩放指数,随 \(N\) 增大这项趋向 0
    ANα\displaystyle \frac{A}{N^{\alpha}}

AI 应用场景

智能客服:对话接龙中的自回归

阶段:生成式推理/落地部署

解决的问题:传统客服依赖关键词匹配和规则模板,遇到没预写过的问法就答非所问。GPT 系列用自回归预训练读遍海量对话语料,学会了“顺着用户上一句话,猜出下一句合理的回复”——每次回复都是一个“续写”动作,多轮对话就是连续的自回归接龙。

具体案例:某电商平台接入 GPT 底座后,用户说“我上周买的耳机一只不响了”,模型基于前文上下文自动续写:“非常抱歉给您带来不便,请问能否提供订单号,我为您安排检测换新?”整个过程没有人工编写任何规则模板。

代码自动补全:逐 token 预测下一行代码

阶段:模型微调/专用生成

解决的问题:IDE 的传统补全只能提示 API 名称,面对“根据上文逻辑写下一段代码”无能为力。基于自回归思想,模型把代码看成“token 序列”,看完前面已写的函数、参数、注释,逐 token 续写后面的代码——生成目标和预训练目标完全一致。

具体案例:工程师在编辑器里写了一个 def calculate_total(items): 函数和几行注释,GitHub Copilot(基于 GPT 架构的自回归模型)立刻续写出了循环汇总、折扣计算和返回语句,工程师只需微调几处边界条件。

内容创作助手:营销文案的无限接龙

阶段:生成式推理/业务集成

解决的问题:传统文案创作依赖人脑构思和人工润色,瓶颈在于“从零开始”的开头难。自回归模型擅长的恰恰是“继续写”——给它一个标题、一段卖点、或一句品牌调性描述,它就能按同一风格一路续写下去,并靠温度参数在“稳妥”和“出彩”之间自由切换。

具体案例:某品牌运营将产品参数和“轻松、幽默”的要求写进提示词,GPT 模型依次生成了三条不同风格的推广文案,运营从中挑出最佳版本稍作修改后直接投放,单条文案产出从 2 小时缩短到 3 分钟。

Python 演示

python39 行
import randomfrom collections import Counter, defaultdict  class ToyGPT:    """极简版自回归语言模型:只统计每个字后面各字出现次数。"""     def __init__(self, text, seed=42):        random.seed(seed)        self.chars = sorted(set(text))        self.trans = defaultdict(Counter)        for a, b in zip(text, text[1:]):            self.trans[a][b] += 1     def next_token_probs(self, token, temperature=1.0):        """模拟 GPT 的单步预测:依据当前 token 给出下一 token 分布。"""        counter = self.trans[token] if token in self.trans else Counter(self.chars)        logits = [(ch, cnt ** (1.0 / temperature)) for ch, cnt in counter.items()]        total = sum(w for _, w in logits)        return [(ch, w / total) for ch, w in logits]     def generate(self, prompt, length=60, temperature=0.7):        """自回归生成:每步采样一个 token 拼回输入,继续预测下一个。"""        out = list(prompt)        current = prompt[-1]        for _ in range(length):            probs = self.next_token_probs(current, temperature)            chars = [ch for ch, _ in probs]            weights = [w for _, w in probs]            current = random.choices(chars, weights=weights)[0]            out.append(current)        return ''.join(out)  if __name__ == '__main__':    corpus = ('从前有座山山里有座庙庙里有个老和尚在给小和尚讲故事'              '讲的是从前有座山山里有座庙庙里有个老和尚在给小和尚讲故事')    gpt = ToyGPT(corpus)    print('生成结果:', gpt.generate('从前', length=50, temperature=0.8))
目的:用字符级 bigram 计数实现一个“玩具版”自回归语言模型,演示 GPT 最核心的生成循环——逐个 token 预测、采样、拼回输入再继续。它只考虑上一个字,而真正的 GPT 通过因果注意力考虑整个前文,但循环骨架完全一致。
  1. self.trans[a][b] += 1在训练语料中统计字符转移频次,相当于“猜字小测”的答案本
  2. counter.items()` 与 `cnt ** (1.0 / temperature)用温度指数对频次做缩放,模拟温度控制随机性
  3. generate` 中的 `current = random.choices(chars, weights=weights)[0]按概率分布采样下一个 token
  4. out.append(current)新 token 拼到已生成序列末尾,作为下一步输入,构成自回归闭环
  5. prompt[-1]生成从提示词的最后一个 token 出发,与现实中的“输入前缀续写”一致

常见误区

误区我听说 GPT 在训练时是“看完一整段话再学习”,所以它一定见过这句话后面写了什么,不然怎么知道该预测什么?

正解恰恰相反。GPT 的训练和生成严格遵守同样的“蒙眼规则”:在计算某个位置 t 的预测时,因果掩码会把 t 之后的所有 token 注意力权重清零。即使训练数据是一整段完整文本,模型在预测每个 token 时都只被允许看到它前面的内容;真实的“下一个 token”只作为评分标准出现,绝不作为输入出现。书签在训练和生成时都夹着,从未取下过。

为何常见:人们容易把“训练数据包含完整文本”和“预测时看到完整文本”混为一谈——数据里确实有完整句子,但模型在每一个训练步骤中看到的永远只是左侧窗口。

误区我总以为 GPT 生成回复时,是模型内部先草拟好了完整答案,再一个一个字地“念”出来,就像人先想好再说话。

正解GPT 没有“打草稿”这一步。它的每一次前向计算只输出一个 token 的概率分布,采样得到一个 token 后拼到输入末尾,再重新前向计算预测下一个。整个回复是几十上百次“猜下一个字”逐步拼接成的结果。如果中途截断,它并不知道自己“原本打算”写什么。

为何常见:人读一段连贯的文字会自动脑补作者早有全稿,而自回归模型的能力恰恰来自“每一步只看局部却能把全局风格延续下去”,这种机制和人类直觉很不一样。

误区GPT 读了几万亿 token,肯定是把整个互联网背下来了,用户问什么它就在记忆库里搜索答案。

正解预训练的目标函数是“最大化下一个 token 的预测概率”,模型学的是语言和世界的统计规律,而不是把文本原样存入数据库。它确实可能在某些情况下复现训练语料中的片段,但绝大多数输出是参数中“压缩出来的规律”的全新组合。小蒙不是背下那本书,而是练出了“语感”。

为何常见:因为人学习时“背诵”是最直观的记忆方式,且大模型偶尔会原样输出训练数据中的名句,让人误以为它是一部巨大的可检索硬盘。

误区GPT 参数规模越做越大,网上都说“大力出奇迹”,那它肯定不会再编造不存在的事实了。

正解规模法则只能降低损失、提升语言流畅度,但无法消除幻觉。原因在于自回归模型本质上是“在给定前文下找最像话的续写”,而不是在数据库里检索真伪。即使参数量无限增大,训练语料本身覆盖不到的知识依然会被模型用“听起来很合理”的词句填补。

为何常见:模型的流畅表达会让人产生“它真的懂”的错觉;而实际评测中,模型在事实性问题上依然会一本正经地胡说,这也是今天 RAG 和对齐技术存在的重要原因。

面试题

Q1. GPT 预训练阶段的核心任务是什么?

单选题 · easy

  • A.从左边依次预测下一个 token← 正确答案
  • B.预测被挖空的一个任意词
  • C.判断前后两句话是否相邻
  • D.把句子翻译成目标语言

答案:A。GPT 的自回归预训练核心是 Next Token Prediction——从左到右预测下一个 token。B 是 BERT 的完形填空,C 是早期的句子关系任务,D 是 seq2seq 翻译任务,都不是 GPT 的目标。

Q2. 因果掩码(Causal Mask)在注意力机制中起到什么作用?

单选题 · easy

  • A.允许当前词看到后面所有词
  • B.让训练和推理矩阵运算更快
  • C.挡住当前词之后未来的词← 正确答案
  • D.削减模型参数量来节省显存

答案:C。因果掩码把注意力矩阵上三角置为 \(-\infty\),使 softmax 后未来位置的权重为 0。A 是双向注意力的行为,B、D 属于性能优化手段,与防止信息泄露无关。

Q3. 下面哪个公式正确体现了自回归分解思想?

单选题 · mid

  • A.整句概率是各词独立概率的乘积
  • B.每个词只依赖它前面的所有词← 正确答案
  • C.每个词依赖整句话中所有其他词
  • D.概率由句子中最高频的一个词决定

答案:B。自回归分解要求 \(P(x_t \mid x_{<t})\),即每个词只依赖前文。A 是朴素贝叶斯独立性假设;C 是双向模型;D 完全错误。B 正是 \(P(x_1..x_T)=\prod P(x_t|x_{<t})\) 的通俗表述。

Q4. GPT 架构只保留解码器(Decoder-only)的核心原因是什么?

单选题 · mid

  • A.让模型参数总量能够大幅减少
  • B.防止深层网络出现梯度消失现象
  • C.让生成目标与训练目标保持一致← 正确答案
  • D.让句子输入输出的长度完全相等

答案:C。GPT 的预训练任务是“预测下一个 token”,生成时也是“预测下一个 token”,二者天然对齐,无需编码器先“理解全文再翻译”。A 并非主要动机;B 靠残差连接解决;D 是错误约束,自回归模型对本无长度相等要求。

Q5. 生成时把温度参数 \(\tau\) 调大,输出会怎样变化?

单选题 · mid

  • A.输出更随机,长尾词更容易出现← 正确答案
  • B.输出更保守,总挑最高概率的词
  • C.输出和训练语料完全一模一样
  • D.推理速度明显变慢甚至卡顿

答案:A。温度 \(\tau\) 增大时,logits 除以更大的数,softmax 分布更平坦,低概率词也有机会被采样,所以输出更多样、更随机。B 是 \(\tau\) 调小的效果;C、D 与温度无直接关系。

Q6. 关于自回归生成过程的描述,正确的是哪些?

多选题 · mid

  • A.每个新 token 都是逐个生成的← 正确答案
  • B.新输出会拼接后重新喂给模型← 正确答案
  • C.整句话一次前向计算就能生成
  • D.生成时未来 token 不会影响当前← 正确答案

答案:ABD。自回归生成是逐 token 逐步完成的(A),每一步把新 token 拼到输入末尾再前向计算(B),未来 token 尚未产生,自然无法影响当前(D)。C 错误——一次前向只能输出一个 token 的概率分布,整句必须靠循环拼接。

Q7. 关于预训练与微调的关系,下列说法正确的是?

单选题 · hard

  • A.预训练与微调目标必须完全相同
  • B.微调会丢弃预训练学习的全部知识
  • C.预训练后换新任务微调即可适配← 正确答案
  • D.微调只在无标注的语料上执行

答案:C。预训练在海量无标注语料上建立通用“语感”,微调再用带标注的小规模数据把模型适配到具体任务。A 错误——微调可以换任务目标;B 错误——微调保留绝大部分预训练知识;D 错误——微调通常使用带标注数据。

Q8. 关于 GPT 自回归预训练,理解正确的有?

多选题 · hard

  • A.训练目标是最大化条件似然← 正确答案
  • B.单向掩码抹掉了后文信息← 正确答案
  • C.模型靠背诵整段语料来作答
  • D.生成时每个词都能看到后续内容

答案:AB。训练目标就是最大化 \(\prod P(x_t|x_{<t})\),即条件似然(A);因果掩码保证未来信息不进入注意力计算(B)。C 错误——模型学的是统计规律而非死记硬背;D 错误——生成时同样受因果掩码约束,看不到未来。

Q9. 为什么说 GPT 的预训练目标“天然对齐”文本生成任务?

单选题 · hard

  • A.因为模型采用了双向注意力机制
  • B.因为输入输出长度必须确保相等
  • C.因为模型不需要借助任何上下文
  • D.生成和预测下词本质是同一操作← 正确答案

答案:D。生成任务就是“给定已生成前缀,预测下一个 token”,与预训练的 Next Token Prediction 结构完全相同,训练和推理零落差。A 是 BERT 的特点;B 是错误约束;C 忽略了生成永远依赖上下文。

Q10. 模型规模扩大后,会浮现出哪些能力?

多选题 · extreme

  • A.零样本与少样本上下文学习← 正确答案
  • B.对数据分布更平滑的概率估计← 正确答案
  • C.在事实上完全杜绝幻觉类错误
  • D.自动让生成内容契合人类偏好

答案:AB。规模法则使模型具备更细腻的分布估计(B),并涌现出 In-Context Learning——给几个示例就能学会新任务(A)。C 错误:规模无法完全消除幻觉;D 错误:内容与人类偏好对齐需要额外的 RLHF 后训练,不是单纯扩规模能实现的。