ZeroPoint / experiments /recall.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
2.86 kB

长距离精确回忆(联想检索)

k1 v1 k2 v2 … kN vN [问] kq → 回答 kq 对应的值。16 个键、16 个值,随机猜的准确率是 1/16 ≈ 6%。 三个模型宽 64、2 层、4 头;训练 20000 步,N 在 2~16 随机;每格是 512 道测试题 × 种子 [0, 1] 的平均准确率。

模型 N = 2 N = 4 N = 8 N = 12 N = 16
Transformer 50% 30% 23% 20% 18%
ZeroPoint (16 槽) 51% 32% 23% 20% 16%
ZeroPoint (32 槽) 49% 31% 24% 20% 17%

判定与解释(11-08 补)

预注册判定(见 recall_prereg.md)

  • P1(Transformer 在 N=16 准确率 ≥ 80%)不成立:18%。
  • P2(ZeroPoint 比 Transformer 低 ≥ 20 个百分点)不成立:N=16 时 16% / 17% vs 18%,差 1~2 点。
  • P3(32 槽比 16 槽高 ≥ 5 个百分点)不成立:17% vs 16%。

和 3000 步比:几乎完全一样(Transformer N=2 52% → 50%、N=16 14% → 18%;ZeroPoint 16 槽 51% → 51%、17% → 16%)。训练量加长 6.7 倍没有任何可辨别的提升。

诊断(11-08,recall_diag.py;诊断性实验,不参与上面的预注册判定)

  1. 固定 32 条 N=2 题反复训练:600 步训练集准确率 100%,loss ≈ 0 → 框架、优化、反向传播没问题。
  2. 只训 N=1(复制值,不需要匹配查询):500 步 100% → 复制机制能学会。
  3. 只训 N=2,换学习率安排(种子 0,各 8000 步):
    • 恒定 3e-3(本脚本原设置):N=2 停在 53%,loss ≈ 0.72。
    • 余弦 3e-3 → 3e-4:N=2 停在 53~59%,loss ≈ 0.72。
    • 余弦 1e-3 → 1e-4:第 6000 步开始突破,第 8000 步 N=2 = 100%,loss 0.001。 → 任务能学会;原来的 3e-3 恒定学习率把模型困在"两个候选值各猜一半"的状态(loss ≈ ln 2 ≈ 0.69)。另外,单独只用恒定 3e-3 训 N=2 到 20000 步也仍是 53%,所以不是步数问题。
  4. 混合 N(2~16)用同一个 1e-3 余弦跑 12000 步:N=2 仍只有 56%。混合训练里 N=2 的样本只占约 1/15,梯度信号被稀释,12000 步对 N=2 只相当于 800 步左右——还不够。

结论(已测量):20000 步无结论不是"训练量差一点",而是训练配置问题:

  • 恒定 3e-3 太高,模型停在 50/50 对冲的局部解,学不出"用查询键选值"的回路;
  • 混合 N 把简单样本(N 小)的信号稀释了大约 15 倍。
  • 只学 N=2 时,1e-3 余弦 8000 步就能到 100%,说明 Transformer 架构有能力学这个任务。

下一步:按修正后的学习率(1e-3 余弦)重跑 recall,或者加课程(先 N=2,再逐步加长到 16);需要重写预注册。在那之前,recall 的结论仍是"无结论",不能拿这张 20000 步的表去比架构。