Grokking:为什么模型先死记硬背,后来突然真懂了

用作业、考试、模运算和训练曲线递归拆解 Grokking:模型为什么会先过拟合,再延迟泛化,为什么看起来像相变,以及它和大模型涌现有什么关系。

先给一句人话版答案:

Grokking 是一种很反直觉的训练现象:模型一开始像是在死记硬背训练题,考试题完全不会;但继续训练很久之后,它突然像“开窍”一样,开始在没见过的题上也答对。

它最早让人震惊的地方就在这里:按普通直觉,模型已经把训练集背熟了,测试集还不会,那就叫过拟合,应该停了。但 Grokking 说:

有些情况下,模型过拟合之后继续训练,并不只是更严重地背答案;它可能在更慢地学出真正规则。

这篇不默认你知道机器学习。我们把复杂词一路拆到底:

  • 先讲训练集和测试集。
  • 再讲“死记硬背”和“真懂了”的区别。
  • 再讲准确率、损失、过拟合、泛化。
  • 再用一个小学生也能算的“取余数加法”例子解释 Grokking。
  • 最后再讲为什么它看起来像“相变”,以及它和大模型涌现有什么关系。

如果只想先抓主线,记住这句话:

Grokking = 训练表现早就满分,测试表现长期像随机猜,后来测试表现突然跳到接近满分。

先把“训练”和“考试”讲清楚

机器学习里的训练集和测试集,可以先理解成作业和考试。

训练集就是模型做过的题。 测试集就是模型没做过的新题。

如果一个学生把作业答案全背下来了,他在作业上当然满分。但你换几道同类型新题,他可能立刻不会。

这叫:

会背作业,不等于真会解题。

模型也是一样。

假设我们让模型学习一个规则:

输入两个数,输出它们相加后的结果。

训练集可能有这些题:

输入答案
1 + 23
2 + 35
4 + 15

测试集可能是这些没见过的题:

输入答案
3 + 36
5 + 27

如果模型只是背表,它可能只会训练集里的三道题。 如果模型学会了“加法规则”,它就能做没见过的新题。

这就是泛化。

泛化:不是记住答案,而是学会规则

泛化这个词很重要。先别想深。

泛化就是:在没见过的新题上也能做对。

背答案不是泛化。学规则才是泛化。

再换一个生活例子。

如果你背下来:

  • 北京到上海坐高铁大约 4 到 6 小时。
  • 北京到广州坐飞机大约 3 小时。
  • 上海到杭州坐高铁大约 1 小时。

这叫记忆。

但如果你理解了:

  • 距离越远,通常时间越长。
  • 高铁、飞机速度不同。
  • 出发和到达城市决定路线。

那你遇到“深圳到长沙大概要多久”时,即使没背过,也能估算。

这叫泛化。

机器学习最想要的不是训练集满分,而是泛化好。因为真实世界永远会给模型新题。

过拟合:作业满分,考试不会

过拟合就是模型太贴着训练集学,学到了训练集里的偶然细节,却没学到真正规律。

人话版:

模型把作业背熟了,但没学会解题方法。

过拟合有一个典型现象:

  • 训练集表现很好。
  • 测试集表现不好。

比如:

阶段训练题正确率测试题正确率
刚开始10%10%
学了一阵100%12%

这就很像死记硬背。作业全对,考试基本靠猜。

传统机器学习课会告诉你:看到这种情况要小心,可能该早停了。

早停就是提前停止训练。它的直觉是:继续训练可能只会让模型更死记硬背。

但 Grokking 让这件事变复杂了。

Grokking 的反直觉点

Grokking 的训练曲线大概长这样:

阶段训练正确率测试正确率看起来像什么
刚开始很低很低什么都不会
中期接近 100%很低背熟作业,但考试不会
很久以后接近 100%突然升到很高像突然真懂了

用图表示:

flowchart LR
  A["刚开始:训练和测试都差"] --> B["先背熟训练集"]
  B --> C["长时间测试集仍然差"]
  C --> D["突然泛化:测试集也变好"]

最奇怪的是中间那段。

模型已经会做训练题了,训练正确率已经很高了。按“答对题目”这个标准,它好像已经没什么可学了。

但如果继续训练,它内部还在变。

这就像一个学生:

  1. 先把题库答案背熟,所以作业满分。
  2. 继续刷很久,看起来没进步,因为考试还是不会。
  3. 某一刻,解题套路连起来了,考试成绩突然上去。

Grokking 这个词本身就有“深刻理解、突然领悟”的味道。放到机器学习里,它不是说模型有人的意识,而是说训练曲线上出现了这种“延迟开窍”的形状。

最小数学地基:准确率和损失不是一回事

理解 Grokking,必须先拆两个指标:

  • 准确率。
  • 损失。

准确率很好懂:答对多少题。

10 道题答对 8 道,准确率就是 80%。

但准确率有个缺点:它只看对错,不看信心。

比如两次都答对了:

  • 模型 A:觉得正确答案概率是 51%。
  • 模型 B:觉得正确答案概率是 99%。

准确率看起来一样,都是答对。 但模型 B 明显更有信心。

这时候就需要损失。

损失可以先理解成:

模型为自己的错误和不确定付出的罚分。

如果模型答错了,损失大。 如果模型答对但很不自信,损失也不够小。 如果模型答对而且很自信,损失才小。

所以出现一个重要现象:

训练准确率已经 100% 了,训练损失仍然可以继续下降。

这句话是 Grokking 的关键之一。

模型在训练集上已经全答对,并不代表训练已经“完全结束”。它还可以继续把正确答案的概率推高,继续改变内部表示,继续被正则化影响。

再拆“正则化”:别让模型用太复杂的作弊方法

Grokking 里经常出现一个词:正则化。

先别想公式。

正则化就是训练时给模型加一点约束,别让它用太复杂、太极端、太脆弱的方式解决问题。

最常见的一种正则化叫 weight decay,中文常译作权重衰减。

先拆“权重”:

权重就是模型内部可以调整的数字,也就是参数。

再拆“衰减”:

衰减就是让某些东西慢慢变小。

weight decay 的直觉是:

如果两个解法都能做对训练题,那就偏向参数更小、更朴素的那个。

这有点像考试。

一个学生可以用两种方式拿作业满分:

  1. 背下所有题和答案。
  2. 学会通用规则。

如果题目很多很杂,背答案可能需要非常复杂的记忆。学规则反而更简洁。

weight decay 有时就像在说:

别把脑子塞满一堆很大的特殊记忆,尽量找更省、更简单的表示。

这不是永远成立的万能解释,但它是理解很多 Grokking 实验的重要入口。

用一个小例子看 Grokking:模 7 加法

Grokking 最经典的实验之一,是让小 Transformer 学“模加法”。

“模加法”听起来难,其实就是取余数。

我们先拆“取余数”。

如果你算:

11÷711 \div 7

7 只能完整放进 11 一次,剩下 4。 所以 11 除以 7 的余数是 4。

写成数学符号:

11mod7=411 \bmod 7 = 4

这里的 mod\bmod 就是“取余数”。

所以“模 7 加法”就是:

两个数先相加,再看除以 7 余几。

比如:

(5+6)mod7=11mod7=4(5 + 6) \bmod 7 = 11 \bmod 7 = 4

再比如:

(3+4)mod7=7mod7=0(3 + 4) \bmod 7 = 7 \bmod 7 = 0

为什么研究者喜欢用这种任务?

因为它有一个清楚规则,而且所有题可以穷举出来。比如数字只在 0 到 6 之间,那么一共有 7×7=497 \times 7 = 49 道题。

你可以拿其中一部分当训练集,剩下当测试集。

于是模型有两种路:

  1. 记忆路线:把见过的输入输出背下来。
  2. 规则路线:学会“绕着 7 个数字组成的圈做加法”。

如果走记忆路线,训练集很快满分,测试集仍然差。 如果走规则路线,没见过的题也能答对。

Grokking 的神奇点是:模型先走了很像记忆的路线,后来又慢慢转向规则路线。

为什么它不是“突然从 0 学到 100”

肉眼看测试准确率,Grokking 像是突然发生的。

但后来的机制解释工作给了一个更细的画面:突然变化的背后,可能有一些连续进展。

先拆“机制解释”。

机制解释就是不只看模型输入输出,还想打开模型内部,看看它到底用什么步骤算出答案。

这有点像你看学生解题:

  • 只看答案:你知道他答对了。
  • 看草稿纸:你知道他是背的,还是按规则推的。

Neel Nanda 等人的工作研究了小 Transformer 在模加法任务上的 Grokking。他们发现,模型学到的可泛化算法和圆、正弦、余弦、傅里叶结构有关。

这句话很硬,我们小白版不用深入傅里叶。先抓直觉:

模型不是只背“3+4=0、5+6=4”这些表项,而是慢慢形成了一套可以绕圈做加法的内部结构。

他们把训练过程分成类似三段:

  1. 记忆阶段:先把训练题记住。
  2. 电路形成阶段:内部慢慢长出能泛化的算法结构。
  3. 清理阶段:正则化逐渐清掉记忆成分,让泛化结构主导输出。

这里的“电路”不是电子电路,而是模型内部一组配合完成某个功能的神经元、注意力头和权重连接。

所以 Grokking 看起来像突然开窍,不一定代表内部真的完全突然。更可能是:

内部进展一直在发生,只是外部指标在某个门槛前看不出来;一旦跨过门槛,测试准确率就突然跳上去。

这和人学东西很像。

你学一个概念时,可能前面几天都像没懂。但大脑里其实在积累碎片:一个例子、一个图像、一个公式、一句解释。某天这些碎片连起来,外部表现就像“突然懂了”。

“相变”是什么意思

截图里有一个关键词:相变。

相变最常见的例子是水变冰。

水温从 10 度降到 5 度,再降到 1 度,看起来还是水。 到了 0 度附近,状态突然变了,开始结冰。

这叫相变。

注意两个层次:

  • 温度变化是连续的。
  • 物质状态变化看起来是突然的。

Grokking 里的“相变”也是类似比喻:

  • 模型内部的某些结构可能在连续变化。
  • 测试准确率这个外部指标可能突然跳变。

为什么指标会突然?

因为很多任务有门槛效应。

假设模型要做一道题,需要三块能力同时到位:

  1. 能识别输入里的两个数。
  2. 能在内部表示“绕圈”。
  3. 能把结果读出来。

前两块都学到 80%,第三块没连上,题还是错。 三块终于连上,答案突然大量变对。

这就像造桥。

桥修到 90%,车还是过不去。 桥修到 100%,车突然能过了。

所以“突然”不一定表示没有过程。它可能只是因为我们看的指标太粗。

“训练动力学”是什么意思

截图里还有一个词:训练动力学。

先拆“动力学”。

动力学不是玄学,它关心的是:

一个系统如何随时间变化。

训练动力学就是:

模型在训练过程中,参数、损失、准确率、内部表示如何一步步变化。

普通看法只问:

最后模型准不准?

训练动力学会问:

它是怎么变准的?先学了什么?后学了什么?为什么卡住很久?为什么后来突然跳?

Grokking 重要,不只是因为它有趣,而是因为它提醒我们:

看最终结果不够,看训练过程也很重要。

同样是最后测试集满分,两个模型可能走了完全不同的路:

  • 一个一开始就学规则。
  • 一个先背题,后来才学规则。
  • 一个一直背题,只是测试集太像训练集,所以看起来也还行。

如果只看最终准确率,这三者可能分不清。

为什么继续训练可能有用

前面说过,训练准确率 100% 之后,损失还可以继续下降。

现在再深入一点。

模型在训练集上全答对后,仍然可能存在很多不同的“全答对解法”:

  1. 复杂记忆解法:训练题都记住,但测试题不会。
  2. 简洁规则解法:学会真正规律,测试题也会。
  3. 混合解法:一部分靠背,一部分靠规则。

训练不是只在“会不会答对”这个维度上移动。它还在参数空间里继续移动。

先拆“参数空间”。

模型有很多参数。每一组参数就是一个位置。参数空间就是所有可能参数位置组成的巨大空间。

如果模型有两个参数,你可以把参数空间想成一张平面地图。 如果模型有几百亿个参数,就画不出来,但数学上仍然可以理解成一个超高维地图。

训练就是模型在这张地图上走。

即使训练准确率已经满分,模型也可能还在从一个“复杂记忆位置”慢慢走向一个“简洁规则位置”。

weight decay 等正则化会持续施加力量,把模型往某些更简单的区域推。这个过程可能很慢,所以测试集迟迟没有变化。等可泛化结构终于压过记忆结构,测试准确率就跳起来。

为什么小数据更容易看到 Grokking

原始 Grokking 论文里有一个关键观察:较小的数据集可能需要更多优化步骤才能泛化。

这也符合直觉。

如果训练题太少,背下来很容易。模型很快可以用记忆路线拿训练集满分。

但题少也意味着规则信号弱。模型要从少量例子里推出背后的规则,需要更久。

用学生类比:

  • 老师只给你 5 道例题,你很容易背答案,但不容易总结规律。
  • 老师给你 500 道覆盖充分的例题,规律反而更容易显出来。

所以小数据场景下,模型可能更容易先走向记忆解法,然后需要更长时间才走到规则解法。

这也是 Grokking 不应该被简单理解成:

多训练就一定更好。

更准确是:

在某些任务、数据规模、模型容量、优化器和正则化条件下,继续训练可能让模型从记忆解法转向泛化解法。

条件很重要。

Omnigrok:Grokking 不只在玩具算法里吗

原始 Grokking 现象主要来自小型算法任务,比如模加法。

后来有一篇叫 Omnigrok 的工作尝试把视角扩展到算法数据之外。它从损失景观和权重范数角度解释 Grokking,并展示可以在图像、语言、分子等任务上诱导类似现象。

先拆两个词。

损失景观

把每组参数对应的损失值想成一张地形图,高处损失大,低处损失小。

权重范数

粗略理解成模型参数整体有多大。

Omnigrok 的一个直觉是:训练损失和测试损失可能喜欢不同的参数规模。模型沿着训练方向移动时,可能先进入训练集很好但测试集不好的区域,后来在正则化等力量影响下,走到测试集也好的区域。

这不是 Grokking 的最终统一答案,但它扩大了讨论范围:Grokking 不是只能在“模加法玩具题”里讲故事,它可能反映了更一般的训练现象。

2025 的数值稳定性视角:这事还没完全定论

到这里还有一个重要提醒:

Grokking 的机制不是已经被一句话彻底解决了。

2025 年有工作从数值稳定性角度继续研究 Grokking。他们关注 softmax、logits、浮点误差和一种叫 naive loss minimization 的方向。

这些词比较硬,我们拆最必要的。

logits

模型在变成概率之前的原始分数。

比如模型给三个答案打分:

答案原始分数
A10
B2
C-1

这些原始分数还不是概率。

softmax

把原始分数变成概率的一种函数。

分数越高,概率越大。

浮点误差

计算机存小数不是无限精确的,极端数字可能带来误差。

这类研究提醒我们:训练曲线里的“延迟泛化”可能和优化方向、正则化、数值稳定性都有关系。不同任务和设置下,主因不一定完全一样。

所以本文不会给出“Grokking 唯一机制就是 X”的结论。更稳妥的说法是:

Grokking 是一个现象;它背后可能有多种机制。记忆与规则竞争、正则化、表示形成、损失景观、数值稳定性,都可能参与解释。

它和大模型涌现有什么关系

现在终于接到大模型。

大模型里常说“涌现能力”:模型小的时候不会,规模变大或训练变久后,某些能力突然出现。

Grokking 和涌现有相似之处:

  • 外部指标看起来突然跳变。
  • 内部可能有更平滑的积累过程。
  • 某个能力可能需要多个子结构同时到位。
  • 只看最终指标,容易误判训练过程中发生了什么。

但也要谨慎。

Grokking 经典实验是小模型、小数据、算法任务。 大语言模型是巨大模型、巨大数据、复杂任务。

所以不能直接说:

GPT 的所有涌现能力都是 Grokking。

这太粗暴。

更好的连接是:

Grokking 给了我们一个可研究的小窗口:所谓“突然出现”的能力,可能背后有连续的内部进展;只是我们平时看的指标太粗,直到跨过门槛才显出来。

这对理解大模型很有启发。

比如一个模型做多步推理,可能需要:

  1. 读懂题目。
  2. 抽出变量。
  3. 选择公式。
  4. 做中间计算。
  5. 输出格式正确。

前四步都在变好,但第五步不稳,最终答案还是错。 等第五步也稳了,测试分数可能突然跳。

外面看像“突然会推理了”。 里面可能是很多小部件逐渐对齐。

它和人类“突然开窍”像不像

像,但只能当类比,不能当证明。

人学东西时,经常有这种体验:

  • 刚开始完全不会。
  • 刷了很多题,像是在机械模仿。
  • 很久没明显进步。
  • 某一天突然理解了,“原来是这么回事”。

Grokking 给这个体验提供了一个机器学习版本的画面:

外部表现可能长时间不变,但内部结构可能一直在重组。

这也是为什么学习时“没有立刻提高”不一定等于没学进去。你可能还在电路形成阶段。

但别过度类比。

人有动机、注意力、记忆策略、语言理解、元认知。神经网络训练则是参数、梯度、损失、优化器。两者不能简单画等号。

可复用的启发是:

有些理解需要多个碎片连成结构;结构没连上前,看起来像没进步。

Grokking 对学习 AI 有什么用

我觉得 Grokking 至少给初学者三个很重要的观念。

第一,训练集好不代表真会

这就是泛化问题。模型在见过的数据上表现好,只能说明它会处理见过的数据。真正要看的是没见过的数据。

第二,外部指标突然,不代表内部没有过程

测试准确率可能突然跳,但内部表示、进度指标、子电路可能早就在慢慢变化。

第三,过拟合之后不一定只有坏事,但也不能盲目多训

Grokking 告诉我们,在某些条件下,过拟合之后继续训练可能泛化。但这不等于所有训练都该无限继续。任务、数据、模型、正则化、优化器都会影响结果。

用一句话重新解释截图

截图里那几句话可以这样翻译:

Grokking 研究的是模型训练中的延迟泛化:模型先用记忆路线解决训练集,所以像死记硬背;继续训练很久后,内部可泛化结构逐渐形成并压过记忆成分,测试表现突然跳升,所以外面看起来像“真懂了”。这个跳升像相变,但背后可能有连续的训练动力学过程。

如果再压缩成一句:

Grokking 不是“模型突然有灵魂了”,而是“泛化结构晚于记忆结构被训练出来,并在某个门槛后突然显现在测试指标上”。

小白自测

1. Grokking 是什么?

模型先把训练集学到接近满分,但测试集长期很差;继续训练很久后,测试集表现突然大幅提升。

2. 它为什么反直觉?

因为传统直觉认为训练集满分、测试集不好就是过拟合,继续训练只会更糟。但 Grokking 里继续训练可能带来延迟泛化。

3. 泛化和记忆有什么区别?

记忆是见过的题会做。泛化是没见过的新题也会做。

4. 为什么训练准确率 100% 后模型还在变?

因为准确率只看对错,损失还会继续看信心和参数状态。模型内部表示、权重规模、记忆成分和规则成分都可能继续变化。

5. 相变是不是说明模型真的一瞬间学会?

不一定。外部指标可能突然跳,但内部可能已经连续积累很久,只是没跨过能让测试题大量答对的门槛。

6. Grokking 能直接解释所有大模型涌现吗?

不能直接画等号。它主要来自可控的小模型实验,但它提供了一个重要启发:看起来突然的能力,背后可能有连续的内部进展。

参考与继续读

最后只记一件事:

Grokking 让我们看到:模型“会背”和“会规律”可以是两条不同路线,而真正的泛化有时会在很长的沉默训练之后才显出来。