File size: 2,862 Bytes
5c6c847 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | # 长距离精确回忆(联想检索)
`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`](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 步的表去比架构**。
|