 进展记录:从可组合架构到 scale bug 修复)
1. 项目是什么Snowflake MoE 是一个可组合的稀疏 MoE 架构。与标准 MoE 维护一个固定专家池不同Snowflake MoE 用少量基础的「细胞器」organelle加上可学习的「忆点」memory通过组合的方式在运行时生成临时专家细胞器提供可复用的计算原语忆点负责按输入检索并读出领域相关信息二者组合出远超参数量的有效表达能力。项目由个人独立研究推进全部代码与实验脚本开源。这个设计想回答的问题很具体稀疏 MoE 能不能不靠「堆专家」也能获得足够的容量同时保留两条标准架构没有的能力——一是往模型里增量加入新领域知识终身学习二是按需擦除某些记忆安全擦除三是把已经学会的组件组合到未见过的输入上组合泛化。围绕这三条能力线我们做了一系列有数据支撑的验证也踩了一个影响深远的参数 bug。这篇博客记录截至 2026-10-05 的真实进展包括成果、负结果、根因修复与工程经验。2. 已验证的成果目前有五个有数据支撑的正向结果。1可导容量惩罚优于 Token Dropping。在合成数据12 epoch上可导容量惩罚differentiable capacity penalty的验证准确率为 0.8955Token Dropping 只有 0.7383。Token Dropping 通过硬丢弃 token 强制负载均衡代价是约 79% 的训练 token 被丢弃、信息大量损失可导容量惩罚把均衡约束放进损失项不丢 token精度显著更高。它唯一的劣势是负载均衡不如硬丢弃那么极致CV 0.132 vs 1.4 量级但以精度为代价的均衡不可取。这是项目里最强的正结果之一也是后续论文的主线方向。2单级 CellMoE 与同参数 Fixed MoE 打平。在 TinyStories 上CellMoE 的 PPL 为 10.0157同参数量的 Fixed FFN MoE 为 10.0152差异在噪声范围内。这个结果本身不算突破但意义在于可组合架构在同等参数下没有劣化为后续在大规模上体现组合优势提供了基线。参数效率曲线进一步显示在 0.5M 到 1.8M 区间两种架构的 PPL 都稳定收敛在 10.01–10.02说明当前规模下模型还没有真正「吃满」容量。3终身学习 v4InputAwareGate显著改善旧域退化。把全局标量门控换成输入相关门控投影零初始化 pooled mean softmax后旧领域TinyStories退化从 v3 的 0.78 降到 -0.57不仅没有退化PPL 反而略降新领域圣经 KJV困惑度下降 21.6%跨过 20% 的验收线。这一改动证明门控必须能按输入区分旧/新领域全局标量做不到。剩余的未达标项是新忆点激活率口径当前统计天然恒为 100%需要改为门控硬判定口径属于统计口径而非门控失效。4单卡算力被有效榨干。在单张 DCU 上通过 4 路并行 大 batch 把 GPU 利用率从约 30% 拉到 100%CPU 使用率降到约 10%GPU 温度稳定在 56°C。多路并行共享单卡且互不 OOM说明小参数模型的主要瓶颈是计算密度不足而非显存。这也为后续多路并行跑参数效率曲线铺了路。5参数压缩空间存在。把模型从 1.8M 参数压到 0.5M两种架构的 PPL 差异都小于 0.03%CellMoE 0.5M10.0172 vs 1.8M10.0160Fixed 0.5M10.0142 vs 1.8M10.0141。当前规模下参数冗余明显模型还有很大的压缩空间这对低资源部署是利好。3. 发现的负结果负结果同样重要这里如实记录四个未达标的实验。1终身学习 v3/v5旧领域退化 1.8。在 v3标量分组门控与 v5 实验中加入新忆点后旧领域 PPL 稳定退化约 1.8远超 0.3 的验收线。原因有两层一是标量门控无法按输入区分旧/新领域二是当时叠加了另一个 bug见第 4 节 scale bug新忆点输出被放大后直接淹没旧领域。v4 用 InputAwareGate 修复了第一层scale bug 到更晚才被定位。所以 v3/v5 的失败现在被判定为「根因未清理前的假失败」需要 scale1.0 下重跑验证而非简单采信旧结论。2安全擦除未达标。100% 擦除 memory_value 后 PPL 为 22.83低于 30 的验收线。也就是说擦除记忆槽并不能让模型「忘记」到可接受的程度。机制探索进一步表明细胞器本身也承载了与记忆键不可分离的知识仅解耦 memory_value 不足以实现干净的安全擦除需要更彻底的架构级解耦例如擦除时把 assembly 一并归零或引入独立的可擦除记忆总线。这是安全方向最重要的开放性挑战。3RL 动态治理在合成数据上失效。用可学习元控制器REINFORCE动态调节容量惩罚、稀疏度等超参在合成数据上连续三次限制触发val_acc 都停在约 0.8955 附近无法突破。根因是数据规模太小d16、4096 样本路由已固化主模型精度上限就在那里同时奖励噪声std≈0.24淹没了 CV 惩罚信号。这是一个「物理失效下限」不是调参能解决的。转向 MNIST 后控制器能观察到稀疏度动态调整但统计上仍不显著见下一条。4MNIST 上 5 seed 无显著差异。在 MNISTPCA 64 维上跑 5 个 seedlearned 控制器 vs fixed vs rules 三种模式的准确率差异统计检验 p 0.05无法断言可学习治理优于规则治理。均值上 learned0.9513略高于 rules0.9446但差异不显著。这类「均值有差、统计不显著」的结果我们按无显著差异如实记录不写进成果。4. 关键发现scale bug上面这些「失败」里最值得写的是一个参数 bug。memory_read_scale 默认值是 25.0。训练脚本里忆点读取的缩放系数默认被设为 25.0意味着忆点输出被放大 25 倍后再进入最终输出。后果是忆点输出主导了整个模型输出梯度几乎全部被吸进 memory_value细胞器几乎得不到梯度。这解释了为什么终身学习 v2-v5 的旧领域稳定退化 1.8——新忆点 val 被 25 倍放大后直接淹没旧忆点输出也解释了为什么安全擦除 100% 后 PPL 只有 22.83——模型已学成「只靠忆点输出」而擦除又擦不掉细胞器里的知识。更隐蔽的是构造链路FastHierLM → FastHierCellMoE → FastCellMoE没有显式透传这个参数全部落到子类默认值 25.0所以改上游默认值不影响下游排查时容易被误判为机制失败。这也是把它单独写成一段的原因一个藏在默认值里的系数能让一整批机制实验集体失败而每一个失败单独看都像「架构不行」。修复方式很简单统一把 memory_read_scale 改为 1.0与基线训练一致。当前正在 PAI-DSWA10上用 scale1.0 重跑四个关键实验阶段一、终身学习 v6、安全擦除 v2、组合泛化 Fixed 对比。这些实验的结果尚未出来本文不预测。如果 scale bug 确实是共同根因预期旧域退化会显著下降、擦除敏感度上升如果不是我们会把新数据如实更新到本文。5. 工程与部署经验TDD 红队审查。项目维持测试先行新增模块先写测试当前测试 8/8 全绿每次合入前做红队审查重点检查门控接线、超参透传、梯度流向等容易「静默出错」的环节。这次 scale bug 能定位部分要归功于对「超参默认值是否全链路一致」的追查——先 grep 所有 memory_read_scale25.0 的位置再确认构造链路的每一层都透传而不是只改一处默认值。从曙光 DCU 迁移到 PAI-DSW。项目先在曙光智算 DCUDTK 环境上运行之后迁移到阿里云 PAI-DSW标准 CUDAA10。迁移暴露了一类典型问题非标准加速卡生态DTK的算子行为与 CUDA 有差异Gumbel-Softmax 之类的随机路径需要单独验证而 PAI-DSW 是标准 CUDA 环境代码几乎不用改成为重跑翻盘实验的首选平台。踩坑记录。DTK 生态适配DCU 上部分算子行为与 CUDA 不同需要逐算子验证通信后端用 rccl、设备可见性用 HIP_VISIBLE_DEVICES与 CUDA 习惯不同SSH 443 端口本地 22 端口被墙改用 ssh.github.com:443 自定义 SSH config 才完成代码推送hf-mirror 下载HuggingFace 直连不稳定数据与依赖走镜像源解决。6. 下一步翻盘实验等待 PAI-DSW 上用 scale1.0 重跑的四个实验阶段一、终身学习 v6、安全擦除 v2、组合泛化 Fixed 对比结果出来后更新本文与报告。规模扩展把模型扩到 100MB 数据 10M 参数验证可组合架构在大规模下的参数效率与组合优势。论文投稿以「可导容量惩罚」为主线整理实验目标投稿。注本文由作者独立研究与撰写文字整理过程中使用了 AI 辅助实验数据与结论均来自作者实际运行。