一、把零件拼装成一台会跑的机器

前面十二讲拆出了一堆零件:第 1 讲定义了任务,第 3–6 讲给了向量、概率、神经网络和训练的数学工具,第 7–12 讲拼出了一个完整的 Decoder-only Transformer——一个函数,输入一串 token,在每个位置输出"下一个词是什么"的概率分布。

**预训练(pretraining)**要做的事情,字面意思极其简单:把这台机器,放到海量的文本上,反复运行第 6 讲讲过的那个训练循环——前向传播、算损失、反向传播、更新参数。 听起来像是"没有新东西了,把之前的都接起来就行",但这句话里藏着几个值得停下来讲清楚的细节,其中一个会直接决定第 21–24 讲要讲的"为什么生成一段话比训练模型时的每一步都慢得多"。

二、打个比方:一本自带答案、多到读不完的练习册

想象一本习题册,每一页题目旁边就印着答案,不需要老师另外批改——你做完一道题,翻到旁边直接对答案,发现哪里错了,立刻知道该往哪个方向调整。

第 1 讲已经点出过这件事:语言模型的训练数据天生自带"答案"——给模型一段已经存在的文字,前面的字是题目,紧跟着的那个字就是标准答案,不需要任何人额外去标注"这道题该填什么"。这一讲要把这句话正式钉成一个术语,并且把"这本练习册"做到"读不完"的规模。

三、把直觉钉成机制

正式定义:自监督学习

先补上一个至今没有正式定义、但已经用过好几次的对照概念——监督学习(supervised learning):需要人工准备好一批"输入-标签"配对数据(比如一张猫的图片,人工标注"这是猫"),模型的任务是学会从输入预测标签。标签是人给的,成本随数据量线性增长。

第 1 讲提到的训练方式完全不同:标签不需要人给,它就藏在数据本身的结构里——给一段已经存在的文本,把它切成"前面的部分"和"紧跟着的那个词",后者天然就是前者的"标签",不需要任何额外的人工标注步骤。这种训练方式,正式的名字叫自监督学习(self-supervised learning)。

自监督学习:训练所需的"标签"不依赖人工标注,而是从数据自身的结构中自动构造出来的一种训练方式。语言模型里,这个结构就是"文本的自然顺序":任意一段已有文本,都能自动切出无穷多组"输入-标签"对。

⭐ 这是这个领域能够用到互联网规模数据的根本原因——如果每一条数据都要人工标注,成本会随数据量线性上涨,今天的训练规模根本无法想象;自监督学习把这个成本降到了几乎为零,只要有文本,就有训练数据。

正式命名:自回归建模

第 4 讲讲过链式法则,把一整句话的概率拆成一串"给定前文,猜下一个词"的乘积:

P(x₁, x₂, ..., x_T) = P(x₁) × P(x₂|x₁) × ... × P(x_T|x₁,...,x_{T-1})

这种"用自己已经生成的历史,作为条件去预测自己下一步"的建模方式,有一个正式的名字:自回归(autoregressive)建模——“自"是指用自己的历史,“回归"是统计学里"用已知条件预测一个量"的说法。预训练的目标函数,就是让模型在自回归分解的每一步上,都尽量把真实出现的那个词的概率算得高一些——用第 4、6 讲讲过的交叉熵损失衡量"算得高不高”,用梯度下降(第 6 讲)不断调整第 7–12 讲出现过的全部参数(词嵌入表、每一层的 Q/K/V 投影矩阵、前馈层参数、LayerNorm 的缩放偏移……),让整个训练语料上的平均交叉熵损失持续下降。

⚠️ 这里可以正式回应第 11 讲留下的问题:为什么"把任何任务拼接成一段文本,统一用下一词预测训练"能够成立? 因为预训练的语料本身极其多样——新闻、代码、对话、说明书、翻译对照、数学推导,只要是文本,都能拆成"自回归"的训练样本。模型在学会预测这些五花八门内容的下一个词的过程中,顺带学会了处理这些内容各自对应的"任务”——这和第 1 讲"猜词逼出理解"是同一条逻辑,只是这一次,“理解"这个词具体展开成了"能完成各种不同任务的能力”,而不再只是"懂语法、懂常识"这么笼统。

关键细节:训练时用的是"教师强制",不是真的一步步生成

这一讲最值得停下来细讲的一点,是很多初学者会想当然搞混的地方:既然模型是"自回归"的,训练时是不是也要像生成文字一样,一个词一个词地跑?

答案是不需要——这正是因果掩码(第 11 讲)真正的用武之地。

拿一句真实的训练文本"我 喜欢 吃 苹果"举例。因为这是已经完整存在的真实数据,可以把这四个词一次性喂给模型,在同一次前向传播里,让模型在每一个位置同时给出预测:

位置 1(看到"我")           → 预测下一个词,和真实答案"喜欢"比较,算一份损失
位置 2(看到"我 喜欢")       → 预测下一个词,和真实答案"吃"比较,算一份损失
位置 3(看到"我 喜欢 吃")    → 预测下一个词,和真实答案"苹果"比较,算一份损失
位置 4(看到"我 喜欢 吃 苹果")→ 预测下一个词,和真实的下一个词比较,算一份损失

四个位置的预测,是同一次矩阵运算批量算出来的(第 3、9 讲:自注意力的打分表本来就是一次性对所有位置计算的),因果掩码(第 11 讲)保证了位置 2 在做预测时,虽然物理上"我 喜欢 吃 苹果"整段话都已经喂进去了,但它的计算看不到位置 3、4——它看不到"吃"“苹果"这两个未来的词,但看得到它自己需要预测的目标"吃"就紧跟在后面,只是这个目标不会被用来计算位置 2 自己的预测,只用来算这一步的损失。 四份损失加总(或平均),一次性反向传播,一次性更新全部参数。

⭐ 这种"每一步预测都用真实的历史(而不是模型自己刚生成、可能出错的内容)作为输入"的训练方式,叫教师强制(teacher forcing)——名字的直觉是"有一位老师在旁边,每一步都直接把正确答案喂给你作为下一步的输入,不让你在自己的错误上越走越偏”。

⭐⭐ 这解释了一个后面几讲会反复用到的关键不对称性:训练时,因为整段真实文本一次性可得,教师强制配合因果掩码,让"预测第 1 个词"和"预测第 1000 个词"可以在同一次前向传播里并行算出来,训练效率极高。但生成(推理)时完全是另一回事——生成第 1000 个词的时候,第 999 个词还不存在(没有"老师"能提前把它喂给你,它得先被模型自己生成出来),只能老老实实一步步来,生成完一个词,才能把它接到序列末尾,作为下一步的输入。同一个模型,训练时高度并行、飞快;推理时必须串行、一步一步——这个不对称性正是第 21–24 讲要花大篇幅处理的核心工程问题。

训练的规模

预训练要把上面这套流程,在极大规模的文本上反复运行——数据量、模型参数量、需要的计算量,都是这一讲之后(第 14、15 讲)要展开讨论的主题。

⚠️ 关于时效性:具体训练用了多少文本、多少参数、多少计算资源,这些数字几乎每年都在刷新,不是这一讲要记住的重点。这一讲要抓住的是不随具体数字变化的结构:自监督学习让数据几乎"零标注成本"地被规模化利用,自回归目标配合因果掩码让训练可以高度并行——这两条设计,是"预训练可以被做到今天这个规模"的根本原因,不管具体数字是几十亿还是几万亿。

四、这一讲机制自带的代价

⭐ 训练和推理的不对称性,是一笔绕不开的账:教师强制让训练飞快,但也意味着模型在训练时"看到的"永远是完美、正确的历史;一到推理阶段,模型必须依赖自己生成的、可能已经出错的历史继续往下走——如果前面生成错了一个词,后面的生成是在一个"不完美的历史"基础上继续自回归,误差有可能累积放大。这是自回归生成一个结构性的隐患,第 20 讲讨论对齐的隐患、第 29 讲讨论幻觉时,会再次遇到这条线索的不同表现形式。

⚠️ 预训练学到的是统计规律,不是被验证过的事实——这是第 1 讲第六节埋下的伏笔在这里的具体落地:交叉熵损失只关心"模型预测的概率分布,和语料里实际出现的词有多接近",不关心语料里的内容本身是真是假、是好是坏。模型会无差别地学习训练语料"统计上长什么样子",这条线索直接指向第 16–20 讲要讲的对齐、以及第 29 讲的幻觉。

⚠️ 数据的分布决定了模型的"性格":训练语料里哪种语言、哪个领域、哪种观点占比更高,模型自然会在那个方向上更擅长、更倾向——这不是训练算法本身带来的偏差,是数据决定的必然结果,直接指向第 14 讲要讲的数据质量问题。

五、和后面课程的关系

  • 第 14 讲接着讲:这一讲讲的是"怎么训练",第 14 讲讲"用什么数据训练"——数据的规模、质量、去重,以及训练过程本身可能分成不同阶段、用不同的数据配方。
  • **第 15 讲(Scaling Laws)**要把"数据、参数、计算量各自变大,损失会怎么变化"这件事变成一个可以定量讨论的规律。
  • 第 16 讲(SFT)会在这一讲的自监督预训练基础上,引入真正意义上的"监督"数据——人工准备的指令-回答对,用完全相同的训练机制(损失、反向传播、梯度下降)继续训练,只是数据来源和计算损失的范围发生了变化。
  • 第 21–24 讲讲推理阶段的全部工程问题,根源都在这一讲揭示的不对称性:训练靠教师强制可以并行,推理必须老老实实一步步自回归生成。

六、本讲小结

  • 预训练 = 把第 7–12 讲拼好的 Decoder-only Transformer,用第 6 讲的训练循环,在海量文本上反复运行。
  • ⭐ 自监督学习:标签不需要人工标注,从数据自身的顺序结构里自动构造——这是训练能够吃下互联网规模数据的根本原因。
  • 自回归建模:第 4 讲链式法则的正式名字——用自己的历史预测自己的下一步;因为训练语料足够多样,模型在学会预测各种内容的下一个词时,顺带学会了处理这些内容对应的各种任务。
  • ⭐⭐ 教师强制:训练时用真实的历史(而不是模型自己生成的内容)作为每一步的输入,配合因果掩码,让整段文本的全部位置可以在同一次前向传播里并行算出损失——这是训练能高效并行、但推理必须一步步串行生成这个核心不对称性的根源,直接指向第 21–24 讲。
  • ⚠️ 预训练学到的是统计规律,不保证事实正确;训练数据的分布直接决定模型的"性格"——两条线索分别指向第 16–20 讲的对齐必要性和第 14 讲的数据质量问题。

思考题

  1. 为什么"自监督学习"能让训练数据的获取成本几乎不随数据量增长,而传统的"监督学习"(人工标注)做不到这一点?
  2. 用自己的话解释"教师强制":如果训练时不用教师强制,而是让模型自己生成第一个词、再把它喂回去生成第二个词……如此反复来构造训练时的输入,这样做在计算效率上会有什么问题(提示:还能不能在一次前向传播里并行算出所有位置的损失)?
  3. “我 喜欢 吃 苹果"这个例子里,位置 2(预测"吃”)的计算,物理上到底有没有"看到"位置 3、4 的向量?结合第 11 讲因果掩码的机制,解释为什么"喂了整段话"和"能看到未来"不是一回事。
  4. 训练时并行、推理时串行——这个不对称性对"训练一个模型"和"用这个模型频繁回答很多用户的问题",哪一个的总耗时对"序列长度"更敏感?为什么(可以先凭直觉猜,第 21–24 讲会给出更完整的答案)?
  5. 第四节说"数据的分布决定了模型的性格,不是训练算法的偏差"——如果训练语料中 90% 是某一种语言的内容,你会预期这个模型处理其他语言时的表现会怎样?这和第 7 讲讲的"不同语言分词效率不均衡"是不是同一个"数据分布决定一切"的问题在两个不同环节的体现?