MECHANISTIC REPRODUCTION NOTE2026-08-06code: ngram-gap-lab ↗

n-gram Gap:最小复现与机制证据

只问一个问题:在 vanilla nanoGPT 中,仅加入可训练的 bigram / trigram value memory,是否足以让固定顺序 replay 产生 train/val gap?这里把 setting、曲线和频率证据放在主线;术语、伪代码、debug 过程和历史分支放到背景页。

版本说明:本页保留早期 injection-point ablation 作为历史对照,并在下方合并新的 collision-free exact-frequency baseline。旧版完整分析(含 current-shell、exp4/exp5、toy、P1/P2)仍保留在 index_archive_20260805.html背景与 debug 子文档解释这些概念为何不属于最小 setting。
一句话结果

是的。n-gram table 在训练集上逐渐记住 context-specific value;固定顺序多 epoch replay 后,train loss 继续下降,而 val loss 在 epoch 边界后上升,形成 gap。

bigram + trigramtrain-specific memoryreplay gap
本页的判断标准

不把 current shell、Muon、RoPE 或复杂观测系统当作必要条件。用同一份 vanilla 模型,只改变 n-gram 的注入点,观察 gap 强弱是否随信号到达输出的方式变化。

1. 最小 setting

标准主线是 baseline_input。它对应最朴素的 over-encoding:先查 n-gram value,再加到 token embedding,后面运行普通 Transformer。

模型vanilla nanoGPT
memorybigram + trigram
注入点input / wte
数据顺序fixed replay
table optimizerRMSProp
backbone optimizerAdamW
规模8L · 6H · 768D
实验seed 42 · 2000 steps

训练 shard 约 337 steps / epoch(2000 步约 6 个 epoch);图中的竖线对应各 epoch 边界。三种注入点仅用于消融,不是三个不同的模型家族。

2. 核心结果:注入点改变 gap 强度

同一个 n-gram table 放在不同位置,得到不同的信号路径。y 直接绕过 attention 到达 residual stream;input 在最开始加入 embedding;v 则先进入 attention 的 value,再被权重混合。

v 注入
5.45
gap @ 2000 steps
y 注入
5.80
gap @ 2000 steps
input 注入
1.87
gap @ 2000 steps
无 n-gram
0.25
negative control
y:最强、最快

n-gram 信号在 attention 之后加入,每层都能直接影响后续输出。

input:最基础

查表结果一次加到 wte;这是后续实验默认采用的最朴素 setting。

v:较弱、较晚

value residual 会被 attention 混合,且当前 norm 只有 V 的约 6.5%。

3. 训练曲线:epoch replay 后 train / val 分叉

Loss 与 gap 曲线虚线:epoch boundary · 点击图例可隐藏/恢复曲线 · 实线=平滑曲线,散点=原始记录

input run 在 step 30 有一个单点离群(train loss 9.96、gap −2.60,仅 input 注入出现),绘制时从平滑线中剔除该点,其余原始点以半透明散点保留。

4. Loss、gap 与 table RMS 的时间对齐

将 input 主 setting 的 train loss、validation loss、global gap 与 n-gram table RMS 放在同一张图中,沿同一个 step 轴观察 table memory growth 是否先于或伴随 replay gap 出现。

Loss、gap 与 table RMS 的时间对齐input 主 setting · 点击图例可隐藏/恢复曲线 · 实线=平滑曲线,散点=原始记录
完整 step 数据表(每 10 步一行 · 共 200 行,点击展开)
stepv gapy gapinput gapv table RMSy table RMSinput table RMS

5. Frequency → gap:分 bin、Log-x 与 Log–log

这里不再画训练频次分布的 bar 或 cumulative fraction。主问题是:不同 training hit-count 的 context,最终对应多大的 train/validation gap。所有 gap 图都排除 novel:它在 train 中没有 token loss,不能定义标准的 val loss − train loss

分 bin 的 loss / gap / contribution静态 SVG;bigram
Bigram frequency bin loss gap contribution
分 bin 的 loss / gap / contribution静态 SVG;trigram
Trigram frequency bin loss gap contribution

交互版仍可单独打开,支持切换 context branch、loss/gap 和 total contribution。

Frequency 与 final gap左:Log-x;右:Log-log
Frequency bin 与 final gap 的 log-x 和 log-log 关系

novel、undefined gap 和非正 gap 均排除;交互版可打开 Log-x打开 Log-log

不同 step 切片下的 gap–frequency 幂律log–log;input run
Gap vs frequency at multiple step slices with fitted power-law exponents

每条线 = 一个 step 切片,图例标注该切片的拟合幂律指数 α(log–log 最小二乘)。α 并不随 step 稳定:500–750 步最陡(bigram −0.44 → −0.56,trigram −0.47 → −0.68),之后逐渐变平,到 2000 步降为 bigram −0.27、trigram −0.33;step 300 时 trigram 还没有任何正 gap 桶,幂律尚未形成。novel、无有效 train/val 计数的桶和非正 gap 均排除。

读图重点:静态图完整显示在页面中,不依赖 iframe 高度,也不产生内部滚动。

6. Exact-frequency baseline:主结果

这里保留 collision-free exact trigram baseline 的完整分析报告。r(c) 只来自完整 train epoch 的真实 context count;hash bucket occupancy 不参与频率或 gap 定义。

数据账本:22,759,032 个 distinct exact contexts;62,931,706 个 train context instances;P50=1,P99=28,最大频率=77,928;NanoGPTOriginal,input injection,bigram + trigram,seed 42,2000 steps。

7. 受控样本量复播:Transformer 与 MLP trunk 对照

这是同一条 real-text trigram controlled baseline 的样本量重采样和 trunk 对照,不是新的频率定义。完整 upstream train/val block 流先按整行均匀下采样,使一个 epoch 固定为 285 steps;随后只改变 n-gram 表之后的 backbone。

实验口径:train=20,520 rows,val=288 rows,device batch=72,batch tokens=147,456,2000 steps,约 7 个 replay epochs;seed=42,input-position bigram+trigram VE,unigram/fourgram 关闭,mixed n-gram optimizer,learning rate=0.004。两组 batch hashes 完全一致。频率仍是完整 upstream train epoch 的 exact context count:P50=1、P90=4、P99=28、max=77,928。
Transformer and MLP train validation loss over repeated epochsFinal gap by exact trigram frequency
真实频率 bin有效点数Transformer gapMLP gap
117.177.82
6–1056.027.23
11–20105.406.55
21–50304.785.57
51–100504.264.32
101–2001003.583.01
201–5002962.661.68
501–1k3452.621.40
1k–5k3912.290.82
5k+502.100.37
结论边界:MLP-only 仍产生 gap,因此 gap 不是 attention 才能产生的现象;但 MLP 的 train/val loss 更高,存在欠拟合,所以这不是“机制完全等价”的证明。它是一个干净的存在性/边界验证:更强的 Transformer trunk 能把训练侧记忆拟合得更深,并放大低频 context 的 replay-specific gap。

8. Toy model:在自己造的小世界里复现 gap

前面几节的实验都在真实文本上做。真实文本有两个麻烦:我们并不知道「下一个符号的规则」到底是什么,而且同时变化的变量太多。这一章我们干脆自己造一个小世界:规则由我们定,每个上下文该接什么、接的概率多大,全部已知;甚至还能算出「就算把规则完全告诉模型,它平均还是要猜错多少」——我们叫它理论最好水平。在这样的小世界里验证过的结论,就不再是真实数据里的巧合。

这一章怎么读

两个小实验,层层递进。第一个是 2×2 开关,证明 gap 的两个必要成分;第二个把规则改成「概率的」,量化模型离理论最好水平差多少、以及 n-gram 表能补多少。

8.1 第一步:2×2 开关(规则 100% 确定)

我们造了一个微型语言:32,768 条「前缀 → 下一个符号」的规则,规则由我们指定;训练文本和验证文本都按这些规则生成,训练时把训练集固定顺序反复重播(和前面真实实验一致)。关键设计是两个开关:

低频前缀n-gram 表gap(验证 loss − 训练 loss)读法
6.92表把训练侧的「巧合接续」背到近乎 0;验证侧换了接续,落差被放大
2.12没有表时,模型自己也会去背巧合——这是底噪
0.84(核心前缀 ≈ 0.002)表背的是训练、验证都成立的规律,背得越熟越无害
0.06干净基准:两个成分都没有,系统没有 gap
2x2 开关四象限的 gap(对数坐标)

一句话:低频 token 是燃料,n-gram 表是引擎;两者同时存在、固定顺序反复重播,gap 必然出现;去掉任何一个,gap 都大幅缓解。

8.2 第二步:规则是概率的(完全受控的小世界)

第一步里,每个上下文接什么符号是定死的;现实里的规则是「大概率」。第二步把规则改成概率分布,并加上一把尺子:理论最好水平——就算把规则完全告诉模型,预测下一个符号平均还是有一定的不确定性(规则越「乱」,下限越高)。我们报告「模型实际表现 − 理论最好水平」,叫它差距;差距越接近 0,说明模型越接近「完全懂规则」。

小世界设定:8,192 个符号;每 5 个符号一组叫「上下文」;给定上下文,下一个符号按一个固定概率规则产生。共 4,096 种上下文,训练里出现的次数从 8 次到 8,192 次不等。两种规则方案:

方案理论最好水平带 n-gram 表不带表
A 私密 + 全局2.572.64(差距 0.07)4.11(差距 1.55)
B 共享主题4.394.45(差距 0.06)5.29(差距 0.90)
按训练出现次数分组,模型离理论最好水平差多少训练过程中总体差距的变化

A 与 B 的对比:B 的规则里大部分是「大家共享的主题」,不带表时也比 A 好(差距 0.90 vs 1.55)——说明「可以共享学习」的部分不产生 gap,「必须死记」的部分才产生 gap。

8.3 小世界告诉我们什么

  1. gap 的两个必要成分是低频 token + n-gram 表,缺一不可。
  2. 给模型一张「每个上下文在训练里见过多少次」的表,它就能达到理论最好水平(差距 ≈ 0.06–0.07)——低频 gap 是记忆机制本身造成的,不是数据噪声。
  3. 真实数据里的低频 gap(第 5、6 节)在完全可控的小世界里被精确复现,说明它不是真实文本特有的偶然现象。

9. 结论

  1. 最小充分条件:vanilla nanoGPT + bigram / trigram value table + fixed-order multi-epoch replay + 能到达输出的注入方式。
  2. 默认 setting:input / wte 注入。它简单、可解释,也最接近 over-encoding 这类 n-gram memory 用法。
  3. 注入点是强度变量,不是 gap 的来源变量:v、y、input 都能产生不同程度的现象;差别来自信号路径和尺度。
  4. 低频结构解释现象:table 在重复看到的 train context 上形成强烈的 train-specific value,而 novel / 低频 context 在 val 上暴露出这种记忆的局限。
  5. 小世界复现(第 8 节):在完全受控的微型数据上,低频 token + n-gram 表仍是 gap 的充分条件;把「每个上下文见过多少次」直接喂给模型,它能达到理论最好水平。

背景、术语与 debug

展开背景说明(已拆到子文档)

如果你需要理解 gate、V / y / input 的伪代码、current shell 为什么是实验分支而不是必要变量,或早期 hash-row 频率统计为什么会把 novel trigram 错判成 seen,请阅读:

打开《背景与 debug:从 current shell 回到最小 n-gram setting》

展开历史实验记录与旧版完整页面

Agent experiment log保留了旧实验的逐项记录;旧版完整 guide保留了历史章节与原始图表。

展开子文档:实验登记表与理论附录

实验登记表(experiment registry):全部注册实验的 setting、run 状态、统计口径与嵌入图,唯一权威版本;理论附录(theory):unigram gap 闭式解、采样律与 residual response 的推导与证据。