0.1 后半程是什么:从会续写到会对话


0.1 后半程是什么:从会续写到会对话

本节摘要:本节用一个最小实验定义"后半程":把同一句提问分别喂给基座模型和对话模型,看它们给出的完全不同的两种命运——基座模型自顾自续写(甚至模仿提问者再编一个问题),对话模型停下并给出回答。这个差异不是"更多预训练"能带来的,而是 SFT 用指令数据重新校准了模型的行为目标。本节随后给出全书最重要的分工声明:预训练与分词器不重写,实战详见 《ht-gpt:从零搭建 GPT 训练与推理实战》、理论详见《Happy-LLM:从零训练大语言模型》,本教程从"你手上已有(或随手可得)一份基座权重"这一刻讲起。

学习目标

阅读完本节,你应当能够:

  1. 亲手复现 base 与 chat 模型对同一提示的行为差异(没有权重也能用 API/开源权重对照)。
  2. 用"下一词预测目标没变,训练分布变了"解释 SFT 为什么能改变行为。
  3. 说出本教程与 ht 体系其他教程的分工边界。
  4. 用"答完会不会自己停"这个单测快速判别任一模型是不是 chat 模型。

一、同一个问题的两种命运

对基座模型(如 nanochat 流水线第②阶段的产物,一个 124M 参数的小 GPT)输入:

你:中国最长的河流是哪一条?

典型输出(基座模型,示意):它会认真地续写这段文本,而不是回答你——

你:中国最长的河流是哪一条? 我:是长江。 你:那世界最高的山峰呢? 我:是珠穆朗玛峰。

看起来它"会"回答,但注意两点:第一,你只问了一次,它替你编造了后续整段对话;第二,如果你不手动打断,它会继续"你问我答"地写下去,永远不停。把同样的输入给对话模型(第③阶段 SFT 之后的产物),输出变成:

中国最长的河流是长江,全长约 6300 公里,发源于青藏高原,最终注入东海。<|endoftext|>

一句回答,一个终止符,停下。这就是后半程要制造的全部差异:从"概率上像的文本"变成"行为上对的回答"。

值得强调的是:两段输出用的是同一类模型、同一个目标函数——差异不在"会不会算概率",而在"把概率用在什么行为上"。这也是为什么本书的路线不是"继续预训练更多数据"(那只会得到更好的续写器),而是一条全新的工序:换数据、换格式、换验收标准。

💡 这个对比实验不需要训练任何东西:HuggingFace 上任何一对 base/chat 权重(如 GPT-2 与之对话微调过的社区版本)都能演示同样现象。

二、差异的三个具体表现

维度 基座模型 对话模型(SFT 后)
停止行为 不会主动停,续写到长度上限 学会说终止符,答完即停
角色边界 把"用户说的话"也当成要续写的文本 能区分 user/assistant 消息
指令遵循 "帮我写首诗"可能被当成一句要补全的句子 理解为任务并执行

第三条尤其关键:基座模型的训练目标是"给定前文,预测下一个词",它见过海量"接着写"的文本,从没见过"被要求做事"就要去做事的文本。SFT 的本质是换掉训练分布:用数万条"指令→合格回答"的对话样本继续做下一词预测——目标函数一个字没改,模型的行为却被彻底重定向了。这与《Happy-LLM:从零训练大语言模型》里对预训练目标的推导完全一致,此处不重复展开。

💡 基座回答"看起来很对"是一种幸存者错觉:因为提问后面通常跟着答案,续写统计确实倾向"先写答案"——但只要多问两轮,它就会开始编造你的下一句提问,或者把话题续到毫不相干的网页体文本上。判断一个模型是不是 chat 模型,最可靠的单测是:它答完会不会自己停

三、SFT 改了什么、没改什么

把"SFT 在中间做了什么"拆成一张精确的账:

维度 SFT 之前(基座) SFT 之后 SFT 动它了吗
目标函数 下一词预测交叉熵 同左 没动
架构层数/参数 与预训练结束时一致 同左(微调幅度小) 没动
训练数据 海量网页(FineWeb-Edu) 指令对话(数万条) 换了(唯一的变量)
行为 续写、不停、身份混乱 回答、会停、守身份 变化的结果

这张表回答初学者最常见的两个误会:其一,"SFT 是不是教模型新知识"——主要不是,知识绝大多数来自预训练,SFT 主要是释放与定向已有能力;其二,"SFT 之后模型变聪明了吗"——能力上限基本没变,变的是能力被调用的方式。这也解释了 1.1 节预告的现象:SFT 的 loss 从约 1.3 起步而不是从 10.4——它站在预训练的肩膀上,只学薄薄一层行为。

nanochat 把这条界画成了代码边界:官方对 SFT 数据的处理思路(发布帖 Discussion #1)是收集一批问答形式的对话,微调时只在回答 token 上计算 loss、对话之间用填充对齐,让模型把"能力"用在"扮演助手"上。具体的数据构造在第 2 章、损失掩码在第 3 章、对话格式在第 4 章逐一展开。

⚠️ nanochat 仓库高速演进:当前 master 已转向 GPT-2 speedrun 路线,脚本名与数据集都有变动(SFT 数据示例换用了 SmolTalk)。本书以 2025 年 10 月发布帖的四阶段流程为叙事主轴,接口细节以官方仓库 README 为准。

四、分工声明:这本书不做什么

本教程是 ht 体系的一环,边界如下(全书各章反复引用):

  1. 不重讲预训练:从数据管道到训练循环到 Gradio 演示的完整实战,详见 《ht-gpt:从零搭建 GPT 训练与推理实战》;Transformer 结构与训练理论的推导,详见 《Happy-LLM:从零训练大语言模型》。
  2. 不重讲分词器:BPE 的原理与训练详见上述两书;本书只在 1.2 节清点它的产物(词表文件),第 4 章讨论往词表里追加 special tokens。
  3. 不讲对齐训练:RLHF/DPO/GRPO 属于 SFT 之后的深水区,本书只留路标——详见 《深入理解 AI Agent:设计原理与工程实践》第 7 章后训练。
  4. 只做一件事:把"会续写的基座"变成"能对话、可部署、可中文化的 chat 模型",并让你理解途中每一步为什么存在。

本节要点回顾

  1. base 与 chat 的行为差异 = 停止行为 + 角色边界 + 指令遵循,可用现成权重直接演示;最可靠的单测是"答完会不会自己停"。
  2. SFT 不改目标函数,只换训练分布——下一词预测从"续写网页"重定向为"扮演助手";知识来自预训练,SFT 负责释放与定向。
  3. 分工:预训练/分词器归《ht-gpt:从零搭建 GPT 训练与推理实战》与《Happy-LLM:从零训练大语言模型》,对齐训练归《深入理解 AI Agent:设计原理与工程实践》第 7 章,本书负责后半程。
  4. 后半程的路线不是"更多预训练",而是换数据、换格式、换验收标准的三重工序。

概念清楚了,下一步是让机器就位——0.2 节解决"在哪跑、要多少显存"的问题。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U