我第一次看到Grokking的训练曲线时,以为作者把图例画错了。橙色那条验证集准确率,在训练了二十万步之后,还是一条贴着零的直线。然后,在某个谁也说不清的瞬间,它突然跳到了100%。不是一步步爬上去的,是跳。就像你养了一年的花,天天浇水,毫无动静,某天早上起来,它已经开了。

Grokking这个词来自OpenAI 2022年的一篇论文,原意是Dungeons & Dragons里的“通晓”。那篇论文的标题叫《Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets》,你可以在 arXiv 上看到。作者让一个Transformer去学模加法,比如(a+b) mod 67。训练集是一部分数据,验证集是另一部分。模型先把训练集背得滚瓜烂熟,准确率100%,但在验证集上,它和瞎猜差不多。按照常规理解,这就是过拟合,应该停止训练。但作者没停,继续训练下去。就在训练集的loss已经低到不再变化的时候,验证集准确率突然开始飙升,直到100%。
这不是个例。它在置换、矩阵乘法等算法任务上都出现了。而且它有一个很有意思的名字——“突然学会”。你可能会问,为什么不是逐步学会?这正是最让人困惑的地方。
训练曲线骗了我们
普通训练里,验证集准确率通常和训练集一起上升。训练集学会多少,验证集就能跟着会多少。Grokking则完全不同。表格可能更直观:
| 阶段 | 普通训练 | Grokking |
|---|---|---|
| 训练集准确率 | 稳步上升 | 很快冲到100% |
| 验证集准确率 | 同步上升 | 长期在低位徘徊,突然跳升 |
| 训练loss | 持续下降 | 已经收敛,几乎不动 |
| 内部表示 | 渐进变化 | 表面不变,内部悄悄重组 |
这张表最关键的一行是最后一行:内部表示。我最早以为Grokking是某种优化上的运气,后来看到Nanda等人的工作,才知道这里藏着真正的机制。你在 Progress measures for grokking via mechanistic interpretability 这篇文章里可以看到,模型在训练前期,其实是在死记硬背每一个训练样本的答案。与此同时,它还在毫不知情地为一种通用的计算算法慢慢准备零件。当零件终于凑齐,模型会在一瞬间切换到新的算法上,记忆被整个抛弃。
它是怎么发生的:从记忆到算法
在模加法这个任务上,Nanda等人用可解释性工具解剖了模型的内部状态。他们发现,当Grokking发生时,模型的权重矩阵在傅里叶频谱上出现了非常清晰的峰。换句话说,模型实际上是把“模加法”变换成了频域里的某种旋转操作。这种表示需要全局信息——它不像记忆一个个训练样本那样,可以靠局部梯度逐个击破。所以训练过程会很长:模型必须先忍受在验证集上的无能,同时在内层面默默重组自己的表示。
这解释了为什么Grokking需要那么久。它不是“练得越多学得越多”,而是“积累到了一定临界值,突然切换”。这有点像水结成冰,温度降到零度以下并不马上结冰,需要等待一个扰动。对神经网络来说,那个扰动也许就是权重衰减带来的压强。
为什么Grokking对安全来说很麻烦
我一开始觉得,Grokking只是在玩具模型上的巧合,跟大模型没什么关系。后来我想通了一个问题,突然有点后背发凉:我们判断一个模型有没有学会,靠的是什么?靠的是验证集性能。如果Grokking存在,那么在你认为模型已经“训好”的位置,它可能只是还处于“背题”阶段。你保存下来的checkpoint,在验证集上表现很差,但如果你再训练十倍的时间,它可能变成一个完全不同的模型。
这意味着什么?意味着我们无法从当前检查点的行为,推断出继续训练后可能出现的能力。安全评估如果想基于“模型最终会变成什么样”来做,就变得极其困难。
具体来说,有三个层面:
早停可能停在“突变前夜”
产业界训练模型常用早停:验证集性能开始下降时停。这个策略假设性能曲线是单峰,但Grokking告诉我们,曲线可能是断崖式的。在断点之前,你看到的是毫无希望的垃圾模型;但断点之后,模型突然越想越强。你停在哪一个时刻,直接决定了你拿到的是“纯记忆”还是“真泛化”。
能力评估的时效性决定安全结论
如果模型的能力在训练后期突然出现,而我们在早期就停止评估,那么安全测试的结果会严重低估模型的真实能力。反过来,如果我们在某个检查点上发现模型还没有学会某项技能,并不代表它学不会,只是还没到时间。这给“模型能力上限”的推断带来了根本性的不确定性。
安全训练可能也会Grokking
我们训练模型遵守安全规则,也会经历类似的过程。也许模型在训练集上很快学会了规则,但把这些规则泛化到新场景需要更长的时间。这种情况下,有些看似“不听话”的模型,可能再训一段时间突然就“听话”了。但我更担心的反方向:如果一道安全规则本身就是捷径,模型会不会在后期突然泛化出另一种绕过它的方式?这至今没有答案,但Grokking至少提醒我们,训练过程中的后期质变是不可忽视的风险点。
安全评估可以怎么做
既然能力可能在后期突变,那么静态评估就远远不够。我自己会从这里面提炼出几条很务实的建议:
- 训练过程中保存多个checkpoint,不要只保留最后一步。
- 对每个checkpoint都跑安全测试,而不是只在最终模型上测试。
- 关注验证集性能长期停滞的区间,它可能是Grokking的潜伏期。
- 使用可解释性工具监测内部表示是否发生质变,而不是只依赖loss曲线。
怎么看待这件事
有一段时间,很多技术人对Grokking的解释是“权重衰减导致的”。但后续研究表明,权重衰减不是泛化的充分条件,它只是让模型更容易从记忆状态转向算法状态。真正的问题是:我们还没有一个可靠的方法,预测这次转向会在哪一步发生。你可以在 OpenAI的博客 里看到他们当时对这种现象的困惑,以及在 代码仓库 里看到他们使用的实验设置。
如果你想自己复现一次Grokking
用一个小Transformer,设置AdamW优化器,加上一个合适的权重衰减系数,在模加法任务上训练十万到几十万步。你会发现,验证集准确率会在某个临界点突然从接近0跳到接近1。这个实验现在在消费级GPU上就能跑,值得亲手试试。
对AI安全,我个人的判断很朴素:不要只盯着训练曲线的末尾看。如果你在做数据集的智能体评估,请保存多个不同阶段的checkpoint,并对每个阶段都做压力测试。有时候,风险不是来自那个一直学不会的模型,而是来自那个“看起来已经学会了,但还差一次Grokking就能能力翻盘”的模型。
几个常见的误解
- Grokking就是过拟合之后继续训练吗?
- 不是。普通情况下,过拟合后继续训练会进一步恶化泛化能力。Grokking的关键在于模型内部表示发生了相变,这不是简单的过拟合。
- Grokking只在小模型上出现吗?
- 目前被稳定复现的主要是算法任务和小模型。在大模型预训练中是否出现,学界还没定论。但它与大规模模型中观察到的“突现能力”之间存在一些相似之处。
- 如果我们理解了Grokking,就能预测它吗?
- 不能。现在已经有一些启发式指标,比如权重范数的变化,但还远不能可靠预测相变点。这也是可解释性研究的前沿。
最后说一句。Grokking让我感到的不是模型有多神奇,而是我们对模型内部已经发生的改变,知道得多么滞后。安全评估不应该只问“这个模型现在会什么”,还要问“它现在正走在通向什么的路上”。这个问题很难回答,但至少,从Grokking开始,我们知道了不能只看最终模型表面上的曲线。
这就是我对Grokking的思考。如果你也在做安全评估,我建议你把这条训练曲线贴在工位上,当作一个提醒:模型可能会在你以为它"不会"的时候,突然"会"了。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/684.html