ZeroPoint / experiments /diagnose.md
Holmes2011's picture
ZeroPoint v0 research prototype: new from-scratch NumPy framework, memory-slot architecture, audited Transformer comparison
5c6c847 verified
|
Raw History Blame Contribute Delete
3.84 kB

预注册实验:查三个问题

写于实验之前(2026-10-18)。跑完只在下面追加结果,不改这一节。

背景:ema_longrun.md 否定了"槽值无界累积"假设。无 ema 的模型在 10244095 字处 loss 比 64255 字处高约 0.22; 有 ema 的高约 1.77。compare.md 里 16 个槽只有 35 个被写入(更正:35 是按未归一化的门控分布算的偏低值;归一化后读约 10/16,写约 6~10/层)。

假设和预测

H2(训练长度):长序列变差是因为训练只见过 64 字;模型在更长的位置上遇到的槽状态分布是训练时没见过的。

  • 预测:训练长度改为 256(每步字数不变、其余相同)后,10244095 与 64255 的 loss 差 缩小到 T64 的一半以下。
  • 不成立时会看到:差距没有缩小(< 2 × 标准差的变化)。

H3(ema 为什么更差):ema 把长期槽的写入乘上 (1-λ),训练时(64 字)长期槽几乎不起作用,模型学会只用短期槽; 到了长序列,读地址仍指向短期槽,但短期槽里的内容和训练时的统计不同。

  • 预测 ③a:ema 模型的写地址集中在半衰期短的槽上:半衰期 > 16 字的槽,写入占比 < T64 模型的一半。
  • 预测 ③b:ema 模型学到的长期槽 λ 更接近 1(半衰期更长),或者长期槽的读占比在远处位置上升。
  • 不成立时会看到:两组的写入分布没有明显差别。

H4(槽塌缩):塌缩不是训练失败,而是写地址的 softmax 竞争让少数槽赢者通吃;在不同序列位置上"赢的槽"不同, 所以整体统计(compare.md 的 3~5 个有效槽,见上面对该度量的更正)低估了实际用到的槽数。

  • 预测 ④:按位置分段(063 / 64255 / 2561023 / 10244095)分别统计有效写槽数,各段的并集 > 整体有效槽数 × 1.5; 同时各段的读/写分布之间有明显差别(任意两段的 JS 散度 > 0.1)。
  • 不成立时会看到:各段的分布几乎相同,用的始终是同几个槽。

判定:每条按上面的数值阈值判,3 个种子均值;差别和 2 × 种子间标准差比。

结果(实验之后写)

验证 loss(64 字)和长度外推(32 条 × 4096 字;均值 ± 标准差,3 个种子)

条件 64 字验证 0~63 64~255 256~1023 1024~4095 远−近 差
T64 1.5214 ± 0.0134 1.4372 ± 0.0187 1.4742 ± 0.0341 1.6617 ± 0.0234 1.6932 ± 0.0305 +0.2190 ± 0.0630
T64-ema 1.5182 ± 0.0076 1.4308 ± 0.0039 1.6476 ± 0.0529 3.1084 ± 0.2157 3.4153 ± 0.2402 +1.7677 ± 0.2188
T256 1.5572 ± 0.0060 1.4741 ± 0.0117 1.4486 ± 0.0098 1.5098 ± 0.0022 1.5155 ± 0.0048 +0.0669 ± 0.0051

H3:写入落在半衰期 > 16 字的槽上的占比(0~63 段),和学到的最长半衰期

条件 长期槽写入占比 最长半衰期(字) 远处读长期槽占比的变化
T64 0.061 ± 0.005 109 +0.009
T64-ema 0.014 ± 0.001 103 +0.007

H4:槽的使用(T64,写地址;各层各头平均)

段 有效写槽数
0~63 8.6
64~255 8.7
256~1023 8.5
1024~4095 8.9
整体 8.7

各段用到的槽的并集 ÷ 整体有效槽数 = 0.68;各段分布之间最大的 JS 散度 = 0.010

判定(按预注册的标准)

  • H2 训练长度:远−近差 T64 +0.2190 → T256 +0.0669 → 成立
  • H3a ema 写入避开长期槽:占比 0.061 → 0.014 → 成立
  • H3b ema 的长期槽更长或远处更依赖长期槽 → 不成立
  • H4 槽塌缩是分段使用不同的槽:并集比 0.68,JS 0.010 → 不成立

模型已保存在 experiments/out/diag_*.npz,可以事后再分析。