MiniMind 新手教程

第 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-364M8768Dense 主线
minimind-3-moe198M-A64M87684 experts / top-1
minimind2-small26M8512历史
minimind2104M16768历史

词表一律 6400,最大位置 32768,rope_theta=1e6。

4为什么是「不太深、不太窄」

小模型改两个旋钮就决定体型:d_model(宽度)和 n_layers(深度)。

  • 宽而浅 = 矮胖子;窄而深 = 瘦高个
  • MobileLLM 一类研究认为:参数量固定时,深度往往比宽度更重要
  • 但 d_model < 512 时,词嵌入太窄,再加深也补不回来

主线选 dim=768, n_layers=8:浅一点训得快,宽度又不会小到模式崩溃。这是工程折中,不是「理论上最优的小模型形状」。