摘要
本文报告了 FRSMASH v3.6 至 v3.7 的一次关键架构演进。在 v3.6 中,用于融合 SSM 骨干与 SlowMemory 分支的 Gated Fusion 机制在训练中坍缩至 gate=1.0,导致 SlowMemory 分支贡献完全归零。根因分析揭示:SlowMemory 输出幅度高达 SSM 骨干的 355 倍,门控机制被迫饱和以保护骨干信号。v3.7 以极简修复回应这一发现------移除门控、添加 RMSNorm、改为 DirectAdd 残差直加。三组随机种子的预训练实验表明:短上下文(seq=512)二者持平;长上下文(seq=4096)v3.7 相对 v3.6 取得 1.4% 的困惑度降低 ,且三组种子全部胜出。这一改进的本质在于:多尺度时间互补 ------快衰减的 SSM 骨干捕获高频细节,慢衰减的 SlowMemory 保留长程趋势,二者在长上下文中形成互补,而门控机制在短序列训练中习得的"gate=1"策略无法泛化至长序列。FRSMASH v3.7 以删除 2 行、新增 1 行的改动量,验证了"少即是多"的架构设计哲学。
1. 引言:从 v3.6 的门控坍缩说起
FRSMASH v3.6 采用三路并行架构:SSM 骨干 (8 层,54.4M 参数)作为主特征提取器,SlowMemory (0.2M 参数)作为慢衰减记忆模块,GLA recall(1.3M 参数)作为快速召回通路。三路信号的融合依赖一个门控机制:
fused = norm ( gate ⋅ x ash + ( 1 − gate ) ⋅ x mem + x emb ) + x recall \text{fused} = \text{norm}\big(\text{gate} \cdot x_{\text{ash}} + (1-\text{gate}) \cdot x_{\text{mem}} + x_{\text{emb}}\big) + x_{\text{recall}} fused=norm(gate⋅xash+(1−gate)⋅xmem+xemb)+xrecall
其中 gate = sigmoid ( MLP ( x ash , x mem ) ) \text{gate} = \text{sigmoid}(\text{MLP}(x_{\\text{ash}}, x_{\\text{mem}})) gate=sigmoid(MLP(xash,xmem))。
然而,训练后 gate 在所有位置、所有序列长度(512--8192)上均坍缩至 1.0000------SlowMemory 的贡献为 0%。这引发了一个根本性问题:是 SlowMemory 本身无用,还是门控机制阻碍了它的表达?
2. 根因诊断:gate=1 是"正确"的短视决策
研究团队通过系统的排除法诊断了 gate 坍缩的根因:
| 假设 | 实验 | 结果 |
|---|---|---|
| 路由坍缩 | 负载熵 2.225/2.303 | ❌ 路由均衡 |
| 状态冗余 | 范数 CV 1.127 | ❌ 状态分化 |
| 幅度失配 | x_mem 162k vs x_ash 457(355×) | ✅ 核心发现 |
| 输入源问题 | CrossFeed(x_ash→SlowMem) | 仍 gate=1 |
| 功能冗余 | 8 层骨干 vs 1 层旁路 | ✅ 骨干碾压 |
核心发现:SlowMemory 的输出幅度高达 SSM 骨干的 355 倍,无任何归一化处理。门控机制为了"保护"骨干信号不被淹没,被迫将 gate 推向饱和区(logit~1635,sigmoid 完全饱和)。
但更深层的洞见在于:gate=1 在短上下文中是"正确"的决策 ------当序列仅有 512 token 时,8 层 SSM 骨干的 4096 维状态足以完整编码全部信息,SlowMemory 确实是冗余的。然而,当序列长度扩展至 4096 时,骨干状态必须压缩信息,远处细节开始丢失------此时 SlowMemory 的慢衰减特性恰好补上了这一空缺。遗憾的是,gate 是 per-token 函数,在短序列上习得的"gate=1"策略被冻结到了所有长度,它没有"序列长度"的概念,无法自适应地重新打开 SlowMemory。
3. v3.7:DirectAdd Fusion------删除 2 行,新增 1 行
v3.7 的修复极简到令人惊讶:
删除:
python
gate = sigmoid(MLP([x_ash, x_mem]))
fused = norm(gate * x_ash + (1 - gate) * x_mem + x_emb) + x_recall
新增/修改:
python
x_mem = mem_norm(mem_proj(slow_cell(x_emb))) # 加 RMSNorm
fused = norm(x_ash + x_mem + x_emb) + x_recall # 直接相加,无 gate
参数变化:-0.13M(删除 fusion_gate)+ 0.0005M(新增 RMSNorm)≈ 几乎不变 。改动量:删除 2 行,新增 1 行。
这一设计的核心逻辑是:
- RMSNorm 修复幅度:将 SlowMemory 的输出归一化,消除 355× 的幅度失配;
- 删除门控:强制所有分支在任何长度下均有贡献------短上下文下额外的信号只是噪声(无害),长上下文下则形成关键互补。
4. 实验验证:优势随上下文长度增长
研究者在 minimind 预训练设置 (80M 参数,d=512,L=8)下,使用 3 组随机种子 对 v3.6 与 v3.7 进行了系统对比:
| 序列长度 | v3.6(gate)均值±std | v3.7(DirectAdd)均值±std | 提升 | 3 种子胜场 |
|---|---|---|---|---|
| 512 | 37.18 ± 0.13 | 37.20 ± 0.12 | -0.05%(噪声) | 0/3 |
| 2048 | 103.01 ± 1.13 | 102.21 ± 1.23 | -0.8% | 2/3 |
| 4096 | 79.97 ± 1.53 | 78.89 ± 1.41 | -1.4% | 3/3 |
关键观察:
- 短上下文(512):v3.7 ≈ v3.6,SlowMemory 冗余,加不加都一样;
- 中上下文(2048):v3.7 开始显现优势,困惑度降低 0.8%;
- 长上下文(4096) :v3.7 全面胜出,三组种子全部优于 v3.6,困惑度降低 1.4%。
优势随上下文长度单调增长------这正是多尺度时间互补假说的最强证据。
5. 原理:多尺度时间互补
5.1 两种递归的遗忘曲线
| 机制 | 遗忘门 | 衰减率 | 时间频率 |
|---|---|---|---|
| SSM 骨干(多槽) | sigmoid 门控,多槽多速率 | 整体偏快 | 高频(近期细节) |
| SlowMemory(线性) | A=sigmoid,bias=2(A≈0.88) | 慢 | 低频(长程趋势) |
SSM 骨干的多槽门控机制使其能够以多速率遗忘信息,整体偏好快速衰减,擅长捕获中近程的高频细节。而 SlowMemory 采用线性递归, A ≈ 0.88 A \approx 0.88 A≈0.88,呈 EMA-like 慢衰减,天然适合保留长程低频趋势。
5.2 短上下文 vs 长上下文
- 短序列(seq=512):骨干状态 4096 维远大于序列长度,可以完整编码全部信息,SlowMemory 的高层趋势信息与骨干的低层细节信息高度冗余------此时 gate=1 是最优策略;
- 长序列(seq=4096) :骨干状态被序列长度所限,必须进行信息压缩,远处细节不可避免地丢失。SlowMemory 的慢衰减( A ≈ 0.88 A \approx 0.88 A≈0.88,半衰期约 5 token,且因 A A A 为 input-dependent 可更慢)恰好保留了骨干丢弃的长程趋势------二者形成真正的互补。
DirectAdd 的本质:去掉 gate,强制 SlowMemory 在所有长度上均有贡献。短上下文下,多出来的信号只是不影响性能的噪声;长上下文下,它成为骨干丢失信息的关键补充。
6. 消融实验:验证设计的必要性
6.1 砍掉 SlowMemory(NoSlow)
| 序列 | v3.6(gate=1,SlowMem=0%) | NoSlow(无 SlowMem) |
|---|---|---|
| 512 | 36.71 | 37.25(噪声) |
| 4096 | 123.77 | 124.33(噪声) |
确认:v3.6 的 SlowMemory 确实贡献为 0%,砍掉后困惑度几乎不变。
6.2 放大 GLA recall(d_h 64→128,4× 状态)
| d_h | seq512 ppl | seq4096 ppl |
|---|---|---|
| 64(原版) | 37.28 | 78.82 |
| 128(4×) | 36.92(-1.0%) | 79.91(+1.4%) |
放大 recall 通路未带来可靠的长上下文提升,说明问题不在 recall 容量。
6.3 其他尝试均未超越 DirectAdd
- State-MoE(10× SlowMemory 状态):dense 版全强度下 seq512 无效(-1.8%);
- GRU 逻辑状态 (替代线性 SlowMemory):ppl 37.20 ± 0.48,略差于 vanilla,且 3.5× 更慢;
- TriCross 串联 (SSM→SlowMem→GLA 串联):ppl 39.97 ± 0.53,显著更差 -7.5%(信息逐级衰减)。
消融实验一致指向:DirectAdd 是长上下文场景下的最优融合方式。
7. 结论与启示
FRSMASH v3.7 的故事揭示了一个反直觉的架构洞见:门控机制在短上下文训练中习得的"最优策略",在长上下文中恰恰成为性能瓶颈。模型在短序列上正确地绕过了冗余的 SlowMemory,却也因此丧失了在长序列上利用其互补信息的能力------而模型本身并不具备"序列长度"的概念来调整这一策略。
v3.7 的修复以 删除 2 行、新增 1 行 的极简改动,实现了:
- 短上下文性能持平(证明改动无害);
- 长上下文困惑度持续降低(seq4096 达 -1.4%,三组种子全胜);
- 零参数增长(-0.13M + 0.0005M ≈ 不变)。
更广泛地看,这一工作提醒我们:在评估架构设计时,必须警惕训练分布与推理分布之间的"长度鸿沟" 。在短序列上表现良好的归纳偏置,可能在长序列上成为桎梏。FRSMASH v3.7 给出的答案是:当你不确定门控该开该关时,也许直接相加就是最好的门控。
项目地址 :github.com/dfytensor/frsmash3.7
核心文件:
PAPER.md--- 完整论文src/frsmash_directadd.py--- v3.7 DirectAdd 架构实现experiments/--- 训练/评测/消融脚本
环境依赖 :PyTorch 2.x + CUDA,fla(flash-linear-attention),jieba