想微调一小部分,为什么模型会“连带变笨”?
很多人第一次微调大模型都会被一个现象吓到:你只是想教它一件很小的事——比如“某个术语必须按公司口径解释”,结果训练完它在别的题型上反而变差了,甚至一些原本答得挺稳的常识也开始飘。
这就是大家熟悉的灾难性遗忘(catastrophic forgetting):模型为了适应你新塞进去的那点数据分布,把原来学过的分布“挤掉”了。
更反直觉的是:你新数据明明很少,为什么影响会这么大?因为微调不是“改一行字”,而是在用梯度更新参数——哪怕只更新一小部分参数,也可能牵动很多输出位置的概率分布。
为什么传统 SFT 又贵又容易忘:两个根因
根因 1:监督太“整段化”,信息密度低但成本高
传统 SFT(Supervised Fine-Tuning)像写作文:每条样本你得提供“整段标准答案”。
但在很多任务里,你写出来的大段文字里,真正决定对错的可能只有几个 token:一个字段值、一个数字、一个实体名、或者一句转折是否遵守指令。为了这几个点去写整段,还要保证标注的正确性和多样性,标注成本自然爆炸。
根因 2:优化太“全局化”,局部改动会扩散成整体漂移
SFT 的训练目标是让模型在整段输出上更像你的答案。即使你只想改一个关键点,交叉熵损失函数却是覆盖整段答案,迫使模型朝着让标注答案概率为 1 的分布移动。
结果就是:你本来只是想“纠正一个说法”,最后变成“模型的整体语气、偏好、甚至知识调用路径都被改写”。
一个贴近直觉的比喻:
你只是想把方向盘调直一点,但训练过程像把底盘拆了重装——车确实直了,但别的地方开始异响。
一个更省钱的观察:答案的关键经常只在少数 token
很多场景下,答案是否正确取决于少数“决定性 token”:
- 结构化输出:JSON 里某个字段值对不对
- 事实记忆:实体名、年份、金额、比例等数字对不对
- 指令跟随:第一个偏离指令的转折点在哪
- 工具调用:第一个参数是否填错、函数名是否选错
换句话说:很多时候你不需要写“整段正确答案”,你只需要把模型在“第一个错误岔路口”拉回来。
于是就有了本文的标注思路:
只标注少数关键 token,把它们当作“锚点(anchors)”。
锚点标注是什么:像批改试卷,只改第一个错字
锚点标注可以被理解成一种“纠错式监督”,流程很简单:
- 给定输入 + 模型输出
- 标注者从头看,找到第一个错 token(错字/错词/错符号/错字段值)
- 只标注“这里应该是什么”
- 让模型从这个正确 token 往后继续生成;如果后面又错,再重复
它更像老师批改试卷:
不是给满分答案,而是指出“你从哪里开始写歪了”,并把它扶回正轨。
这种标注方式的价值在于:
- 信息更集中:每一个标注都落在“决定对错”的位置上
- 成本更低:不用写大量“其实无关紧要”的句子
- 对齐更直接:你在修的是模型的分支选择,而不是润色文风
从训练分布角度看,锚点标注天然更 on-policy:样本来自模型自己生成的输出轨迹,你只在它真实跑偏的地方打补丁。相反,传统 SFT 标注方式往往更 off-policy——你用“完美答案”替换了模型原本会生成的内容,模型在训练时需要记忆的内容更多,参数调整得更多,遗忘的能力也更多
只标锚点还不够:为什么用 SFT 训练锚点仍会遗忘?
这里有个关键的坑:
监督范围变小 ≠ 参数改动变小。
即使你只监督几个锚点 token,传统 SFT 的梯度更新机制仍会影响大量参数。为了提高整段答案中所有 token 的概率,模型内部可能需要调整很多表征与路径。结果就是:你虽然“只标了几个关键字”,但 SFT 训练过程为了拟合整段答案,可能改变了大量隐含的行为模式,导致其它位置的输出分布也跟着漂移。
于是出现这种尴尬局面:
- 模型确实在“努力学习”锚点 ✅
- 但“学习精力”被整段答案分散,模型整体“口味变了” ❌(灾难性遗忘仍然发生)
这正是 SFT 的局限:它只知道“让标注的地方变对”,但不知道"其它地方要保持不变"。所以核心问题不在"标注少",而在于:
你得明确告诉模型:除了这些锚点,其它地方请尽量保持原样。
Anchors + LwF:锚点用人工答案,其它位置用“教师答案”钉住
这就引出一个非常经典、也非常好理解的思想:Learning without Forgetting(LwF)。LwF的核心思想非常直观:
当你想教神经网络一个新任务时,不要让它"忘记"旧任务。具体做法是:
- 保留一个冻结的旧模型(reference model)作为"记忆锚点"
- 训练新模型时,除了用新任务的标注数据做监督,还要让新模型在旧任务的输入上尽量模仿旧模型的输出分布
- 通过知识蒸馏(Knowledge Distillation) 的方式,把旧模型的行为"蒸馏"到新模型里
将这种思想与锚点标注的方法结合就能得到本文中的训练方法,本文称之为 Learning Anchors without Forgetting(LAwF),它的训练目标可以拆成两部分:
- 锚点位置:用人工标注的正确 token 做强监督(交叉熵损失)
- 非锚点位置:用 KL 散度让新模型的输出分布逼近 reference model
数学上可以写成:
其中:
c_t 是置信度权重(非锚点处为 0,即完全模仿参考模型的分布;锚点处 1 表示完全用交叉熵的强约束,0~1 表示允许其它回答的弱约束)
\delta(x_t) 是人工标注处的 one-hot 向量
D_{KL} 是 KL 散度(让新模型模仿旧模型)
这相当于把训练目标拆成两种“监督源”:
- 人工监督:只用在你明确要修的关键点
- 旧模型教师监督:用来维持其它地方的行为不漂移
为什么它比 SFT 更不容易忘:从“全局重写”变成“局部打补丁”
用一句话解释差别:
SFT:你把整段答案都重写一遍,所以模型整体分布都被推走
LAwF:你只在关键岔路口打补丁,其它地方用 reference 钉住
所以它天然更像“局部修补”,而不是“全局重装”。
你要改的东西更聚焦,你不想改的东西也被明确保护起来。
由于 LAwF 方法更不容易遗忘,这带来了一个额外的优势:
你可以训练更多 epoch 直到收敛,从而确保模型真正掌握这些新知识。
在传统 SFT 中,训练 epoch 数往往需要小心控制——训练太久会加剧遗忘,导致模型在其他任务上的表现急剧下降。因此很多时候不得不在"学会新知识"和"不忘旧知识"之间做妥协,只能训练少量 epoch 就停下来。
但 Anchors + LwF 的情况不同:
- 由于非锚点位置被 reference model 约束住,遗忘风险大幅降低
- 你可以放心地训练更多轮次,让模型在锚点位置充分收敛
- 最终的学习效果往往比"只训练少量 epoch 的 SFT"更好——因为模型有足够时间真正内化这些关键知识点
换句话说:
不容易遗忘 → 可以训练到收敛 → 学习效果更扎实。
这使得 LAwF 在需要"确保模型牢固掌握特定知识"的场景下特别有价值。
还有一个直接的工程收益:因为非锚点位置被 reference “钉住”,这种方法对标注量的门槛也更低。最少只需要 1 条能复现问题的样本,标出一个或几个锚点 token,就可以启动一次微调。所需的算力成本也极低,只需使用计算卡微调几分钟,即可立竿见影地看到模型效果的提升。
参考模型怎么选:LoRA 场景反而更顺手
如果你用 LoRA 微调,这套思路通常更容易落地:
- base model 往往是冻结的(不动)
- 你训练的只是 LoRA 适配器(小增量)
那么冻结的 base model 就天然是 reference:
你允许 LoRA 在锚点附近做必要偏移,同时用 LwF 让多数位置别偏离 base。
工程上也省心:
通常不需要额外再存一份 reference checkpoint——base 本身就在那里,训练时使用的显存也很省
什么时候它特别有用?一个直观判断
如果你的“新知识”满足以下特征,Anchors + LwF 往往更划算:
- 你只想改少数关键点(术语解释、字段口径、某类固定事实)
- 你更在意不破坏原能力,而不是把模型彻底换风格
- 你不想为每条样本写“整段标准答案”,而是希望像“纠错”一样低成本迭代
- 你在 LoRA / 参数高效微调框架下做增量更新
相反,如果你的目标就是让模型整体换风格(比如全面改写语气、长文结构、强领域迁移),那“只打补丁”的方式就未必够,需要更强的全段监督或更系统的数据覆盖。
总结
本文介绍了一种更精准、更不容易遗忘的大模型微调方法:Learning Anchors without Forgetting(LAwF)。它的核心思想是:只在关键位置(锚点)用人工标注做强监督,而在其他位置用参考模型的输出分布来约束模型,防止不必要的漂移。
相比传统 SFT 需要为每条样本标注完整答案、且容易导致灾难性遗忘,LAwF 方法具有三大优势:标注成本更低(只需标注关键 token)、遗忘风险更小(非关键位置被 reference 锁定)、充分训练到收敛(不用担心过度训练破坏原能力)。这使得它特别适合那些"只想教会模型少数新知识,同时保持原有能力"的场景。