实验课:4 个专家在我们自己的模型上抢活吗?
这一课的问题:第 2 课在浏览器里看到的「塌缩」,在我们自己从 0 训练的语言模型上也会发生吗?三种做法各把负载拉到多平、loss 差多少?
这一课先不碰:专家并行(我们只有一张卡);长上下文续训(未排期,见章首页决策 3)。
实验设置
这一课不用贯穿例句,原因是:项目的语料是《三国演义》、词表只有 2,048,要看的也是整批 token 的负载统计,不是一句话的路由。
项目基线(4 层、d = 256、8 头、RoPE、Pre-LN RMSNorm、SwiGLU 中间维 688、词表 2,048,在《三国演义》上训 400 步)不动,只把每层的 FFN 换成 MoE:
- 每层 4 个专家,每个 token 选 2 个;每个专家和原来的稠密 FFN 一样宽(688)。所以 MoE 的总参数和激活参数都比稠密大——这是比较口径,结论里必须带上。
- 三组均衡方式:不做均衡;辅助损失(Switch 式,系数 0.01);偏置更新(DeepSeek-V3 式,γ = 0.001:偏置只进「选谁」,每步过载 −γ、欠载 +γ)。
- 负载的口径:每层每个专家分到的「名额」占比,每层 4 个数加起来是 1,完全均衡 = 0.25。每个 token 有 2 个名额、不会把两个都给同一个专家,所以单个专家最多占 0.5。
先写预测(写在纸上,再往下看):① 不做均衡时,最忙的专家会不会顶到 0.5?最闲的会不会接近 0?② 三组的 val loss 谁最低,差距会不会比「同一配置重跑一次」的波动还大?③ 偏置每步只挪 0.001,它多久能把负载拉开?
负载随训练怎么变
试三件事:① 看「不做均衡」那一行的四格:每一层都有专家长时间贴着 0.5 那条实线,另一些在 0 附近——和第 2 课微训练里的塌缩是同一种现象;② 看三组的前几十步:三组一开始都会冲到天花板,辅助损失那一组最先被拉回来,偏置组要攒几十步(下面的读图段落按数据算出了前 50 步里各组触顶的记录数);③ 看最后 100 步:「平均偏离 0.25」偏置组最小、不做均衡最大。
对照表
读这张表有三件事要一起说:
- 负载:辅助损失与偏置都把负载拉平了,偏置组最平;不做均衡时专家明显分化。
- val loss:四组的差距要和「同一配置重跑」的波动比——C14 在同一配置上重跑了 5 次,读图段落把极差放在旁边。差距不超过重跑噪声,就只能说「没看到质量差别」,不能说哪种更好 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条本项目实测,单种子、400 步、4 个专家;不能外推到大模型。 出处待补 。
- 口径:MoE 组的总参数是稠密的 2.7 倍、激活参数 1.57 倍(表里可以算),「MoE 比稠密好」在这里连「同算力」都谈不上。
和浏览器里的微训练对照
同一种现象,在浏览器里用一个更小的任务再看一遍(教学构造的数据,真梯度下降):
两边的共同点:不管它就会偏;两种均衡都能拉平。不同点也要说清:浏览器里是 top-1、线性专家、人造的聚类任务,项目里是 top-2、SwiGLU 专家、真实文本——偏的程度和均衡的收益都和设置有关,两边的数字不能互相替代。
项目推进:这一章要拍板的
对应 04-实践项目/MILESTONES.md「C11 MoE 与长上下文」(完整清单在章首页):
- 比较口径:在报告里同时写出总参数、激活参数(和训练 FLOPs),再谈 val loss。
- 均衡方式:辅助损失还是偏置更新?用负载曲线 + val loss + 重跑噪声三样一起回答。
- 验收判据的修订:原判据「某专家负载 > 0.5」在 top-2 计数口径下不可能成立,改为「是否触顶(≥ 0.49)、是否有专家长期低于 0.05、最后 100 步平均偏离 0.25」。
踩过的坑(项目实测):最初按专家把 token 分发出去再算,每一步的张量形状都不一样,MPS 每步重新编译计算图,4 专家模型 60 步用了 107 秒;改成「每个专家都算、再乘选择掩码」的固定形状实现后,同样 60 步 6.6 秒(补齐到 256 倍数的分发版 14.9 秒)。两种实现的前向与梯度由测试核对一致——小规模实验里,固定形状比「只算选中的专家」更快;到了大规模,省下来的计算才值得分发的开销。
① 更多参数,不要更多算力(MoE)
- 解决了结构最简单:所有参数对每个 token 都生效。卡在锚点 Qwen3.8-27B 每 token 前向约 51.2 GFLOPs;同家族 2.4T 规模若是 dense,约 4.84 TFLOPs(94 倍)。
- 解决了每个 token 只算 top-k 个专家:Qwen3.8-2.4T-A95B 每 token 约 186.5 GFLOPs,是同参数 dense 的 26 分之一。卡在路由会自我强化地偏心:8 个专家全挤到 1 个时,Switch 负载损失从 0.01 升到 0.08;所有专家的权重仍要常驻显存。
- 解决了把「均衡」写进 loss,路由器被梯度推向均匀。卡在α 难调:太小拉不平,太大干扰主 loss(Switch 在 10⁻¹ 到 10⁻⁵ 之间扫;Wang 2024 的出发点)。
- 解决了偏置只改「选谁」,不进门控、不产生干扰梯度;DeepSeek-V3 前 14.3T token 用 γ = 0.001,最后 500B 设为 0。卡在固定步长在近千个专家时太慢或来回震荡(Kimi K3 报告)→ Quantile Balancing;而且统计范围(整批 vs 单条序列)比「有没有 loss」更要紧。
- 解决了同参数同计算,16 选 2 的 120 种组合变成 64 选 8 的 4,426,165,368 种;共享专家装公共知识。卡在显存账不减:Qwen3.8-2.4T 路由专家占主干参数 97.98%,BF16 权重 4.89 TB。
- 解决了Qwen3.8-2.4T 512 选 10 + 1 共享;K3 896 选 16 + LatentMoE + Quantile Balancing;V4.1 图文两套偏置。卡在共享专家 0、1、2 个都有人用(Qwen3 一个不设),稀疏度从 32 到 64 都有(GLM-5.3 与 V3 为 32、GLM-5.3-Flash 36、K2 48、Qwen3.8 51、K3 56、V4.1-Flash 64)——都是实验选择。
② 长文本:KV 与计算不再随长度等比例涨
- 解决了每个 token 都能精确回看任意一个前文 token。卡在KV ∝ 长度:锚点若 64 层全是全注意力,262,144 token 时 64 GiB。
- 解决了去掉 softmax,求和提前累加成一个固定大小的状态,与长度无关。卡在只加不减:同一个键写两次,读回的是两个值之和;状态最多装 d 对互不干扰的键值(C0 岔路)。
- 解决了写前先擦(delta)、每步衰减(门):锚点 48 层状态共 144 MiB(FP32)、与长度无关;KV 降到四分之一(262,144 时 16 GiB 对 64 GiB)。卡在剩下四分之一的全注意力层仍按长度涨;容量有限,3:1 是实验选出来的。
- 解决了每通道一个衰减;g_min = −5 让 16 token 块内累积不低于 −80,e⁸⁰ ≈ 5.5 × 10³⁴ 在 BF16 范围内(上限约 3.4 × 10³⁸),慢路径删除。卡在MiniMax M1 用线性混合、M2 又退回全注意力:大规模下多跳推理缺陷、训练受访存限制、低精度与缓存难题(官方博客)。
- 解决了lightning indexer 每个 query 只挑 top-2048 条做核心注意力。卡在省计算不省内存:KV 一条不少,每 token 48,068 B;indexer 本身仍要扫全部前文。
- 解决了V3.2 每 token 48,068 B → V4-Flash 3,514 B → V4.1-Flash 890 B(1M 时 0.87 GiB)。卡在是近似:V4.1 自陈 Bounded Replay「数学上不等价」、选择误差可能在未测过的边界情况退化。
③ 训练 4K,使用 128K
- 解决了训练与使用同一个长度,不需要任何折算。卡在注意力项随长度涨:Qwen3-32B(64 层全注意力)在 131,072 时注意力项是 6N 的 215%;早期长序列还带来梯度方差极端值(Li 2021)。
- 解决了DeepSeek-V3 的 14.8T token 全在 4K,之后两段各 1,000 步扩到 32K、128K,只占全部训练 token 的 0.84%;Llama 3 405B 六段、约 800B token。卡在长序列阶段的数据要专门配(长度上采样、领域均衡、合成跨全文任务)。
- 解决了K3:8K → 64K → 256K → 1M(NoPE 也照走课程);V4.1 注意力从头就是压缩稀疏的,直接从 64K 起训。卡在各家配方大多只公开阶段、不公开每段 token 数,无法横向比较成本。
- 解决了每个位置多学一个更远的目标;推理时当草稿,接受率 α 时每步期望产出 1 + α 个 token。卡在DeepSeek-V3 第 2 个 token 接受率 85%–90%,实测 1.8 倍 TPS;V4.1 预训练干脆去掉 MTP,没有公开消融。
一句话
同一模型只改均衡方式:先写预测,再看负载曲线和 loss,连同「总参数与激活参数都不同」这个口径和重跑噪声一起报告。
下一个缺口
模型会续写、能读长文,可它只会续写——怎么让它听话? → C12 后训练:从续写到听话、推理、做事