Grokking
顿悟现象(Grokking)指延迟泛化:网络早期就能拟合训练集,但经过许多训练步骤后,验证准确率才会从随机猜测水平跃升至接近完美。
Grokking 是一种延迟泛化现象:神经网络早早就在训练数据上达到完美准确率,却在验证数据上长时间停留在随机猜测水平;之后,即使模型看起来已经过拟合很久,仍会突然实现泛化。OpenAI 的 Power 等人(2022)在小型 Transformer上训练模运算等算法任务时发现了这一现象,并以 grokking 命名:训练准确率已经饱和很久之后,验证准确率才从随机猜测水平升至完美。这个词来自 Robert Heinlein 的小说《异乡异客》,其中 grok 的意思是彻底理解某事。
Grokking 的发生过程#
模加法是经典的 grokking 任务:网络接收数对 (a, b),必须输出 (a + b) mod p,而训练时只能使用所有数对中的一部分。下面的运行示例使用 PyTorch 的 AdamW 优化器,在 p = 97 的 9,409 对数中取 30% 来训练一个小型多层感知机;在 CPU 上不到一分钟即可完成:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
p = 97 # task: predict (a + b) mod 97 from one-hot encodings of a and b
a, b = torch.cartesian_prod(torch.arange(p), torch.arange(p)).T
x, y = torch.cat([F.one_hot(a, p), F.one_hot(b, p)], dim=1).float(), (a + b) % p
idx = torch.randperm(p * p)
train, val = idx[: p * p * 3 // 10], idx[p * p * 3 // 10 :] # train on 30% of all pairs
model = torch.nn.Sequential(torch.nn.Linear(2 * p, 256), torch.nn.ReLU(), torch.nn.Linear(256, p))
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1.0) # strong weight decay
for step in range(1, 20001):
loss = F.cross_entropy(model(x[train]), y[train])
optimizer.zero_grad()
loss.backward()
optimizer.step()
if step % 4000 == 0:
train_acc, val_acc = [(model(x[i]).argmax(1) == y[i]).float().mean().item() for i in (train, val)]
print(f"step {step:5d}: train accuracy {train_acc:.2f}, validation accuracy {val_acc:.2f}")训练到第 4,000 步时,准确率已达到 1.00,而验证准确率为 0.00。之后,验证准确率在第 8,000 步升至 0.16,第 12,000 步升至 0.54,第 16,000 步升至 0.84,第 20,000 步升至 0.97。使用 weight_decay=0.0 时,同一次运行的验证准确率在全部 20,000 步中都保持在 0.00。
Nanda 等人(2023)通过逆向工程分析一个在模加法任务上训练的单层 Transformer,解释了这一停滞期。网络学会使用离散傅里叶特征和三角恒等式,将加法转换为绕圆旋转的操作。训练分为三个连续阶段:记忆、回路形成和清理。泛化回路逐渐增强,但验证准确率保持不变;当权重衰减移除了仍主导输出的记忆解后,性能才会跃升。
Grokking 的成因#
- 正则化:在最初的实验中,权重衰减是最有效的干预方法;如果没有权重衰减,上面的运行示例完全无法实现泛化。
- 数据集规模:训练数据占比越小,模型在实现泛化之前需要进行的优化就越多;低于某个阈值后,网络在实际可行的预算内永远无法实现泛化。
- 权重范数:Omnigrok将 grokking 与权重规模联系起来,因为泛化解的权重范数小于记忆解。研究者从较大的初始权重出发,在图像、语言和分子任务上诱发了 grokking,并通过约束权重范数,在算法任务中消除了这一现象。
- 数值稳定性:Prieto 等人(2025)发现,如果不进行正则化,交叉熵训练会不断放大 logits,直到 softmax 中的浮点误差阻止学习;他们将此称为 Softmax Collapse。他们提出的 StableMax 激活函数和 ⊥Grad 优化器无需权重衰减即可产生 grokking。
Grokking 与相关概念的比较#
- 过拟合:训练集和验证集表现之间的差距持续存在或不断扩大。而在 grokking 中,随着训练继续进行,这种差距会自行缩小。
- 双重下降:随着模型规模或训练时长增加,测试误差先下降、后上升、再下降。按轮次出现的双重下降是另一种延迟改进形式:测试误差在训练过程中先上升一段时间,然后再次下降。
- 机制可解释性:研究训练后网络内部算法的领域。模运算任务上的 grokking 成为该领域的主要案例研究之一,因为研究者可以完整地读取模型学到的算法。
实践中的 Grokking#
在由单一精确规则决定的小型算法数据集上,grokking 最为明显。它对实验设计仍然很重要,因为早停会在验证指标停止改善时结束运行,这可能导致 grokking 运行在停滞期中途被截断。Ultralytics YOLO 训练在验证适应度连续 patience 个轮次没有提升时停止,默认值为 100;而在 patience=0 时则会运行每一个轮次。










