双记忆系统:softmax 循环 × 旋转门控状态流 @ 23M
版本: 1.0 | 2026-09-30 | 模型 23.19M | minimind PT 39,695 步 | 真实 token NLL 2.4241(23M 家族新冠军)
1. 一段话总结
v24 用 20 个 softmax 层遍做精确检索记忆 ,在两个循环之间插一个旋转门控线性注意力桥 做压缩状态记忆------桥内三个现代线性注意力核心件(数据依赖遗忘门 λ_t、短因果卷积 v、bf16 并行扫描)让它在同参数下首次超越纯 softmax 架构(2.4241 vs 2.4284,两轮配对评测方向一致)。
2. 架构
2.1 总体结构
token_ids (B, 256)
↓
Embedding(23005 → 320) 7.36M
↓
[pre 桥] 标准 softmax 层 ×1 1.47M
↓
[循环 A] 同一个 softmax 层 ×10 次迭代 1.47M(一份权重)
z ← z + α·Block(z), α≈0.05 可学习
↓
[★ RUBIK 桥] 旋转门控线性注意力 ×1 2.56M
↓
[循环 C] softmax 层 ×10 次 1.47M(一份权重)
↓
[post 桥] softmax 层 ×1 1.47M
↓
RMSNorm → head(320 → 23005) 7.37M
总计 23.19M
- 有效深度 23 个层遍:21 softmax + 1 线性注意力 + 2 桥(同为 softmax)
- softmax 层 = RMSNorm → GQA(10 头, kv=2) + RoPE → SwiGLU(4×)------v19 调优组件
- 循环块 = 三段多明治架构(v13 血统),α 混合步长,本训练中分化为 0.046/0.077
2.2 RUBIK 桥内部(v24 心脏)
输入 x (B, 256, 320)
↓ RMSNorm → h
├─ q, k, v = W_q h, W_k h, W_v h 各 (B,256,10,32)
├─ v ← v + DWConv_causal_k4(v) ← 配件② 短卷积(零初始化)
├─ λ_t = σ(W_λ h − 1) 逐位置逐通道 ← 配件① 数据依赖门控
├─ A = u w^T − w u^T (反对称, 低秩 r=4) u,w ∈ R^{320→2560}
├─ G = exp(A) (缩放-平方 Taylor, fp32)
│
│ 状态递归 (bf16 Hillis-Steele 并行扫描): ← 配件③
│ S_t = λ_t · G_t · S_{t-1} + k_t v_t^T S ∈ R^{10×32×32}/头
│
├─ o_t = q_t · S_t / √dh (dh=32)
└─ 输出 = x + W_o·o (W_o 零初始化, 恒等起步)
→ SwiGLU FFN
状态方程逐项解读:
| 项 | 语义 | v24 的实现 |
|---|---|---|
λ_t · S_{t-1} |
遗忘多少------内容感知,重要内容少忘 | σ(w·x_t),取代 v23 静态标量 |
G_t · S_{t-1} |
怎么旋转------通道间无损混合(正交保范数) | exp(反对称低秩矩阵),秩 4 |
k_t v_t^T |
写入什么------外积写入,v 先过短卷积带局部纹理 | k=4 因果深度卷积,零初始化残差 |
2.3 双记忆系统分工
| 子系统 | 机制 | 特性 | 类比 |
|---|---|---|---|
| softmax 循环 ×2(20 遍) | 注意力直接访问任意历史位置 | 精确、无压缩、O(L²) | 硬盘 |
| RUBIK 桥 ×1 | 固定大小状态 S 递归压缩 | 有损、O(1) 状态、内容感知遗忘 | 工作记忆 |
信息流:循环 A 粗读 → RUBIK 压缩成状态 → 循环 C 精炼。桥放在两循环之间,让压缩记忆先被"预热"的表示喂给、再被"收尾"的表示消费。
3. 实验数据
3.1 训练配置(全家族统一)
minimind PT(1.27M 序列),B16+梯度累积×2(等效 32),L=256,39,695 步,lr 4e-4 cosine(1000 步 warmup)→ 4e-5,bf16 autocast,全反传。评测 = 掩码后缀 NLL(预测 x193:256,仅非 pad 位置,val 5000 序列,60 批×16;冠军判定用 200 批×16 = 75,709 真实 token 同种子配对复评)。
3.2 主结果:hybrid2 进化链
| 版本 | rubik 桥配置 | 参数 | 步时 | 真实 token NLL |
|---|---|---|---|---|
| v22 (12k 步) | 静态λ, r=2, fp32 扫描, matrix_exp | 22.67M | --- | 2.8639 |
| v22 同预算对照 v20ctrl@12k | (全 softmax) | 22.10M | --- | 2.8449 |
| v23 | +1/√dh 读出 +零初始化 out +r=4 +全程 | 23.08M | 447ms | 2.4310 |
| v24 | +数据依赖λ_t +短卷积 v +bf16 扫描 | 23.19M | 425ms | 2.4241 |
3.3 冠军对决(39,695 步全训练)
| 模型 | 初评 | 200 批复评 | 判定 |
|---|---|---|---|
| v20 全 softmax 三段循环 | 2.4284 | 2.4349 | --- |
| v19 调优纯 5 层 | 2.4682 | --- | --- |
| v13 朴素三段循环 | 2.4922 | --- | --- |
| v24 | 2.4241 | 2.4323 | 两轮均胜(−0.0043 / −0.0026) |
幅度诚实注记:~0.003 的差距在统计噪声边缘;两轮同种子配对评测方向一致但未做逐 token 配对显著性检验。表述为"配对评测下稳定占优"而非"显著超越"。
3.4 速度基准(rubik 桥单次调用,B16 L256 H10 dh32,fwd+bwd)
| 组件/配置 | 耗时 | 说明 |
|---|---|---|
torch.matrix_exp 反向 |
4834ms | 反向比前向慢 20×------禁用 |
| 缩放-平方 Taylor exp(纯 matmul) | 1597ms | 数值一致(1e-6),3× 提速 |
| HS 扫描 (fp32) | 142ms | Hillis-Steele log 趟 |
| HS 扫描 (bf16) | 50ms | 2.8×,相对误差 4.4e-3(训练可接受) |
| chunked 扫描 (chunk=64/128, fp32) | 343/668ms | Python 循环开销,败给 HS |
整步对比:v23 447ms → v24 425ms(扫描提速被桥内其余部分稀释);对照全 softmax v20 174ms------桥的代价 2.4×。
3.5 显存
峰值 5.6GB(B16,梯度检查点包裹扫描核)。对照:v20 @B32 全反传 6.45GB。
4. 工程要点(踩坑记录)
torch.matrix_exp反向陷阱:反向比前向慢 20×(4.8s vs 0.24s @ B16)。任何旋转门控实现都应改用缩放-平方 Taylor exp(范数减半到 <0.5 后 6 项 Taylor,再 k 次平方;纯 matmul,autograd 友好)。- bf16 扫描可行但有代价:前缀积在 bf16 下相对误差 4e-3------训练噪声以下,可用;精度敏感场景需 fp32。
- 零初始化三件套:桥的 out 投影、短卷积权重、λ 偏置(−1)------让新通路全部从恒等/静态等价起步,避免随机初始化破坏已训表示。
- 1/√dh 读出缩放:状态 S 随位置累积,读出必须除 √dh 否则幅值爆炸(CEDLR-30M NaN 根因,v22 曾遗漏)。
- HS vs chunked 扫描:短序列(L≤512)下 Hillis-Steele 全并行完胜分块(125 vs 343ms);chunked 的 Python 循环 launch 开销在 63 步块内累计。
5. 归因与边界(诚实声明)
未做单项消融:v24 的三配件(λ_t/短卷积/bf16 扫描)是一起加上去的;速度归因清晰(bf16 扫描 2.8×),但质量增益中 λ_t 与短卷积各占多少未分离。后续可拆。
质量优势是边缘性的:~0.003 NLL,配对评测方向稳定但幅度小。真正的期待场景是:
- O(1) 增量推理:RUBIK 桥生成时只需携带 10×32×32 状态(softmax 部分需 KV cache)------L 越长优势越大,本实验(L=256 教师强制)未兑现
- 长上下文:状态压缩在长序列下的行为需要专门基准
训练成本 2.4×:单看质量-算力比,纯 softmax(v20)仍是更划算的选择;v24 的定位是"质量优先 + 部署端有增量推理故事"的架构。
6. 复现
bash
# 训练 (39,695 步, ~4.7h @ 425ms)
python deqlm_v24_hybrid2fast.py
# 高精度配对复评 (v20 vs v24, 200 批)
python verify_v24.py
# 速度基准 (HS/chunked/bf16)
python bench_rubik_speed.py
# 基线族
python deqlm_v20_tunedloop.py # 全 softmax 冠军 2.4284
python deqlm_v19_tuned23m.py # 调优纯堆 2.4682
python deqlm_v23_hybrid2fix.py # v24 前身 2.4310
依赖:scan.py(HS 扫描)、deqlm_v19_tuned23m.py(调优组件)、deqlm_v5_30m.py(数据加载)。checkpoint:deqlm24_pt_full.pth。
https://github.com/dfytensor/OpenAshAnyWhere/blob/master/rubikgla/