🌊 专注AI 大模型与前沿科技深度解析,习惯从工程师视角拆解技术热点,让我们一起在技术浪潮中保持清醒与好奇 🚀
修好的模型,为什么一继续训练就"翻脸"?——内禀-外源耦合入门
朋友阿哲最近在做一个课程项目:用 CLINC 语料给客服机器人训练意图分类器,类别一批一批地加(类增量学习)。加到第三批时,老类别的准确率掉了。他写了个脚本直接改分类头,把老类别的间隔(margin)拉回来,本地一测——完美。接着用 replay 继续训练了 32 步,修复效果全部蒸发,正确预测数和没修过一样。
他跑来问我:“是我修复脚本有 bug,还是 replay 有问题?”
答案是:这个问题本身就问错了。
30 秒结论
本文判断
- "修复模型"不是一次性事件,而是一个交互项:修复的价值 = 修复操作 × 之后的训练方式。同一个修复,接不同的后续训练,贡献可以从 +5 个正确预测变成 0,甚至变负。
- 必须分开三件事:此刻修不修得动(局部可容许)、修完接某种训练值不值(延续条件价值)、整个 pipeline 端到端好不好(完整策略性能)。
- 当前输出相同的两个模型,内部状态可能完全不同,未来走向也不同——别拿单点评估去外推。
适合谁:在做持续学习 / 微调 / 类增量实验的学生和转行者;想给作品集加一个"实验设计"亮点的人。
不适合谁:只想找即插即用防遗忘库的人。这里没有银弹,只有一套思考框架和一个可复现的实验方法。
关键证据
- 32 步更新的翻转:在 CLINC 类增量设置中,对分类头做一次"保护当前 logits、修复历史间隔"的写入,某种后续训练下贡献 +5 个正确预测;把后续训练换成 replay,同样的写入贡献归零。
- 耦合可以是负的:改用优化器原生的 SGDW 动力学跑 128 步,三个激活的数据划分(root)上,写入×训练的交互全部为负——修完再接这种训练,比不修还差。
- 不是某个配置的巧合:在输出蒸馏、RoBERTa 骨干网络下,同样观测到非零交互。
- 结论依赖评估指标:在交叉熵这个次要读出上,"引导分配"策略在全部五对对比中平均损失都低于标准 replay——同一批实验,换个读出,故事方向就变了。
展开说明
“现在看起来一样” ≠ “同一种状态”
先建立一个直觉:两个学生期末都考 85 分,一个靠刷题套路,一个真懂了原理,寒假补课时两人的进步曲线会天差地别。模型也一样——在当前这批数据上 logits 完全一致的所有参数状态,构成一个"纤维"(fiber)。站在这根纤维上,你有无数种修复方式,而它们对下一步训练的响应各不相同。这就是"当前观察不必决定对未来训练的响应"的含义。
内禀干预与外源延续
- 内禀干预(intrinsic):直接动手改参数。比如那次分类头写入:在有限维子空间里调整权重,约束是当前样本的 logits 不动(保护现在),目标是把历史类别的间隔拉回阈值以上(修复过去),并且用有限精度检查确认约束真的满足——float32 下"差不多"不算数。
- 外源延续(extrinsic):修完之后你怎么继续训练——replay、蒸馏、SGDW,这是外部环境。
耦合就是:两者的效果不能简单相加。测法是一张匹配的四格表:
# 四格对比:同一个修复 × 两种后续训练(同 checkpoint、同种子)fordo_writein[False,True]:forcontin["replay","finetune"]:m=load_checkpoint()# 同一根纤维上的起点ifdo_write:m=repair_head(m)# 内禀干预m=continue_train(m,cont,steps=32)# 外源延续R[(do_write,cont)]=evaluate(m)d_finetune=R[(True,"finetune")]-R[(False,"finetune")]# +5 的样子d_replay=R[(True,"replay")]-R[(False,"replay")]# 变成 0interaction=d_replay-d_finetune# 非零 = 耦合存在三层概念,别混
- 局部可容许:此刻这个修复在数值上做得到;
- 延续条件价值:修复 × 特定后续训练的组合价值(四格表测的就是它);
- 完整策略性能:端到端 pipeline 的最终成绩。
还有一个更深的坑:数学上"可行的修复区域"和"梯度训练实际能走到的区域"是两回事——理论存在 ≠ 训练可达。
落地建议(今天就能做)
- 给任何手动修模型的操作配 2×2 对照:改头、合权重、调 logits,都按"±修复 × 两种后续训练"跑四格,把交互项写进实验报告。这一个表格就能让作品集拉开档次。
- 至少用两种读出评估:正确数 / 准确率之外,加上交叉熵。耦合是读出特异的,单指标结论很脆。
- 同 checkpoint、同种子做匹配对比,并主动报告负交互——"修复+某训练方案反而更差"不是失败,是耦合存在的证据,比一句"提升了 x%"有信息量得多。
风险与反例
- 耦合 ≠ 协同:SGDW 下交互全负,别默认"双管齐下更好"。
- 根依赖:五个数据划分的对比里,效果是因根而异的,不是普遍受益。
- 机制归因要谨慎:内容控制实验能匹配甚至超过所提方法的增益——增益未必来自你以为的那个机制。
- 识别出耦合 ≠ 完整策略更优:三层概念里,后两层的结论不能互相代替。
- 有限精度陷阱:float32 下约束"看起来满足"可能并没满足,接受检查要显式写。
下次面试被问"灾难性遗忘怎么缓解",除了 replay、EWC、蒸馏,你可以补一句:"还要检验缓解手段和后续训练的交互——我做过四格对照,发现同一修复接 replay 和接普通微调,效果一个归零一个为正。"这句话,大多数人说不出来。