SFT 的灾难性遗忘:为什么会忘、怎么防
摘要
灾难性遗忘(catastrophic forgetting)原指持续学习里”学新任务、忘旧任务”的现象。搬到 LLM 的 SFT 语境:模型在指令数据上微调后,微调数据覆盖不到的旧能力明显退化——常识问答、代码、多语言、数学推理等。本文先对齐概念,再拆解遗忘发生的三个机制,然后对照四条防线(数据混合、正则与冻结、权重插值、先续训后微调),最后给出一张决策清单。
0. 先对齐概念:什么算”灾难性遗忘”
注意定义里两个容易误会的点:第一,遗忘不要求旧能力”归零”,明显下降就算;第二,它是相对微调前的退化,不是绝对水平低——一个微调前代码很强、微调后变平庸的模型,同样在”遗忘”。
场景例子:你在十万条指令数据上微调了一个通用模型,指令跟随评测涨了 15 个点,皆大欢喜。上线后用户反馈却很奇怪:“它现在很听话,但变笨了”——写代码开始犯低级错误,法语回答里混着英语,常识题答非所问。这就是遗忘的典型画像:新能力涨,旧能力漏。
大白话:预训练让模型长成一棵大树,SFT 是把树冠修成特定形状。修剪本身没错,但剪得太急太狠,会伤到树干输送养分的能力。
可以把它记成:预训练是”长”,SFT 是”削”;削得好是整形,削过头是伤根。
Luo et al. 的实证研究确认这不是个例:LLM 在微调中确实遭受灾难性遗忘,而且规模越大遗忘越明显——同系列里 7B 比 1B 忘得更厉害。这个反直觉的结论值得记住:模型越大,越不能拿”它底子厚”当挡箭牌。
1. 为什么会忘:三个机制
要点:遗忘是三件事的合力——数据分布从”全世界”收窄到”一个小领域”;梯度只朝指令数据的方向拉参数,没有任何力量往回拉;在窄分布上训得越久,越容易从”学能力”滑向”背答案”。
1.1 数据分布收窄:没梯度看管的区域会漂移
预训练在万亿级、来源极广的语料上做,每个能力区域都有梯度”看管”。SFT 阶段模型只看几十万条指令-回答对:领域窄、格式统一、语气一致。损失只在窄带上被压低,窄带以外的概率质量没有任何约束,随时间慢慢漂移。
预训练:████████████████████████████████ 广分布,处处有梯度看管
SFT: ░░░░░░░░░██████████░░░░░░░░░░░░ 只有中间窄带在降损失
↑
其余区域无人看管 → 能力悄悄漂移
1.2 优化漂移:目标函数本身就是”偏”的
SFT 优化的只是指令跟随这一个目标,旧能力是没人算账的隐性成本:
式 (1) 右边把旧能力显式写回目标——这正是 §2.1 数据混合在做的事。如果只按左边训,学习率越大、epoch 越多,参数离预训练最优点就越远。
可以把它记成:预训练最优点像山脊上的一颗珠子,SFT 的每一步梯度都在把珠子往山坡下推——而式 (1) 的左边没有任何力量把它推回来。
1.3 窄分布过拟合:从”学能力”滑向”背答案”
窄数据上训过头之后,损失的继续下降主要来自记忆:训练集里的问法对答如流,换个说法就掉链子。而记忆挤占的,正是预训练能力所在的参数容量——参数被反复改写,旧能力受损。
大白话:在同一张考卷上反复刷题,刷到后面考的是”背题”而不是”解题”——解题能力反而因为参数被改写而退化。
三个机制叠在一起,解释了那句经验之谈”训得越狠、忘得越多”:分布越窄、步数越多、过拟合越深,三者互相加强。
2. 四条防线
要点:防线按”改数据 / 改训练 / 改参数 / 改路线”四条展开——数据侧把旧分布混回来(§2.1);正则侧限制参数别走太远(§2.2);参数侧事后把权重插值回来(§2.3);策略侧先续训再微调,或干脆不做权重更新(§2.4)。
2.1 数据侧:Replay 与数据混合
思路直接来自式 (1):与其让旧能力”没人管”,不如显式把旧分布混进 SFT 数据。做法:在指令数据里掺入一定比例的高质量预训练数据——代码、多语言、通用问答。旧分布的梯度重新入场,漂移自然被按住。
实证支撑来自 Code Llama:它的指令微调数据里除了指令对,还混入了约 6% 的代码数据和 2% 的自然语言数据(论文里称 rehearsal,即”排练”),在学会指令跟随的同时保住代码与通用能力。
两个注意点:掺入比例要小(几个百分点级别),来源要挑高质量子集——比例过大或数据太杂,会反过来拉低指令跟随。
2.2 正则侧:让参数别走太远
四档手段,强度从弱到强:
- 小学习率 + 少 epoch:最便宜的第一道防线。遗忘与训练强度正相关,多数指令微调配方 1~3 个 epoch 就到顶了,再多训往往只换来过拟合。
- 参数冻结 / LoRA:只训练低秩旁路,主干权重原地不动。遗忘的本质是参数漂移,LoRA 从结构上把”能漂移的参数量”限制到极小——这是它除了省显存之外的第二重价值。
- KL 正则:在损失里加一项 ,直接惩罚”输出分布离微调前太远”。这与强化学习阶段常用的 KL 约束同源,都是”别走太远”的显式表达。
- 权重衰减:把参数持续往原点拉,间接限制漂移幅度。
可以把它记成:预训练模型是一幅名画,SFT 是修补。小学习率是细笔,LoRA 是只动颜料不动画布,KL 正则是把原画挂在旁边随时对照——都在防止越改越走样。
2.3 参数侧:权重插值(WISE-FT)
最简单也最容易被低估的一招,而且零训练成本:SFT 完成后,把微调权重 和预训练权重 线性插值:
式 (2) 的含义: 是纯微调模型, 是纯预训练模型,中间是两者的折中。WISE-FT 发现微调引入的相当一部分参数变化是”可逆的线性偏移”——插值能在保住新任务性能的同时,大幅恢复微调中丢掉的鲁棒性。对 LoRA 同样适用:把旁路加回主干后再插值。
大白话:微调把参数从 A 点带到 B 点,但”走到一半”往往最划算——新能力拿到大半,旧能力丢得不多。
注意 要在验证集上扫一遍(依任务常落在 0.3~0.7 附近),并且它不能替代 §2.1、§2.2 的预防——插值是补救,不是预防。
2.4 策略侧:先续训再微调,或干脆不微调
- CPT → SFT 两段式:如果目标领域明确(比如代码),先做一轮领域 continue pretraining,让模型”搬家”到目标分布上,再在指令数据上 SFT。此时 SFT 相对于”新家”是温和的扰动,遗忘自然减轻。Code Llama 正是这条流水线:基础模型 → 代码续训(含填空与长上下文)→ 指令微调。
- 不做 SFT,走 in-context learning:Unlocking Spell 表明 base 模型配合少量上下文示例就能达到不错的对齐效果。不做任何权重更新,就从根本上没有遗忘问题——代价是对齐效果和可控性通常不如微调,且每次推理都要带示例,长上下文成本更高。
3. 怎么选:一张对照表
| 方法 | 防遗忘原理 | 主要代价 | 适用场景 |
|---|---|---|---|
| 数据混合 | 旧分布梯度回灌 | 需要高质量预训练子集 | 通用指令模型,最优先考虑 |
| 小 lr / 少 epoch | 限制漂移幅度 | 新任务可能欠拟合 | 默认第一道防线 |
| LoRA / 冻结 | 限制可动参数 | 新能力上限略低 | 领域 SFT、低成本微调 |
| KL 正则 | 显式惩罚分布漂移 | 多一个超参 | 旧能力是硬指标时 |
| 权重插值 | 事后线性折中 | 需扫 α,属补救 | 发现遗忘后零成本抢救 |
实操 checklist:
- 训练前:备好可混入的高质量预训练子集,并定好旧能力评测集——遗忘是静默发生的,不测就不知道
- 训练中:小学习率起步,epoch 控制在 1~3;能 LoRA 就 LoRA
- 训练后:每次 SFT 后必跑旧能力评测(代码 / 常识 / 多语言各一小份);掉得明显就先试权重插值(§2.3)
- 规划期:领域专用模型优先走”先 CPT 再 SFT”两段式
4. 结论
灾难性遗忘不是玄学,是”分布收窄 + 梯度漂移 + 窄域过拟合”三件事的合力,对应四条各管一头的防线。工程上的建议顺序:先默认少训、慢训,再上数据混合;旧能力是硬指标时加 KL 或换 LoRA;事后发现遗忘用权重插值抢救;从零规划领域模型时,先续训再微调。最后记住那条反直觉的实证结论:模型越大忘得越多——越大的模型,越值得认真设计 SFT 方案。
参考文献
- Luo et al. An Empirical Study of Catastrophic Forgetting in Large Language Models During Continual Fine-tuning. arXiv:2308.08747.
- Rozière et al. Code Llama: Open Foundation Models for Code. arXiv:2308.12950.
- Wortsman et al. Robust fine-tuning of zero-shot models. arXiv:2109.01903.
- Hu et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685.
- Lin et al. The Unlocking Spell on Base LLMs: Rethinking Alignment via In-Context Learning. arXiv:2312.01552.