ZeroPoint v0 research prototype: new from-scratch NumPy framework, memory-slot architecture, audited Transformer comparison
5c6c847 verified |
Download experiments/compare.md from Holmes2011/ZeroPoint: direct link, hf CLI and curl.
- Browser
- Download file 3.5 kB
-
https://huggingface.co/Holmes2011/ZeroPoint/resolve/main/experiments/compare.md
- Command line
-
hf download hf://Holmes2011/ZeroPoint/experiments/compare.md
-
curl -L -o compare.md https://huggingface.co/Holmes2011/ZeroPoint/resolve/main/experiments/compare.md
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 个种子,抽样噪声大(同一模型 0~63 段:8 条序列 1.5550,32 条序列 1.4372)。 | |
| 32 条序列的复测:0~63 **1.4372 ± 0.0187**、64~255 **1.4742 ± 0.0341**、256~1023 **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.6~8.9 / 16。不能据此说"16 个槽只用 3~5 个"。 | |