ZeroPoint / experiments /compare.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.5 kB

ZeroPoint vs Transformer 对照实验

历史说明(2026-11-08 统一):本报告生成于 2026-10-11,当时架构名为 ZeroMem;除名称统一为 ZeroPoint 外,正文保留原样。两处已过时的内容在文末加了更正注:① 长度外推只用了 8 条验证序列(已被 32 条序列的复测取代);② "有效槽数"的写列用了未归一化的门控分布,数值偏低。

  • 语料:Python 标准库源码,1,558,395 字符,词表 96;90% 训练 / 10% 验证
  • 三个模型:宽 64、2 层、4 头、Pre-LN、GELU MLP 4 倍;ZeroPoint 每头 16 个槽、可学习初始状态、分块并行(块长 32)、无位置编码
  • 训练:上下文 64、batch 32、2000 步、AdamW(权重衰减 0.01)、预热 100 步 + 余弦、梯度裁剪 1.0
  • 学习率:每个模型在 [0.001, 0.003, 0.006] 里各试一次(种子 0),取最好的再跑种子 [1, 2]
  • 验证 loss = 40 个固定验证 batch 的平均交叉熵(nats/字符,越低越好),均值 ± 标准差(3 个种子)
  • 计算量 = 前向时每个字的矩阵乘浮点运算次数(不受机器负载影响;训练一步约 3 倍)
模型 参数量 最佳学习率 验证 loss 前向计算量(每字) 推理状态(第 64 字 / 第 4096 字,浮点数)
Transformer 116,576 0.006 1.5452 ± 0.0100 242 K 16,384 / 1,048,576(KV 缓存)
Transformer (sin) 112,480 0.006 1.5271 ± 0.0083 242 K 16,384 / 1,048,576(KV 缓存)
ZeroPoint 115,240 0.006 1.5214 ± 0.0134 232 K 2,048 / 2,048(固定)

学习率搜索(种子 0 的验证 loss)

模型 lr=0.001 lr=0.003 lr=0.006
Transformer 1.6908 1.5530 1.5520
Transformer (sin) 1.8006 1.5939 1.5374
ZeroPoint 1.6682 1.5433 1.5311

长度外推(训练上下文 64;8 条验证序列 × 3 个种子平均)

位置 ZeroPoint Transformer (sin) Transformer(可学习位置编码)
0 ~ 63(训练见过的长度) 1.5550 1.4512 能跑
64 ~ 255 1.6164 4.6359 跑不了(只有 64 个位置)
256 ~ 1023 1.6410 4.6057 跑不了(只有 64 个位置)
1024 ~ 4095 1.7040 —(注意力矩阵太大,没测) 跑不了(只有 64 个位置)

ZeroPoint 槽的使用情况(有效槽数,满分 16)

有效槽数 = 平均读/写地址分布的 exp(熵):16 个槽用得一样多 = 16,全挤在一个槽 = 1。

层 读 写
0 10.1 3.2
1 9.9 5.0

更正(2026-11-08 追加,不改上表)

  1. 长度外推:上表只用了 8 条验证序列 × 3 个种子,抽样噪声大(同一模型 063 段:8 条序列 1.5550,32 条序列 1.4372)。 32 条序列的复测:063 1.4372 ± 0.0187、64255 1.4742 ± 0.0341、2561023 1.6617 ± 0.0234、 1024~4095 1.6932 ± 0.0305(远端 − 近端 = +0.2190 ± 0.0630)。详见 diagnose.md / ema_longrun.md。 Transformer(sin) 的 4.6359 / 4.6057 仍是 8 条序列的测量(基线权重未保留),≈ ln 96 = 4.56,即随机水平。
  2. 有效槽数:slot_usage() 的写列用的是未归一化的门控分布(每层质量只有 0.47 / 0.59),所以 3.2 / 5.0 偏低。 归一化后读列不变(10.1 / 9.9),写列约 6.0 / 10.4(每层);按段池化 8.68.9 / 16。不能据此说"16 个槽只用 35 个"。