想象一个备战数学竞赛的学生小林。他拿到一本习题册,花了整整一周把每道题的答案背得滚瓜烂熟——原题正确率100%,可一碰到变形题就全军覆没。他没有放弃,继续一遍遍刷题。某个深夜,他突然“开窍”了:那些看似杂乱的数字背后,竟然藏着统一的规律,从此新题也能迎刃而解。在深度学习领域,这种“突然开窍”的现象被称为Grokking:模型明明在训练集上早已过拟合,验证集准确率却长期停滞,直到某个时刻像被按下开关一样突然飙升。这背后隐藏着模型从“死记硬背”到“真正理解”的转变机制。本文将从实验现象、触发条件、延迟泛化、权重衰减、学习动力学和大模型启示六个方面,带你认识涌现能力家族中最神秘的成员。

岗位关联

理解Grokking,就是理解模型从“记忆”走向“理解”的临界点;对训练工程师而言,这是优化训练策略、避免盲目早停的底层直觉。

目录
  1. 可视化演示
  2. 实验现象
  3. 触发条件
  4. 延迟泛化
  5. 权重衰减
  6. 学习动力学
  7. 模型启示
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示模型复杂度与偏差、方差、总误差之间的关系,偏差随复杂度降低而方差升高,总误差呈U形曲线,拖动滑块调整复杂度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

偏差-方差权衡 偏差随复杂度增加而降低 方差随复杂度增加而升高 Error = Bias² + Variance + ε

实验现象

小林为了备战数学竞赛,拿到了一本习题册。他花了整整一周把每道题的答案都背了下来——原题正确率100%,可一碰到变形题就抓耳挠腮。奇怪的是,他没有停下,继续把习题册又刷了十几遍。就在某个普通的深夜,他突然感觉“开窍”了:那些眼花缭乱的数字背后,藏着一个统一的规律,从此新题也能迎刃而解。这就是“顿悟”的直观体验,也是我们要讲的核心现象。

在深度学习世界里,这种“突然开窍”真实存在,被称为Grokking。2022年,DeepMind团队在训练一个极小的模型做模加法(比如计算两个数的和再对11取余)时发现:模型在训练集上的准确率早就达到100%,看起来已经“背熟”了所有题目;但验证集上的准确率却一直在低位徘徊。如果继续训练下去,验证准确率会在某个时刻突然飙升到接近100%,仿佛模型“顿悟”了。

Grokking最直观的特征是“双阶段曲线”:第一阶段是快速的记忆阶段,训练损失急速下降,模型开始在训练集上过拟合——所谓过拟合,就是模型把训练数据“背”了下来,却没有学到可迁移的规律;第二阶段是漫长的静默期,训练损失几乎不变,验证指标却悄悄酝酿;第三阶段是爆发阶段,某个训练轮次(epoch)之后,验证指标以近乎垂直的姿态逼近最优值。实验还发现,这种现象与任务规模有关:当模型容量恰好“略大于”训练数据需求时,Grokking最容易被观察到。

就像小林背题时表现出“原题全会、新题全废”,模型在过拟合阶段也只是记住了训练数据里的输入输出对,并没有掌握背后的规律。Grokking的“开窍”不是突然多学了什么新知识,而是把已经塞进脑子的信息重新消化了一遍。

触发条件

不是所有学生都能像小林那样开窍。如果习题册只有三页,小林扫一眼就全背完了,根本不需要理解规律;如果习题册有三千页,他背不完,只能被迫去总结规律,反而可能“早熟”。Grokking也有类似的门槛条件,研究者总结出了四个关键变量。

第一,数据规模要适中。数据太少,模型轻易就能记住全部样本,没有动力去提取规律;数据太多,模型在训练初期就能自然地学到一般规律,也不会出现“过拟合后再顿悟”的戏剧性过程。第二,模型容量要“恰到好处”:模型太小,表达能力不足,连训练数据都记不住;模型太大,记性太好,会一直停留在“背答案”阶段不肯走出来。

第三,训练时间必须足够长。Grokking发生在过拟合之后,通常需要远超常规的轮次数——在DeepMind的实验中,这个数字可以达到数万甚至数十万步。第四,也是最重要的,必须配合适当的权重衰减。权重衰减是一种正则化技巧,它会在损失函数中加上对“大权重”的惩罚,相当于要求模型把解法的步骤写得尽量简洁。如果没有权重衰减,模型一旦过拟合就“躺平”在记忆解上,永远不会顿悟;有了它,模型才会在训练过程中不断“简化”内部解,最终涌现出泛化能力。

用数学竞赛的话说:习题册太薄,小林背完就考满分;习题册太厚,他一开始就得总结规律。而“权重衰减”就像是老师反复叮嘱的那句话——“不要死记步骤,把每类题的解法写到最简洁!”这句话逼着他在刷题中不断提炼本质。

延迟泛化

为什么开窍需要等那么久?小林背答案时,大脑里装的是一个个孤立的“题目—答案”对,像一本字典;而理解规律,需要把这些条目重新编织成一张可推理的网。从字典到网,这中间要经历漫长的重构,这就是“延迟泛化”的含义——泛化能力不是随着训练同步提升的,而是被延迟到了某个临界点之后。

在数学上,泛化能力的差距可以用泛化误差分解来理解。模型在测试集上的错误率 \(E_{\text{test}}\) 可以拆成训练集错误率 \(E_{\text{train}}\) 加上一个“泛化差距”Ω。Grokking的奇妙之处正在于:训练错误早已逼近零,但Ω一直很大,直到某个临界点才突然收缩。

研究还发现,延迟泛化背后有一个“先记忆后表征”的过程。模型在早期确实是在做查表式的记忆——把输入映射到具体输出。但训练并没有真正停止:在静默期,损失函数几乎没有变化,模型内部的表征却在持续重构,逐步把离散的记忆转化为连续、可插值的规律。这个过程类似物理中的“相变”:系统在临界点前看似稳定,一旦越过临界点,宏观性质急剧改变。

对小林来说,静默期就是他不断刷题但成绩不见起色的阶段。表面上没有进步,实际上大脑正把一个个孤立的题目按规律重新归类——等到归类完成,新题自然就有了解法。Grokking的“延迟”不是浪费时间,而是必要的酝酿期。

Etest≈Etrain+ΩE_{\text{test}} \approx E_{\text{train}} + \Omega
  1. E_test 项测试集上的错误率,即模型在“新题”上的失分比例。
    EtestE_{\text{test}}
  2. E_train 项训练集上的错误率,即模型在“原题”上的失分比例。
    EtrainE_{\text{train}}
  3. Ω 泛化差距从“背下原题”到“解出变式题”之间缺失的环节;Grokking 让这一项从高空骤降。
    Ω\Omega

权重衰减

是什么力量推动小林从“背题”走向“理解”?不是他更努力了,而是他换了一种答题规范:老师要求他用最少的步骤、最简洁的形式写出解法。这个要求无形中逼迫他删除一切冗余技巧,只保留最本质的部分。在神经网络训练中,这个“简洁性要求”就是权重衰减。

权重衰减也叫L2正则化,它在原始损失函数后面加一项权重的平方和。权重是模型的“解题步骤”,权重向量越长越复杂,对应的解法就越繁复。加了权重衰减后,模型的总损失变成:

在梯度下降过程中,权重衰减项会让权重向量持续向零收缩。那些对最终输出贡献不大的权重会逐渐消失,解空间的“有效体积”被压缩。Grokking论文指出:没有权重衰减时,模型解空间中存在无数“记忆解”,模型随便落在一个泛化能力差的解上就不动了;加了合适的权重衰减,这些记忆解被“压扁”,唯独泛化解(通常对应更简单的函数)留存下来。因此,权重衰减常被视为Grokking的“总开关”。

回到小林的例子:如果老师允许他写200行步骤解一道题,他完全可以无脑套用几十种特例方法,根本不需要理解原理;但如果老师规定每题最多写5行,他就不得不寻找最高抽象层次的解法——这正是权重衰减在做的事。它不直接告诉模型答案是什么,而是逼着模型用最少的“步骤”去覆盖最多的题目。

L(θ)=Ltask(θ)+λ∥θ∥2L(\theta) = L_{\text{task}}(\theta) + \lambda \|\theta\|^2
  1. L(θ) 总损失模型当前整体的“扣分”,由任务损失和简洁度惩罚共同构成。
    L(θ)L(\theta)
  2. L_task(θ) 任务损失答错题目的扣分,对应交叉熵等训练目标。
    Ltask(θ)L_{\text{task}}(\theta)
  3. λ 正则强度老师对“解法简洁”的严格程度,λ 越大,越不容忍冗余步骤。
    λ\lambda
  4. ‖θ‖² 复杂度惩罚所有权重平方之和,衡量模型解的“繁复程度”。
    ∥θ∥2\|\theta\|^2

学习动力学

顿悟的那一刻,小林脑子里发生了什么?如果把他的大脑活动扫描一下,会发现那些散落各处的题目记忆,突然被整合进了一张整齐的“规律地图”。这个从混乱到有序的过程,就是学习动力学研究的对象——它关注模型内部表征如何随训练时间演化。

研究者从“内部表征”的角度观察模型:在记忆阶段,模型的隐藏层激活模式呈现“点状”分布——每个训练样本对应一个独立的激活模式,彼此没有联系,就像小林脑中一条条孤立的题目记录;在巩固阶段,激活模式开始出现聚类和排序,相似的题目被归到一起;在顿悟阶段,激活模式呈现明显的周期性结构——在模加法任务中,这种周期结构恰好对应数学上的傅里叶基,说明模型找到了数据背后的循环规律。

衡量表征“复杂程度”的常用指标是有效维度。对权重矩阵做奇异值分解,得到一组奇异值 \(\sigma_i\),它们代表模型在多少个“独立通道”上存储信息:

有效维度越大,说明模型用越多的独立通道存储信息。Grokking发生后,有效维度显著下降——模型用更少的通道就能覆盖全部规律,这正是“简洁解”的数学证据。小林从“背了300道题的答案”到“掌握了3条核心规律”,信息量并没有减少,但组织方式从琐碎走向了简洁。

deff=(∑i=1nσi)2∑i=1nσi2d_{\text{eff}} = \frac{\left( \sum_{i=1}^{n} \sigma_i \right)^2}{\sum_{i=1}^{n} \sigma_i^2}
  1. σ_i 奇异值权重矩阵按重要度分解出的分量,就像解题套路的“强度”。
    σi\sigma_i
  2. 分子 (Σσ)²所有套路强度之和的平方,体现总信息量的上限。
    (∑i=1nσi)2\left( \sum_{i=1}^{n} \sigma_i \right)^2
  3. 分母 Σσ²各套路强度的平方和,体现信息在通道间的集中度。
    ∑i=1nσi2\sum_{i=1}^{n} \sigma_i^2
  4. d_eff 有效维度实际用到的“独立套路”数量;顿悟后该值下降,意味着用更少套路覆盖全部规律。
    deffd_{\text{eff}}

模型启示

小林的故事对“如何教出一个能举一反三的学生”很有启发。对AI从业者来说,Grokking现象不是实验室里的奇观,而是理解大模型泛化机制的一扇窗。它正在悄悄改变人们对训练策略、早停准则和数据配比的看法。

第一个启示是:过早停止训练可能扼杀“顿悟”。传统训练中,一旦验证指标不再上升就会早停;但Grokking告诉我们,验证指标可能长时间停滞之后才突然爆发。盲目早停可能让模型停留在“背题”状态,永远等不到理解规律的那一刻。如今一些大模型训练实践开始接受“平台期不是终点”的观念,在算力允许时多跑一段距离。

第二个启示是:权重衰减(或等效的隐式正则化)至关重要。现代大模型训练中广泛使用的AdamW优化器、梯度裁剪等技巧,恰好都带有压缩解空间的效应。Grokking让我们意识到,这些“细节设计”不只是为了防止过拟合,更是在主动引导模型寻找简洁、可泛化的解。第三个启示是:模型容量与数据规模的匹配度,决定了模型处于“记忆区”还是“泛化区”。这为数据配比和模型规模选择提供了新的思考角度——有时“加数据”不如“调正则”。

小林最终能在竞赛中拿奖,不是因为刷了更多题,而是因为“简洁规范”逼出了理解。大模型训练也类似:给模型足够的时间、恰当的正则化,它就能从数据中涌现出超越记忆的规律。Grokking提醒我们,模型的学习曲线不总是平滑上升的——那些看似停滞的瓶颈期,可能正是顿悟前最深的酝酿。

AI 应用场景

大模型训练超参调优

阶段:模型训练

解决的问题:训练中验证指标长期停滞时,工程师常陷入“早停还是继续”的两难。传统早停策略可能错过Grokking时刻。AI如何解决:利用Grokking的知识,在验证指标平台期继续训练,配合权重衰减观察延迟泛化是否出现,避免在“顿悟前夜”草率收工。

具体案例:某团队微调代码生成模型,前30,000步验证准确率几乎持平,按旧策略会直接早停。参考Grokking现象后,团队坚持训练到80,000步,验证准确率突然跃升12个百分点,代码生成的通过率显著提升。

数据规模与效率评估

阶段:数据准备

解决的问题:如何判断训练数据是否“足够”支撑泛化。数据过少时模型只会记忆,浪费训练算力;数据过多又成本高昂。AI如何解决:通过观察Grokking是否发生,反向评估当前数据规模是否处于“记忆区”,从而找到任务所需的最小数据量。

具体案例:在数学推理任务中,数据团队逐步增加训练样本量,用Grokkng现象作为“数据充足性”的判据:当验证准确率出现延迟跃升,说明该数据规模已足够触发泛化。最终节省了约30%的标注成本。

模型压缩与简化

阶段:模型部署

解决的问题:部署时希望模型尽可能小且泛化好。Grokking中权重衰减“压缩解空间”的机制,启发工程师在训练阶段就主动追求低秩、紧凑的表征,而不是等训练完成后再做剪枝。

具体案例:某推荐系统团队在训练阶段采用强权重衰减与长训练时长,替代训练后的结构剪枝。结果模型参数量减少约40%,在线推理速度提升,且离线AUC不降反升,因为训练中被“逼”出了更本质的规律。

Python 演示

python50 行
import torchimport torch.nn as nnimport numpy as np torch.manual_seed(0)p = 11                    # 模数:计算 (a + b) % ptrain_ratio = 0.6epochs = 2500weight_decay = 0.6hidden = 64 # 构造所有二元组并划分训练/测试pairs = [(a, b) for a in range(p) for b in range(p)]rng = np.random.RandomState(42)rng.shuffle(pairs)split = int(len(pairs) * train_ratio)train_pairs = pairs[:split]test_pairs = pairs[split:] def encode(pairs):    """将二元组转为 one-hot 输入与标签"""    x = torch.zeros(len(pairs), 2 * p)    y = torch.tensor([(a + b) % p for a, b in pairs])    for i, (a, b) in enumerate(pairs):        x[i, a] = 1.0        x[i, p + b] = 1.0    return x, y x_train, y_train = encode(train_pairs)x_test, y_test = encode(test_pairs) model = nn.Sequential(    nn.Linear(2 * p, hidden),    nn.ReLU(),    nn.Linear(hidden, p),)opt = torch.optim.Adam(model.parameters(), lr=1e-3, weight_decay=weight_decay)loss_fn = nn.CrossEntropyLoss() for epoch in range(epochs):    opt.zero_grad()    out = model(x_train)    loss = loss_fn(out, y_train)    loss.backward()    opt.step()    if epoch % 400 == 0 or epoch == epochs - 1:        train_acc = (out.argmax(1) == y_train).float().mean().item()        test_acc = (model(x_test).argmax(1) == y_test).float().mean().item()        print(f"epoch {epoch:4d} | loss {loss.item():5.3f} | "              f"train {train_acc:.3f} | test {test_acc:.3f}")
目的:在一个小规模模加法任务上训练三层MLP,观察训练准确率率先饱和、测试准确率延迟飙升的Grokking现象。
  1. pairs = [(a, b) for a in range(p) for b in range(p)]生成全部 \(p^2\) 个“习题”,即所有可能的加法组合。
  2. x[i, a] = 1.0` 与 `x[i, p + b] = 1.0将两个加数分别做 one-hot 编码拼接到输入向量中,相当于把题目翻译成模型能读的格式。
  3. model = nn.Sequential(...)搭建一个两层的“学生”,隐藏层64个神经元,容量恰好能记下训练集又需要“顿悟”才能泛化。
  4. opt = torch.optim.Adam(..., weight_decay=weight_decay)在优化器中加入权重衰减,这是触发 Grokking 的“总开关”。
  5. loss_fn(out, y_train)交叉熵损失,衡量模型答错题目的扣分。
  6. test_acc = (model(x_test).argmax(1) == y_test).float().mean()在“新题”上计算正确率,用它来判断模型是否真的理解了规律。

常见误区

误区Grokking只是小模型在模加法这类玩具任务上的奇观,大模型根本不会出现,离实际工作太远,了解个名词就够了。

正解Grokking揭示的是“记忆→重构→泛化”的学习动力学,与模型规模并无本质冲突。大模型中的“涌现能力”(如少样本学习)被认为是Grokking在大尺度上的类似表现。只是大模型训练成本高,验证曲线不如小任务清晰,难以在公开图表里直观呈现。理解Grokking能帮你建立对训练曲线“平台期”的正确预期,从而避免在真实训练中做出错误的早停决策。

为何常见:公开的Grokking研究大多在模加法、排列组合等小规模任务上完成,论文图表看起来“玩具感”很强,容易让人误以为这是实验室里的人工现象。

误区验证准确率不涨就说明模型在退化,早停是唯一正确的选择。Grokking只是特例,不值得为它改变训练习惯。

正解Grokking恰恰表明,过拟合之后模型内部可能还在继续重构。验证指标的平台期很可能是“顿悟前夜”。实践中不应机械执行早停,而应结合权重衰减设置和训练预算,观察更长时间的训练曲线。当然,这也不意味着所有平台期都值得等待——关键是要用正则化手段确保模型有“走向简洁解”的压力。

为何常见:传统机器学习理论强调验证集监控,早停是防止过拟合的标准手段,已在工程师心中形成惯性。

误区既然权重衰减是触发Grokking的关键,那正则化强度λ设得越大,模型顿悟得越快、泛化越好。

正解λ过大时,模型被“简洁要求”压到欠拟合——连训练数据都学不好,更谈不上泛化。Grokking需要λ落在一个合适区间:太小压不住记忆解,模型停在“背题”状态;太大又学不到规律,模型变成“什么都不学”。实际使用中,λ通常需要在小范围内扫描(如0.01到1.0),找到能触发顿悟的临界值。

为何常见:看到“权重衰减是关键开关”这一结论后,人们容易把“关键”误解为“越大越好”,忽略了正则化本质上是一种平衡。

误区多练就行,时间会带来顿悟。模型不泛化?接着训练就对了。

正解Grokking需要同时满足数据规模适中、模型容量匹配、权重衰减适当等多个条件。缺了任何关键条件,训练再久也只是过拟合。例如,训练数据过少时模型已经“背完”了所有样本,没有重构动力;模型容量过小时表达力不足,连记忆都做不到。时间只是必要条件,不是充分条件。

为何常见:媒体传播中常突出“坚持训练导致顿悟”的戏剧性,容易忽略论文中的严格实验条件和对照设置。

面试题

Q1. Grokking现象最准确的含义是?

单选题 · easy

  • A.模型瞬间忘记已学知识
  • B.过拟合后突然泛化提升← 正确答案
  • C.模型训练速度突然加快
  • D.验证损失先降后升现象

答案:B。Grokking指模型在训练集上已过拟合(记住原题)后,继续训练使验证集准确率突然飙升(理解新题)。A是遗忘,C是速度,D的损失走向与Grokking曲线不符,均不正确。

Q2. Grokking首次被系统研究的任务类型是?

单选题 · easy

  • A.大规模语言生成任务
  • B.图像分类的识别任务
  • C.模加法等算法任务← 正确答案
  • D.语音识别的转录任务

答案:C。DeepMind的Grokking论文主要在一个小MLP上研究模加法(modular addition)等算法任务,发现过拟合后验证准确率延迟跃升。其他选项是该现象被发现后人们联想到的应用领域。

Q3. 触发Grokking现象的关键超参数是?

单选题 · mid

  • A.学习率大小设置
  • B.批次大小的选择
  • C.权重衰减的强度← 正确答案
  • D.激活函数的类型

答案:C。权重衰减是Grokking的“总开关”:没有它,模型会停留在记忆解上;有了合适的强度,模型才会被逼向简洁的泛化解。学习率、批次、激活函数影响训练但并非触发Grokking的关键。

Q4. 下列哪些是Grokking现象的典型特征?

多选题 · mid

  • A.训练准确率率先饱和← 正确答案
  • B.验证准确率延迟提升← 正确答案
  • C.需要权重衰减配合← 正确答案
  • D.模型越深越易发生

答案:ABC。Grokking的典型过程是训练准确率先到100%,验证准确率长期低位后突然跃升,且权重衰减是不可或缺的开关。D没有证据支持,模型深度并非决定性因素。

Q5. 权重衰减在Grokking中扮演的角色是?

单选题 · mid

  • A.加速梯度下降的速度
  • B.压缩解空间促泛化← 正确答案
  • C.增加模型的参数量
  • D.减少训练所需的数据

答案:B。权重衰减通过对大权重施加惩罚,压缩解空间的“有效体积”,使记忆解失稳、简洁的泛化解留存。它不改变梯度速度、不增加参数、也不减少数据需求。

Q6. Grokking中“延迟泛化”的本质机制是?

单选题 · hard

  • A.模型逐渐遗忘训练数据
  • B.表征从记忆转向推理← 正确答案
  • C.梯度噪声的偶然作用
  • D.学习率衰减的副作用

答案:B。延迟泛化来源于模型内部表征的重构:先从查表式记忆出发,在静默期逐步将离散记忆转化为连续、可插值的规律(如傅里叶式周期表征),最终实现泛化。这不是遗忘、偶然噪声或学习率调度的结果。

Q7. 以下哪个比喻最适合解释Grokking?

单选题 · easy

  • A.学生背题后突然开窍← 正确答案
  • B.老师不断更换教材
  • C.考试题目越来越简单
  • D.学生放弃所有练习

答案:A。Grokking的典型过程就是“背下原题(过拟合)→ 继续刷题(继续训练)→ 突然理解规律(泛化跃升)”,与“学生背题后突然开窍”高度对应。其他比喻都缺少“先记忆后顿悟”的关键转折。

Q8. Grokking现象对大模型训练的启示包括?

多选题 · mid

  • A.训练时间足够长← 正确答案
  • B.合理运用权重衰减← 正确答案
  • C.盲目早停需谨慎← 正确答案
  • D.验证集决定一切

答案:ABC。Grokking表明验证指标的平台期可能是顿悟前夜,因此训练要留足时间、配合权重衰减、谨慎使用早停。D过度夸大验证集作用——验证集只是观测窗口,不是训练机制本身。

Q9. 关于Grokking中“相变”的说法正确的是?

单选题 · hard

  • A.训练损失突然下降
  • B.内部表征突现结构← 正确答案
  • C.模型参数突然归零
  • D.数据顺序突然改变

答案:B。Grokking的“相变”指模型内部表征在临界点前后从无序记忆变为有序规律(如周期性结构),宏观上体现为验证准确率突升。训练损失早已饱和,参数不会归零,数据顺序并未改变。

Q10. 下列哪些因素会影响Grokking的发生?

多选题 · mid

  • A.数据集的规模大小← 正确答案
  • B.模型容量的充裕度← 正确答案
  • C.权重衰减的强度高低← 正确答案
  • D.GPU型号的性能好坏

答案:ABC。数据规模决定模型是否处于“记忆区”,模型容量决定能否完成表征重构,权重衰减强度决定记忆解是否会被压制。GPU型号只影响训练速度,不改变学习动力学本身。