AI/ML 详解:训练中的反常现象

Day 44 · 2026-06-30 · 难度:进阶 / 理论
面向:有编程经验的非 AI 方向工程师
今天讲的是机制与现象:训练曲线为什么会出现「记忆很久才突然开窍」「越大反而越好」「能力突然冒出来」这些违背直觉的拐点。这些和 Day 14 的 scaling laws(平滑可预测)恰好互补——它们是 scaling 平滑图景上的非平滑裂缝

延迟泛化Grokking

相变正则化
一句话类比

想象在一个「代码体积预算」下做重构。模型先用一张巨大的硬编码查找表(lookup table)通过所有训练样例——训练集 100% 正确,新输入全错。后台有个 linter(就是 weight decay)持续惩罚「代码体积」。在长期压力下,系统最终「发现」真正的算法(一个紧凑函数),既更小又能泛化。跳变之所以突然,是因为紧凑算法只有完全成形才生效——半成品算法比查找表还差。

它解决什么问题 + 工作机制

常识认为「过拟合之后再训练只会更糟」。Grokking(Power et al. 2022,OpenAI;grok = 科幻词,意为「彻悟」)在小型算法数据集(如「模 97 加法」)上给出反例:训练准确率几百步就到 100%,验证准确率长期趴在随机水平,然后在多训练几个数量级的步数后,验证准确率突然从 ~0 跳到 ~100%

训练步数(对数轴)→ 准确率
train 100% 几百步就到
val   ━━━━━━━━━━━━━━━┓
     随机水平 ~1%(趴几万步)
                           100%
  ↑ 记忆阶段(过拟合)     ↑ grokking:泛化电路成形

机制(直觉):网络有两条路解决任务——(1) 记忆:把每个训练样例存成参数里的查找表,权重范数大、不泛化;(2) 泛化:学到底层结构(对模加法是一组傅里叶式的「三角恒等式电路」),权重范数小、能外推。SGD 先到达更易达成的记忆解;而 weight decay 持续施加范数惩罚,缓慢把权重推向更紧凑的泛化解。Nanda et al. 2023 用机制可解释性逆向出了这个电路,证明泛化电路是逐渐长出来的,只是被「记忆 → 清理」的过程掩盖,所以宏观指标上看像突变。没有 weight decay,模型就停在记忆解,永远不 grok——正则化是这里的关键变量。

代码示例
import torch, torch.nn as nn
# 模 97 加法 (a+b)%97:这类算法任务才能稳定复现 grokking(示意骨架)
model = nn.Sequential(nn.Embedding(97, 128), nn.Flatten(),
                      nn.Linear(256, 256), nn.ReLU(), nn.Linear(256, 97))
# 关键:weight_decay != 0 是 grokking 的必要条件,去掉它模型只会记忆
opt = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1.0)

for step in range(100_000):          # 步数要远超「训练集已 100%」的时刻
    loss = loss_fn(model(x_train), y_train)
    opt.zero_grad(); loss.backward(); opt.step()
    # 训练准确率几百步到 100%;验证准确率会趴几万步后「突然」跳到 ~100%
常见误区 + 实践场景
误区:「验证准确率不涨 = 训不出来,该停了」。在 grokking 体制里,这会让你恰好停在记忆阶段、错过后面的泛化跳变。但反过来也别误读:grokking 是特定条件(小数据、强正则、清晰的算法结构)下的现象,不代表所有任务都该「死训」——大规模真实任务上 early stopping 仍然常用。
📌 跨学科场景:grokking 是「顿悟」的一个数学模型。长期看不到进展(死记硬背),然后突然融会贯通(抓到底层结构)。对照佛学的「渐修」与「顿悟」——顿悟也许正是渐修在某个「范数阈值」之后的相变显现,连续努力在临界点处呈现为不连续的体验。
Takeaway + 思考题
💡 泛化不是「记住更多」,而是「找到更短的描述」——这是奥卡姆剃刀的算法版本,由 weight decay 在背后悄悄执行。
🤔 你自学一门新领域时,「死记」阶段和「开窍」阶段是否也有这种延迟?什么是你大脑里那个持续施压的 weight decay?

双下降Double Descent

泛化理论过参数化
一句话类比

像连接池或哈希表,「恰好够用」反而最糟。当模型容量恰好等于训练样本数(插值阈值),系统被逼出唯一一个解,它必须扭曲自己穿过每一个噪声点——好比强行穿过 N 个点的高次多项式,剧烈震荡。容量远超样本时,存在无穷多个能拟合的解,SGD 的隐式偏好会挑出最平滑、低范数的那个——反而更稳。最坏的点,是「不多不少」。

它解决什么问题 + 工作机制

经典统计的 bias-variance tradeoff(偏差-方差权衡)预测:测试误差随模型容量是 U 形——太小欠拟合,太大过拟合。但深度学习里几十亿参数的模型「过参数化」到能背下整个数据集,却依然泛化良好,直接打脸 U 形。

Belkin et al. 2019 与 Nakkiran et al. 2019(Deep Double Descent)给出统一图景:测试误差先降后升(经典 U 形),在插值阈值(interpolation threshold,模型刚好能做到 0 训练误差处)冲到峰值,然后随容量继续增大再次下降——故名双下降。

测试误差 vs 模型容量(柱越高误差越大)
容量小 欠拟合
中等   经典 U 形谷底
≈样本数 插值阈值 = 峰值(最糟!)
更大   第二次下降
巨大   过参数化,最优
↑ 危险区不在「太大」,而在「刚好够」

机制(直觉):插值阈值处,模型自由度恰好等于约束数,解唯一且被迫连噪声一起拟合,方差爆炸。越过阈值后,多余的自由度给了 SGD 挑选的空间,它的隐式正则化(implicit regularization)偏向低范数 / 平坦解,等效于自动 Occam。Nakkiran 还指出双下降不只随模型大小出现,也随训练 epoch 数出现(epoch-wise),甚至在某些区间「更多数据反而有害」。

代码示例
import numpy as np
from sklearn.linear_model import Ridge
# 随机特征回归:扫描特征数(=模型容量),观察测试误差的双下降
n_train, errs = 100, []                        # 固定 100 个训练样本
for n_feat in [10, 50, 90, 100, 110, 300, 1000]:   # 容量穿过插值阈值(=100)
    W = np.random.randn(d, n_feat)               # 随机特征映射
    Z_tr, Z_te = X_tr @ W, X_te @ W
    m = Ridge(alpha=1e-6).fit(Z_tr, y_tr)      # 近乎无正则,逼出插值解
    errs.append(((m.predict(Z_te) - y_te)**2).mean())
# errs 在 n_feat≈100(=n_train) 处出现尖峰,两侧都更低 → 双下降
常见误区 + 实践场景
误区:「模型越大越容易过拟合」。在过参数化体制里常常相反——固定数据下,越大往往越好。但这不等于「无脑加大」总赢:真正的危险区是「刚好能拟合」的中等容量,那里方差最高、对噪声最敏感。要避开的是临界点,不是大模型。
📌 决策辅助场景:双下降给了一个反直觉的心智模型——「卡在临界点」往往最脆弱。很多系统都有类似结构:团队规模刚好等于任务数、投资组合恰好集中在临界数量、连接池大小恰好等于峰值并发……「不多不少」常常是最坏选择,要么留足冗余,要么主动受限。
Takeaway + 思考题
💡 「刚好够」常是最差的工程点:要么明显不足(受控欠拟合),要么显著过量(让隐式正则发挥)。
🤔 你的系统里,有哪些「恰好匹配」的设计点,正卡在它自己的「插值阈值」上、最脆弱却没被发现?

相变与突现Phase Transitions & Emergence

规模复杂性
一句话类比

像随机图里的渗流(percolation)。往图里逐条加边,连通性平滑增长——直到某个临界边密度,突然冒出一个横跨全图的「巨连通分量」。没有哪条边是特殊的,但宏观连通性在临界点发生相变。LLM 的某些能力随规模就是这样:平滑地加「边」(参数 / 数据 / 算力),跨过某个临界规模后,能力突现

它解决什么问题 + 工作机制

Scaling laws(Day 14)说预训练 loss 随规模平滑、可预测地下降。但 Wei et al. 2022(Emergent Abilities)发现:某些下游能力(多位数算术、chain-of-thought 推理、指令跟随)在小模型上停在随机水平,到某个规模阈值才突然出现——无法从小模型外推。平滑的 loss 曲线下,藏着不平滑的能力曲线。

机制(直觉):和物理相变类比——水温平滑升高,到 0°C / 100°C 却发生不连续的状态变化。涌现的「物理基础」仍有争议,一类解释是:复杂能力需要多个子电路(sub-circuit)同时就位,缺一则整体失败;规模平滑提升每个子电路的成功概率 p,但它们的合取(AND)是高度非线性的,所以联合成功率会在某点骤升。下面的代码把这个「平滑 p 经 AND 放大成悬崖」的直觉算出来了——这也正好引出下一张卡的争论。

代码示例
import numpy as np
scale = np.linspace(1, 10, 100)             # 模型规模(对数轴上的代理)
p = 1 / (1 + np.exp(-(scale - 5)))         # 单子技能成功率:随规模「平滑」上升

for k in [1, 5, 20]:                       # 任务需要 k 个子技能同时成立(AND)
    task_acc = p ** k                       # 合取 → 高度非线性
    # k 越大,task_acc 在某规模处越像「悬崖」——平滑的 p 制造出突现外观
    print(k, np.round(task_acc[[30, 50, 70]], 3))
常见误区 + 实践场景
误区:「涌现 = 模型突然有了质变的新认知 / AGI 觉醒的证据」。这是过度神秘化。涌现首先是个经验观察;它「是否真实、为何发生」是开放问题(见下一卡)。把曲线上的一个拐点当成意识涌现,是把测量现象误读成形而上学事件。
📌 复杂性科学场景:涌现、临界性、自组织临界都在此交汇,是 BigCat 深度兴趣的正中靶心。但恰恰因为太迷人,更要保持警惕——下一卡会说明,你观察到的「突现」可能部分是度量产物,而不全是世界本身的相变。
Takeaway + 思考题
💡 突现可能是真相变,也可能是测量棱镜——两者在曲线上长得一模一样,必须用机制和多指标去分辨。
🤔 你怎么区分「系统真的发生了相变」和「只是你用的指标制造了一道悬崖」?

涌现是度量假象吗The Mirage Debate

度量争论
一句话类比

阈值告警掩盖平滑信号。底层延迟从 90ms 平滑爬到 110ms,但你的「p99 < 100ms」布尔 SLA 从绿突然翻红——是指标的量化制造了「悬崖」,底层信号其实是连续的。Schaeffer 的主张就是这个:能力在平滑提升,但用「全对才算对」的离散指标一量化,就显出一道假悬崖。

它解决什么问题 + 工作机制

如果涌现真的不可预测,对安全和规划是噩梦——你无法知道下一个规模会冒出什么能力。Schaeffer et al. 2023(Are Emergent Abilities a Mirage?,NeurIPS 杰出论文)提出:很多「涌现」是研究者选的指标造成的,而非模型行为的本质突变。

同一个底层模型,两把尺子量出两种故事

连续指标(token 正确率 / log-likelihood)
   平滑爬升

离散指标(exact match:全对才得分 = p5
   假悬崖(看似突现)

机制(直觉):设 5 位数加法,每位 token 正确概率 p 随规模平滑上升。若用 exact match(5 位全对才得分),得分 ≈ p5;p 从 0.7 到 0.9 平滑变化,p5 从 0.17 跳到 0.59,叠加更长位数后离散指标显出陡峭跳变。换成连续指标(token 编辑距离、log-likelihood),同一个模型的曲线就平滑了。但争论未定:Wei 等回应,有些能力换连续指标仍有非线性拐点;而且「能否预测」与「指标是否平滑」是两个问题。折中共识:部分涌现是度量产物,部分可能是真实的能力相变——需要 case-by-case 用多种指标交叉检验。

代码示例
import numpy as np
scale = np.linspace(1, 10, 100)
p = 1 / (1 + np.exp(-(scale - 5)))   # 单 token 正确率:平滑上升

exact_match = p ** 5                  # 离散指标:5 token 全对才算对 → 假悬崖
token_acc   = p                       # 连续指标:按 token 计 → 平滑
# 同一个底层模型:exact_match 看着像「突现」,token_acc 看着像「平滑爬升」
print("离散", np.round(exact_match[::25], 3))
print("连续", np.round(token_acc[::25],   3))
# 曲线形状一半取决于模型,一半取决于你拿的尺子
常见误区 + 实践场景
误区:把这场争论读成「涌现被证伪了」或「涌现是真的」——两者都过度简化。正确理解:涌现的表观突然性对指标选择高度敏感;这既不否定能力在提升,也不证明发生了神秘相变。它真正的教训是关于测量,不是关于模型有没有「灵魂」。
📌 AI 超级个体 / 决策场景:评估模型、团队、甚至自己时,警惕离散指标制造的假悬崖与假平台。一个人的能力可能在平滑积累,但 pass/fail 的 KPI 让它看起来「卡了很久然后突然爆发」。想看真实斜率,就换一把连续的尺子去量。
Takeaway + 思考题
💡 「悬崖」常常是你的尺子刻出来的,不是世界的形状——换一把尺子,悬崖可能变成缓坡。
🤔 你日常用的哪些 pass/fail 指标,正在把平滑的进步伪装成停滞或突变?

深入资源Further Reading

深入思考Deep Questions

1. Grokking 和 double descent 都是「训练后期 / 过参数化」里的突变,它们是同一现象的不同切面吗?
它们共享一个深层机制:在多个可行解之间,训练动力学最终偏向「更简单/更平滑」的那个。Double descent 关注的是沿容量轴——越过插值阈值后,过多的自由度让 SGD 的隐式正则化得以挑出低范数解,于是误差二次下降。Grokking 关注的是沿时间轴——在固定的过参数化模型里,weight decay 用很多步把权重从「记忆解」缓慢搬到「泛化解」。两者其实是同一枚硬币:double descent 是「容量足够时,好解存在」;grokking 是「好解存在时,需要时间 + 正则把你推过去」。把它们统一起来看,核心都是隐式偏好(implicit bias)在过参数空间里做 Occam 选择,只是一个横看容量、一个纵看时间。这也是为什么近年很多工作(包括 epoch-wise double descent)把这两条线索往一起拧。
2. 如果涌现部分是度量假象,scaling laws 的「可预测」和涌现的「不可预测」如何共存?
关键在于区分「预训练 loss」和「下游任务指标」两个层面。Scaling laws 描述的是预训练交叉熵 loss——它确实随规模平滑、可外推,因为 loss 是一个连续、逐 token 平均的量。下游能力的「不可预测涌现」往往出现在离散、阈值化的任务指标上(exact match、准确率)。Schaeffer 的论证说:底层(loss / per-token 概率)一直平滑可预测,是上层那把离散尺子把平滑变成了悬崖。所以二者不矛盾——它们测的是不同层。真正未解的部分是:是否所有涌现都能这样「还原」成平滑底层?目前看不能完全——有些能力即便换连续指标仍显非线性拐点,可能涉及真实的表征相变。诚实的现状是:loss 可预测 ≠ 能力可预测,这道鸿沟正是 AI 安全里「能力突袭」担忧的技术根源。
3. SGD 的「隐式正则化」在 grokking、double descent 里都是主角——它到底偏好什么?为什么没人显式写这一项,它却处处起作用?
这是现代深度学习理论最迷人也最未竟的问题。经验上,SGD(尤其配 weight decay)在过参数化网络里偏向低范数、平坦极小(flat minima)、低复杂度的解——即便有无数个能把训练误差打到 0 的解,它系统性地落在「更简单」的那些上。为什么?几条线索:(a) 梯度噪声像温度,让优化倾向宽阔盆地而非尖锐尖峰(尖锐解对扰动敏感、泛化差,对应 Day 43 的锐度-泛化);(b) 对线性/矩阵分解模型可以严格证明梯度下降收敛到最小范数解;(c) weight decay 把这种偏好显式放大。但「没人写出这一项」恰是要点——它不是损失函数里的显式正则项,而是优化算法 + 架构 + 初始化共同诱导的隐式约束。完整刻画它(在一般非线性网络上)仍是开放问题。对 BigCat 的分布式直觉:这有点像「最终一致性」不是某行代码写死的,而是协议动力学涌现的性质——行为藏在过程里,不在某个声明里。
4. 从复杂性科学看,神经网络训练里的「相变」和物理相变(伊辛模型、渗流)是真同构,还是只是诱人的类比?
介于两者之间,且边界在快速变清晰。类比层面:损失景观里的「记忆相 → 泛化相」、容量轴上的插值阈值,确实和物理的临界点、序参量、对称破缺有形式上的相似——都有「控制参数过临界值后宏观行为突变」。真同构的证据:部分简化模型(随机特征、深线性网、某些 SSM)能写出近似的解析相图,临界指数可计算,和统计物理的重整化群、随机矩阵理论对接得上;渗流之于「能力涌现」更是有具体的子电路-连通性模型在支撑。但要警惕:真实的深层非线性网络维度极高、损失非凸、动力学远离平衡态,很多物理相变的严格前提(热平衡、可定义的自由能)并不成立。务实的判断:物理是目前最好的脚手架语言,给了序参量、临界性、普适类这些可证伪的概念;但「同构」要逐案验证,不能因为图长得像就当成定理。这正是 BigCat 横跨物理 / 复杂性 / 分布式的兴趣能发力的前沿地带。
5. 这些反常现象,对「我们到底理解不理解深度学习」意味着什么?
它们共同指向一个谦卑的事实:我们能造出深度学习系统,远早于我们能解释它。Grokking 说明「训练曲线停滞」不等于「学不到」;double descent 说明几十年的 bias-variance 直觉在过参数化区间失效;涌现与其度量之争说明,我们连「某能力到底有没有、何时出现」都还在为如何测量它而争论。这不是细枝末节,而是三道裂缝,提醒我们当前的泛化理论是事后描述多于事前预测。但反过来看,它们也是最好的研究入口:每个反常都是一扇窗,机制可解释性(如 Nanda 逆向 grokking 电路)正是从这些窗口钻进去的。对一个追求「AI 超级个体」的人,真正的素养不是记住这些现象的名字,而是养成一种本能——看到一条漂亮曲线时,先问「这是世界的形状,还是我尺子的形状」。这份怀疑,比任何单个结论都更耐用。