先给结论:小网络在算法题上先背训练集、很久以后测试损失才突然变好,看起来像开窍,机制上更像三幕。第一幕背诵就能把训练损失打低;第二幕另一条可泛化的电路在后台慢慢长;第三幕泛化已经够用,正则开始删背诵,测试损失才断崖。跳变发生在清理,不发生在「突然学会」。
为什么训练曲线会骗过你:测试损失跳变前电路已经在了
痛点是把 grokking 当成神秘相变,于是只调数据量和正则,不拆电路。数据很少时,背诵更简单、更快碰到;数据多到背诵比通解还复杂,再加上正则惩罚复杂度,通解最终更划算,但通解未必先到。于是出现:训练已经很好、测试很差,过很久测试才跟上。若只看测试损失,会以为什么都没发生;看权重和中间激活,通解可能早就在长。
模块加法是最干净的例子。一层注意力加 MLP,最后学到的是把数字映成旋转、合成 a+b、再旋回去读出同余。这是线性代数里自然的解,不是人类竖式。用三角恒等式能从权重里读出步骤,也能在激活里读出中间量。一旦算法清楚,就可以定义进度:背诵有多强、通解有多强、噪声还剩多少。
四步把延迟泛化从玄学变成可盯的进度
- 不要只用训练/测试损失。至少再盯两个量:通解电路的强度、背诵电路的强度。损失跳变往往跟「背诵被删」对齐,不跟「通解第一次出现」对齐。
- 先逆向通解。能从权重读出步骤、从激活读出中间量,进度指标才不是拍脑袋。读不出来就先别解释 grokking。
- 对照数据量和正则。数据极少则永不泛化,数据很多则可能跳过背诵直接泛化。延迟泛化出现在中间带:背诵先到,通解更优但更慢。
- 清理阶段单独做消融。通解已经好、测试还差,优先查背诵残渣而不是再堆数据。把背诵相关方向或神经元拿掉,测试若立刻好,就是清理在主导跳变。
| 阶段 | 训练损失 | 测试损失 | 内部发生的事 |
|---|---|---|---|
| 背诵 | 很快变好 | 仍然差 | 记住训练对,通解几乎没有 |
| 成路 | 继续好 | 仍然差 | 通解在长,背诵噪声盖住测试表现 |
| 清理 | 略变或持平 | 突然变好 | 正则删背诵,通解露出水面 |
| 数据极多 | 一开始就好 | 一开始就好 | 可能跳过背诵,看不到延迟泛化 |
现场有三条不太写进推特摘要的细节。其一,成路阶段测试差,不一定是通解弱,而是弱背诵也会把训练集「算对」,梯度不急着删它。其二,进度曲线比损失曲线吵,要固定随机种子、固定评估子集,不然会把噪声当相变。其三,通解的坐标系往往不是十进制:模块加法是旋转和频率,硬用一位一位的探针会判「不可解释」。先换基,再谈清不清理。
这类现象对大模型未必逐字对应,但方法是通的:神秘的训练曲线,应该能被内部电路拆开。拆不开,就还没有解释;拆开了,就可以在跳变前干预——提前打压背诵,或提前加强通解——而不必干等到测试损失自己掉下来。
进度指标不要从损失反推。损失是混合物。通解强度应从「中间量是否出现、权重是否可读出步骤」来;背诵强度应从「打乱标签后训练准确率还在不在」或「只在训练集编号上点火的方向」来。两者分开,才能看到成路阶段:训练很好、测试很差、通解其实已经不弱。很多人在这一阶段加数据或提前停训,等于把清理那一幕砍掉,于是永远看不到悬崖,也永远解释不了为什么「再训很久会突然好」。
正则不是魔法开关。它只是让「更简单的通解」在长期竞争里胜出。权重衰减太弱,背诵可以一直住下;太强,通解还没长成就被一起罚。要调的是「通解出现之后还让不让背诵活着」,不是把正则开到模型什么都学不会。把这条写进训练日志:通解强度第一次超过阈值时,衰减是多少、测试损失还差多少。下次复现 grokking,先对齐这两个数,而不是只对齐最终准确率。
若只能加一个仪表:不要加更大的测试集。加一条通解强度。测试集更大,悬崖还是悬崖;通解强度能告诉你悬崖会不会来、大概何时来。训练到通解已经高、测试还差,就是该清理而不是该停训的窗口。错过这个窗口,再训很久才跳,会被当成玄学;抓住这个窗口, grokking 就变成工程。
结论:盯两条电路的强度,不要只等测试损失悬崖
延迟泛化是调度问题:谁先到、谁更简单、正则何时删谁。把通解和背诵分开度量,悬崖就变成可预期的清理。仍只看一张损失图,下一次还会被同一条悬崖吓到。
悬崖可以当庆祝,更该当清理完成的提示。对齐的是背诵下降,就去查正则和残渣;对齐的是通解上升,才是真学会。两条线不画,庆祝会庆祝错。
你下次再看到测试损失突然掉,先画出通解强度和背诵强度两条线,看悬崖对齐的是哪一条。
本文侧重全链路风控方法论。落地时请用自身业务单据做回放验证,不要把示例阈值直接当生产策略。 相关:风控体检 · 方案资源
常见问题 FAQ
为什么测试损失会在训练很久后突然下降(延迟泛化)?
这通常不是因为模型突然‘开窍’,而是内部两种电路竞争的结果。模型一开始学会了‘背诵’训练集(简单但泛化差的捷径),测试损失因此很差。与此同时,一条可泛化的‘通解’电路在后台慢慢生长。当正则化最终削弱了背诵电路时,通解电路才显露出来,测试损失就断崖式下降。所以,跳变发生在‘清理’阶段,而非学习初期。
如果我的模型训练损失很低,但测试损失很高,这意味着什么?
这很可能意味着模型正处于‘背诵阶段’。它学会了训练数据的特异性模式(甚至噪声),所以训练损失低,但无法泛化到新数据。关键在于,此时可泛化的通解电路可能已经开始形成,只是被背诵电路掩盖了。此时不应停止训练,而应关注如何帮助通解电路竞争胜出,比如调整正则化,而不是简单地增加数据。
有没有办法提前知道测试损失悬崖会不会出现、大概什么时候来?
有。文章建议不要只盯损失曲线,而要分开监控‘通解电路强度’和‘背诵电路强度’。当通解强度(例如,从权重中可读出清晰算法步骤)已经很高,但测试损失还差时,就是一个关键信号:说明系统已准备好进行清理,测试损失悬崖很可能在后续训练中出现。这比只等损失下降要提前得多。
延迟泛化(king)和‘突然开窍’有什么区别?
‘突然开窍’是一种错觉,源于只观察外部的测试损失曲线。延迟泛化则揭示了其内部机制:这不是一个从‘不会’到‘会’的瞬间相变,而是一个持续的过程,包括背诵电路占优、通解电路生长、最后正则清理背诵的三幕剧。前者是现象描述,后者是可拆解、可干预的电路调度问题。
具体如何分析模型内部的‘通解电路’和‘背诵电路’?
核心是‘逆向’和‘对照’。对于通解,尝试从权重矩阵中读出清晰的算法步骤(如模块加法中的旋转合成),或在中间激活值里找到对应的中间计算量。对于背诵,可以测试打乱训练集标签后,模型是否还对原训练样本点有特异性反应。需要结合固定种子和子集评估来稳定观察,并注意换到模型本身的坐标系(如旋转基)再解释。可以使用像龙虾PRO(OpenClaw)这样的分析工具辅助观察。
在工程实践中,理解延迟泛化机制有什么用?
它将神秘的‘开窍’变成了可管理的工程问题。一旦你能监控通解和背诵强度,就可以主动干预:在清理窗口期(通解已强、测试还差时),通过调整正则化或定向剪枝来加速背诵电路的消除,从而提前迎来测试损失的下降。这避免了无谓的等待和试错,让模型训练变得更具预测性和可控性。