02. 指令微调的目标是什么?为什么它能改善对话效果?

整理指令微调的目标、行为校准机制与对话效果提升原因。

简单回答

指令微调的目标是让 base model 学会"理解指令并按预期格式回答",本质是把模型从一个文本续写器变成一个对话助手。它之所以能改善对话效果,是因为通过有监督的 instruction-output 对,让模型学会了什么时候该回答、怎么组织答案、什么时候该拒绝,而不是让模型学到了新知识。

详细解释

Base model 经过预训练之后,其实已经具备了很强的语言能力和丰富的知识储备,但它的行为模式是"给定前文,预测下一个 token"。你给它一个问题,它可能会把问题当成一篇文章的开头继续写下去,或者生成一个类似的问题,而不是给你一个回答。这就是所谓的"能力已有,但行为未对齐"。

指令微调做的事情就是用一批高质量的 (instruction, output) 数据对模型做监督学习,让模型建立起"看到指令→生成回答"的条件概率分布。从数学上看,训练目标还是最大化 output 部分的 log-likelihood,但因为数据格式变了,模型学到的行为模式也就变了。

为什么几万条甚至几千条 SFT 数据就能产生这么大的效果?这背后有一个很重要的认知:指令微调不是在教模型新能力,而是在做"行为校准"。模型的知识和能力在预训练阶段已经学到了,SFT 只是用少量数据告诉模型"应该用什么方式把这些能力表达出来"。这也解释了为什么 SFT 数据质量远比数量重要——几千条高质量、多样化的数据往往比几十万条低质量数据效果更好。LIMA 那篇论文("Less Is More for Alignment")就验证了这一点,用 1000 条精选数据就训出了不错的效果。

从工程角度看,指令微调还有几个关键细节。第一是数据的多样性,你需要覆盖足够多的任务类型(问答、摘要、翻译、代码、拒绝等),否则模型只会做训练数据里见过的任务类型。第二是 loss mask,只对 assistant 回复部分计算 loss,user 输入部分不参与梯度更新。第三是对话模板的一致性,不同模型有不同的 chat template(比如 ChatML、Llama 的 [INST] 格式),训练和推理时必须保持一致,否则效果会大打折扣。

指令微调和后续的 RLHF/DPO 的区别在于:SFT 教模型"怎么回答",对齐教模型"哪种回答更好"。SFT 是告诉模型正确答案长什么样,对齐是在多个候选答案之间教模型做偏好选择。

面试时可以这样答

指令微调的核心目标是把 base model 从一个文本续写器变成一个能理解指令、按格式回答的对话助手。

Base model 预训练完其实已经有很强的知识和语言能力了,但它的行为模式是续写文本,你问它问题它可能继续写问题而不是回答你。指令微调就是用一批 instruction-output 对做有监督训练,让模型建立"看到指令就生成回答"的行为模式。

之所以几千条数据就能有显著效果,是因为它不是在教新知识,而是在做行为校准——能力预训练已经有了,SFT 只是教模型用正确的方式表达出来。所以 SFT 数据质量远比数量重要,LIMA 那篇论文就证明了 1000 条精选数据就能训出不错效果。

工程上有几个容易踩坑的地方:一是 loss 只能对 output 部分算,instruction 部分要 mask 掉;二是 chat template 训练推理要一致,不一致的话效果会断崖下降;三是数据要覆盖足够多的任务类型,不然模型泛化能力很差。

和后面的 RLHF/DPO 的关系是:SFT 教"怎么回答",对齐教"哪种回答更好",两者解决的问题不同。

常见追问

  1. SFT 数据量到底需要多少?怎么判断够不够?
  2. SFT 数据质量怎么评估和把控?
  3. 如果 SFT 之后模型某些能力反而变差了,可能是什么原因?