第 4 章:模型结构
minimind-3 是 Decoder-Only Transformer,配置向 Qwen3 对齐,方便导出到主流推理栈。
1Dense 主线长什么样
和现在常见的聊天模型一样:只看左边的词,预测下一个词。关键设计:
- 预标准化(Pre-Norm)+ RMSNorm
- SwiGLU 激活
- RoPE 旋转位置编码,并支持 YaRN 外推
q_heads=8、kv_heads=4(分组查询注意力)max_position_embeddings=32768,rope_theta=1e6
改结构看 model/model_minimind.py。官方结构图在仓库 images/LLM-structure.jpg。
2MoE:容量变大,激活量不变
minimind-3-moe 在同一套骨架上把前馈层换成专家混合,风格兼容 Qwen3-MoE(去掉了 shared expert)。
- 默认 4 个专家 / top-1 路由:每次只激活 1 个专家
- 总参数约 198M,激活参数仍约 64M
- 原生 PyTorch 下大约比 Dense 慢 50%(专家分桶、kernel 启停更重)
「MoE 推理更快」通常建立在融合算子上。这个项目刻意保持原生 PyTorch,所以 4 experts / top-1 是速度和容量的甜点,不是越多专家越好。
3配置对照
| 名称 | 参数 | 层数 | d_model | 备注 |
|---|---|---|---|---|
| minimind-3 | 64M | 8 | 768 | Dense 主线 |
| minimind-3-moe | 198M-A64M | 8 | 768 | 4 experts / top-1 |
| minimind2-small | 26M | 8 | 512 | 历史 |
| minimind2 | 104M | 16 | 768 | 历史 |
词表一律 6400,最大位置 32768,rope_theta=1e6。
4为什么是「不太深、不太窄」
小模型改两个旋钮就决定体型:d_model(宽度)和 n_layers(深度)。
- 宽而浅 = 矮胖子;窄而深 = 瘦高个
- MobileLLM 一类研究认为:参数量固定时,深度往往比宽度更重要
- 但
d_model < 512时,词嵌入太窄,再加深也补不回来
主线选 dim=768, n_layers=8:浅一点训得快,宽度又不会小到模式崩溃。这是工程折中,不是「理论上最优的小模型形状」。